CPSK_Skin.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:16k
源码类别:

VC书籍

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. #include "stdafx.h"
  3. #include "globals.h"
  4. #include "resource.h"
  5. #include "CompositeFile.h"
  6. void CPSK_DestroySkin(CPs_Skin* pSkin);
  7. CPs_Skin* CPSK_LoadSkin(CP_COMPOSITEFILE hComposite, const char* pcSkinFile, const unsigned int iFileSize);
  8. CPs_Skin* glb_pSkin = NULL;
  9. ////////////////////////////////////////////////////////////////////////////////
  10. //
  11. //
  12. //
  13. void CPSK_Initialise()
  14. {
  15.     char* pcSkinFile;
  16.     unsigned int iFileSize;
  17.     CP_COMPOSITEFILE hComposite;
  18.     hComposite = CF_Create_FromResource(NULL, IDR_DEFAULTSKIN, "SKIN");
  19.     //hComposite = CF_Create_FromFile("P:\Skin\Default.CPSkin");
  20.     CF_GetSubFile(hComposite, "Skin.def", &pcSkinFile, &iFileSize);
  21.     glb_pSkin = CPSK_LoadSkin(hComposite, pcSkinFile, iFileSize);
  22.     free(pcSkinFile);
  23.     CF_Destroy(hComposite);
  24. }
  25. //
  26. //
  27. //
  28. void CPSK_Uninitialise()
  29. {
  30.     if(glb_pSkin)
  31.         CPSK_DestroySkin(glb_pSkin);
  32.     glb_pSkin = NULL;
  33. }
  34. //
  35. //
  36. //
  37. void CPSK_DestroySkin(CPs_Skin* pSkin)
  38. {
  39.     if(pSkin->mpl_hfFont)
  40.         DeleteObject(pSkin->mpl_hfFont);
  41.     CPIG_DestroyImage(pSkin->mpl_pBackground);
  42.     CPIG_DestroyImage(pSkin->mpl_pListBackground);
  43.     CPIG_DestroyImage(pSkin->mpl_pListHeader_Up);
  44.     CPIG_DestroyImage(pSkin->mpl_pListHeader_Down);
  45.     CPIG_DestroyImage(pSkin->mpl_pHScrollBar_Bk);
  46.     CPIG_DestroyImage(pSkin->mpl_pHScrollBar_TrackUp);
  47.     CPIG_DestroyImage(pSkin->mpl_pHScrollBar_TrackDn);
  48.     CPIG_DestroyImage_WithState(pSkin->mpl_pHScrollBar_Left);
  49.     CPIG_DestroyImage_WithState(pSkin->mpl_pHScrollBar_Right);
  50.     CPIG_DestroyImage(pSkin->mpl_pVScrollBar_Bk);
  51.     CPIG_DestroyImage(pSkin->mpl_pVScrollBar_TrackUp);
  52.     CPIG_DestroyImage(pSkin->mpl_pVScrollBar_TrackDn);
  53.     CPIG_DestroyImage_WithState(pSkin->mpl_pVScrollBar_Up);
  54.     CPIG_DestroyImage_WithState(pSkin->mpl_pVScrollBar_Down);
  55.     CPIG_DestroyImage(pSkin->mpl_pSelection);
  56.     // Remove the command targets
  57.     {
  58.         CPs_CommandTarget* pCT_Cursor = pSkin->mpl_pCommandTargets;
  59.         CPs_CommandTarget* pCT_Cursor_Next;
  60.         while(pCT_Cursor)
  61.         {
  62.             CPIG_DestroyImage_WithState(pCT_Cursor->m_pStateImage);
  63.             pCT_Cursor_Next = (CPs_CommandTarget*)pCT_Cursor->m_pNext;
  64.             free(pCT_Cursor);
  65.             pCT_Cursor = pCT_Cursor_Next;
  66.         }
  67.     }
  68.     // Remove the indicators
  69.     {
  70.         CPs_Indicator* pCT_Cursor = pSkin->mpl_pIndicators;
  71.         CPs_Indicator* pCT_Cursor_Next;
  72.         while(pCT_Cursor)
  73.         {
  74.             pCT_Cursor_Next = (CPs_Indicator*)pCT_Cursor->m_pNext;
  75.             free(pCT_Cursor->m_pcName);
  76.             free(pCT_Cursor);
  77.             pCT_Cursor = pCT_Cursor_Next;
  78.         }
  79.     }
  80.     free(pSkin);
  81. }
  82. //
  83. //
  84. //
  85. COLORREF CPSK_DecodeColour(const char* pcColour)
  86. {
  87.     DWORD dwColour;
  88.     if(sscanf(pcColour, "#%x", &dwColour) == 1)
  89.     {
  90.         // Swap red and blue bytes
  91.         return ((dwColour&0x0000FF)<<16) | (dwColour&0x00FF00) | ((dwColour&0xFF0000)>>16);
  92.     }
  93.     return 0;
  94. }
  95. //
  96. //
  97. //
  98. void CPSK_ReadSkinCommand_Define(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcParams)
  99. {
  100.     char cSymbol[32];
  101.     char cValue[128];
  102.     // Decode params
  103.     if(sscanf(pcParams, " %32[A-Za-z_] = "%128[^"]"", cSymbol, cValue) != 2)
  104.         return;
  105.     if(stricmp(cSymbol, "CoolSkinVersion") == 0)
  106.     {
  107.         sscanf(cValue, " %d ", &pSkin->m_dwSkinVersion);
  108.     }
  109.     else if(stricmp(cSymbol, "Transparent_MaskColour") == 0)
  110.     {
  111.         pSkin->m_clrTransparent = CPSK_DecodeColour(cValue);
  112.     }
  113.     else if(stricmp(cSymbol, "Playlist_Font") == 0)
  114.     {
  115.         // Clean up old object if the skindef has more than one font
  116.         if(pSkin->mpl_hfFont)
  117.             DeleteObject(pSkin->mpl_hfFont);
  118.         pSkin->mpl_hfFont = CreateFont(-12, 0, 0, 0, FW_NORMAL,
  119.                                        FALSE, FALSE, FALSE,
  120.                                        ANSI_CHARSET,
  121.                                        OUT_TT_PRECIS,
  122.                                        CLIP_DEFAULT_PRECIS,
  123.                                        ANTIALIASED_QUALITY,
  124.                                        DEFAULT_PITCH | FF_SWISS,
  125.                                        cValue);
  126.     }
  127.     else if(stricmp(cSymbol, "Playlist_Colour_Text") == 0)
  128.     {
  129.         pSkin->mpl_ListTextColour = CPSK_DecodeColour(cValue);
  130.     }
  131.     else if(stricmp(cSymbol, "Playlist_Colour_Selected") == 0)
  132.     {
  133.         pSkin->mpl_ListTextColour_Selected = CPSK_DecodeColour(cValue);
  134.     }
  135.     else if(stricmp(cSymbol, "Playlist_Colour_Playing") == 0)
  136.     {
  137.         pSkin->mpl_ListTextColour_HotItem = CPSK_DecodeColour(cValue);
  138.     }
  139.     else if(stricmp(cSymbol, "Playlist_Colour_HeaderText") == 0)
  140.     {
  141.         pSkin->mpl_ListHeaderColour = CPSK_DecodeColour(cValue);
  142.     }
  143.     else if(stricmp(cSymbol, "Playlist_ListBorders") == 0)
  144.     {
  145.         if(sscanf(cValue, " %d , %d ,  %d , %d ",
  146.                   &pSkin->mpl_rList_Border.left,
  147.                   &pSkin->mpl_rList_Border.right,
  148.                   &pSkin->mpl_rList_Border.top,
  149.                   &pSkin->mpl_rList_Border.bottom) != 4)
  150.         {
  151.             SetRect(&pSkin->mpl_rList_Border, 0, 0, 0, 0);
  152.         }
  153.     }
  154.     else if(stricmp(cSymbol, "Playlist_MinSize") == 0)
  155.     {
  156.         if(sscanf(cValue, " %d , %d ",
  157.                   &pSkin->mpl_szMinWindow.cx,
  158.                   &pSkin->mpl_szMinWindow.cy) != 2)
  159.         {
  160.             pSkin->mpl_szMinWindow.cx = 400;
  161.             pSkin->mpl_szMinWindow.cy = 200;
  162.         }
  163.     }
  164. }
  165. //
  166. //
  167. //
  168. void CPSK_ReadSkinCommand_TiledDraw(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcParams)
  169. {
  170.     char cElement[32];
  171.     char cFile[128];
  172.     RECT rTileBorders;
  173.     CPs_Image** ppImage;
  174.     RECT* pRect;
  175.     // Decode params
  176.     if(sscanf(pcParams, " %32[A-Za-z_-] , "%128[^"]" , %d , %d , %d , %d ",
  177.               cElement, cFile,
  178.               &rTileBorders.left, &rTileBorders.top, &rTileBorders.right, &rTileBorders.bottom) != 6)
  179.     {
  180.         return;
  181.     }
  182.     // Decide which data members are affected
  183.     if(stricmp(cElement, "Playlist_Background") == 0)
  184.     {
  185.         pRect = &pSkin->mpl_rBackground_SourceTile;
  186.         ppImage = &pSkin->mpl_pBackground;
  187.     }
  188.     else if(stricmp(cElement, "Playlist_ListBackground") == 0)
  189.     {
  190.         pRect = &pSkin->mpl_rListBackground_SourceTile;
  191.         ppImage = &pSkin->mpl_pListBackground;
  192.     }
  193.     else if(stricmp(cElement, "Playlist_Header_up") == 0)
  194.     {
  195.         pRect = &pSkin->mpl_rListHeader_SourceTile;
  196.         ppImage = &pSkin->mpl_pListHeader_Up;
  197.     }
  198.     else if(stricmp(cElement, "Playlist_Header_dn") == 0)
  199.     {
  200.         pRect = &pSkin->mpl_rListHeader_SourceTile;
  201.         ppImage = &pSkin->mpl_pListHeader_Down;
  202.     }
  203.     else if(stricmp(cElement, "Playlist_Selection") == 0)
  204.     {
  205.         pRect = &pSkin->mpl_rSelection_Tile;
  206.         ppImage = &pSkin->mpl_pSelection;
  207.     }
  208.     else if(stricmp(cElement, "Playlist_Focus") == 0)
  209.     {
  210.         pRect = &pSkin->mpl_rFocus_Tile;
  211.         ppImage = &pSkin->mpl_pFocus;
  212.     }
  213.     else if(stricmp(cElement, "HScrollBar_Background") == 0)
  214.     {
  215.         pRect = &pSkin->mpl_rHScrollBar_Bk_Tile;
  216.         ppImage = &pSkin->mpl_pHScrollBar_Bk;
  217.     }
  218.     else if(stricmp(cElement, "HScrollBar_Tracker_up") == 0)
  219.     {
  220.         pRect = &pSkin->mpl_rHScrollBar_Track_Tile;
  221.         ppImage = &pSkin->mpl_pHScrollBar_TrackUp;
  222.     }
  223.     else if(stricmp(cElement, "HScrollBar_Tracker_dn") == 0)
  224.     {
  225.         pRect = &pSkin->mpl_rHScrollBar_Track_Tile;
  226.         ppImage = &pSkin->mpl_pHScrollBar_TrackDn;
  227.     }
  228.     else if(stricmp(cElement, "VScrollBar_Background") == 0)
  229.     {
  230.         pRect = &pSkin->mpl_rVScrollBar_Bk_Tile;
  231.         ppImage = &pSkin->mpl_pVScrollBar_Bk;
  232.     }
  233.     else if(stricmp(cElement, "VScrollBar_Tracker_up") == 0)
  234.     {
  235.         pRect = &pSkin->mpl_rVScrollBar_Track_Tile;
  236.         ppImage = &pSkin->mpl_pVScrollBar_TrackUp;
  237.     }
  238.     else if(stricmp(cElement, "VScrollBar_Tracker_dn") == 0)
  239.     {
  240.         pRect = &pSkin->mpl_rVScrollBar_Track_Tile;
  241.         ppImage = &pSkin->mpl_pVScrollBar_TrackDn;
  242.     }
  243.     else
  244.         return;
  245.     // Set data members
  246.     if(*ppImage)
  247.         CPIG_DestroyImage(*ppImage);
  248.     *ppImage = CPIG_CreateImage_FromSubFile(hComposite, cFile);
  249.     *pRect = rTileBorders;
  250.     if(*ppImage)
  251.     {
  252.         pRect->right = (*ppImage)->m_szSize.cx - rTileBorders.right;
  253.         pRect->bottom = (*ppImage)->m_szSize.cy - rTileBorders.bottom;
  254.     }
  255. }
  256. //
  257. //
  258. //
  259. void CPSK_ReadSkinCommand_ButtonDraw(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcParams)
  260. {
  261.     char cElement[32];
  262.     char cStates[12];
  263.     char cFile[128];
  264.     CPs_Image_WithState** ppImage;
  265.     int iNumStates;
  266.     // Decode params
  267.     if(sscanf(pcParams, " %32[A-Za-z_-] , "%128[^"]" , %12s ",
  268.               cElement, cFile, cStates) != 3)
  269.     {
  270.         return;
  271.     }
  272.     // Setup number of states
  273.     if(stricmp(cStates, "2State") == 0)
  274.         iNumStates = 2;
  275.     else
  276.         iNumStates = 2;
  277.     // Decide which data members are affected by this command
  278.     if(stricmp(cElement, "HScrollBar_Left") == 0)
  279.     {
  280.         ppImage = &pSkin->mpl_pHScrollBar_Left;
  281.     }
  282.     else if(stricmp(cElement, "HScrollBar_Right") == 0)
  283.     {
  284.         ppImage = &pSkin->mpl_pHScrollBar_Right;
  285.     }
  286.     else if(stricmp(cElement, "VScrollBar_Up") == 0)
  287.     {
  288.         ppImage = &pSkin->mpl_pVScrollBar_Up;
  289.     }
  290.     else if(stricmp(cElement, "VScrollBar_Down") == 0)
  291.     {
  292.         ppImage = &pSkin->mpl_pVScrollBar_Down;
  293.     }
  294.     else
  295.         return;
  296.     // Set data members
  297.     if(*ppImage)
  298.         CPIG_DestroyImage_WithState(*ppImage);
  299.     *ppImage = CPIG_CreateStateImage(CPIG_CreateImage_FromSubFile(hComposite, cFile), iNumStates);
  300. }
  301. //
  302. //
  303. //
  304. DWORD CPSK_DecodeAlign(const char* pcAlign)
  305. {
  306.     char cAlign[1024];
  307.     char cAlign_Remains[128];
  308.     char cAlignFlag[128];
  309.     DWORD dwAlignFlag = 0;
  310.     strcpy(cAlign, pcAlign);
  311.     while(sscanf(cAlign, " %128[a-zA-Z_] | %[^]", cAlignFlag, cAlign_Remains) > 0)
  312.     {
  313.         strcpy(cAlign, cAlign_Remains);
  314.         cAlign_Remains[0] = '';
  315.         if(stricmp(cAlignFlag, "ALIGN_LEFT") == 0)
  316.             dwAlignFlag |= CPC_COMMANDTARGET_ALIGN_LEFT;
  317.         else if(stricmp(cAlignFlag, "ALIGN_TOP") == 0)
  318.             dwAlignFlag |= CPC_COMMANDTARGET_ALIGN_TOP;
  319.         else if(stricmp(cAlignFlag, "ALIGN_RIGHT") == 0)
  320.             dwAlignFlag |= CPC_COMMANDTARGET_ALIGN_RIGHT;
  321.         else if(stricmp(cAlignFlag, "ALIGN_BOTTOM") == 0)
  322.             dwAlignFlag |= CPC_COMMANDTARGET_ALIGN_BOTTOM;
  323.     }
  324.     return dwAlignFlag;
  325. }
  326. //
  327. //
  328. //
  329. void CPSK_ReadSkinCommand_AddVerb(CP_COMPOSITEFILE hComposite, CPs_CommandTarget** ppCommandTarget, const char* pcParams)
  330. {
  331.     char cElement[32];
  332.     char cStates[12];
  333.     char cAlign[128];
  334.     char cFile[128];
  335.     int iNumStates;
  336.     POINT ptOffset;
  337.     wp_Verb pfnVerb = NULL;
  338.     DWORD dwAlignFlag;
  339.     CPs_CommandTarget* pNext;
  340.     // Decode params
  341.     if(sscanf(pcParams, " %32[A-Za-z_-] , "%128[^"]" , %12[0-9a-zA-Z] , %d , %d , "%128[^"]" ",
  342.               cElement, cFile, cStates, &ptOffset.x, &ptOffset.y, cAlign) != 6)
  343.     {
  344.         return;
  345.     }
  346.     // Setup number of states
  347.     if(stricmp(cStates, "3State") == 0)
  348.         iNumStates = 3;
  349.     else
  350.         iNumStates = 2;
  351.     // Find the verb with this name
  352.     {
  353.         int iVerbIDX;
  354.         CPs_VerbQueryName queryname;
  355.         queryname.m_pcName = cElement;
  356.         queryname.m_bNameMatched = FALSE;
  357.         for(iVerbIDX = 0; glb_pfnAllVerbs[iVerbIDX]; iVerbIDX++)
  358.         {
  359.             glb_pfnAllVerbs[iVerbIDX](vaQueryName, &queryname);
  360.             if(queryname.m_bNameMatched)
  361.             {
  362.                 pfnVerb = glb_pfnAllVerbs[iVerbIDX];
  363.                 break;
  364.             }
  365.         }
  366.     }
  367.     // Build the align flags
  368.     dwAlignFlag = CPSK_DecodeAlign(cAlign);
  369.     // Load state image
  370.     pNext = *ppCommandTarget;
  371.     *ppCommandTarget = (CPs_CommandTarget*)malloc(sizeof(CPs_CommandTarget));
  372.     (*ppCommandTarget)->m_pStateImage = CPIG_CreateStateImage(CPIG_CreateImage_FromSubFile(hComposite, cFile), iNumStates);
  373.     (*ppCommandTarget)->m_ptOffset = ptOffset;
  374.     (*ppCommandTarget)->m_dwAlign = dwAlignFlag;
  375.     (*ppCommandTarget)->m_pfnVerb = pfnVerb;
  376.     (*ppCommandTarget)->m_pNext = pNext;
  377. }
  378. //
  379. //
  380. //
  381. void CPSK_ReadSkinCommand_AddIndicator(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcParams)
  382. {
  383.     char cElement[32];
  384.     char cAlign[128];
  385.     RECT rOffset;
  386.     DWORD dwAlignFlag;
  387.     CPs_Indicator* pNext;
  388.     // Decode params
  389.     if(sscanf(pcParams, " %32[A-Za-z_-] , %d , %d , %d , %d , "%128[^"]" ",
  390.               cElement, &rOffset.left, &rOffset.top, &rOffset.right, &rOffset.bottom, cAlign) != 6)
  391.     {
  392.         return;
  393.     }
  394.     // Build the align flags
  395.     dwAlignFlag = CPSK_DecodeAlign(cAlign);
  396.     // Load state image
  397.     pNext = pSkin->mpl_pIndicators;
  398.     pSkin->mpl_pIndicators = (CPs_Indicator*)malloc(sizeof(CPs_Indicator));
  399.     pSkin->mpl_pIndicators->m_pNext = pNext;
  400.     pSkin->mpl_pIndicators->m_dwAlign = dwAlignFlag;
  401.     pSkin->mpl_pIndicators->m_rAlign = rOffset;
  402.     STR_AllocSetString(&pSkin->mpl_pIndicators->m_pcName, cElement, FALSE);
  403. }
  404. void CPSK_ReadSkinCommand_AddPlaylistVerb(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcParams)
  405. {
  406.     CPSK_ReadSkinCommand_AddVerb(hComposite, &pSkin->mpl_pCommandTargets, pcParams);
  407. }
  408. //
  409. //
  410. //
  411. void CPSK_ReadSkinLine(CP_COMPOSITEFILE hComposite, CPs_Skin* pSkin, const char* pcLine)
  412. {
  413.     char cCommand[32];
  414.     char cParams[480];
  415.     // Decode command
  416.     if(sscanf(pcLine, " %32s %480[^]", cCommand, cParams) != 2)
  417.         return;
  418.     // Skip comments
  419.     if(cCommand[0] == '#')
  420.         return;
  421.     CP_TRACE2("Command:"%s" Params:"%s"", cCommand, cParams);
  422.     if(stricmp(cCommand, "define") == 0)
  423.         CPSK_ReadSkinCommand_Define(hComposite, pSkin, cParams);
  424.     else if(stricmp(cCommand, "tileddraw") == 0)
  425.         CPSK_ReadSkinCommand_TiledDraw(hComposite, pSkin, cParams);
  426.     else if(stricmp(cCommand, "buttondraw") == 0)
  427.         CPSK_ReadSkinCommand_ButtonDraw(hComposite, pSkin, cParams);
  428.     else if(stricmp(cCommand, "addplaylistverb") == 0)
  429.         CPSK_ReadSkinCommand_AddPlaylistVerb(hComposite, pSkin, cParams);
  430.     else if(stricmp(cCommand, "addplaylistindicator") == 0)
  431.         CPSK_ReadSkinCommand_AddIndicator(hComposite, pSkin, cParams);
  432. }
  433. //
  434. //
  435. //
  436. CPs_Skin* CPSK_LoadSkin(CP_COMPOSITEFILE hComposite, const char* pcSkinFile, const unsigned int iFileSize)
  437. {
  438.     unsigned int iLastLineStartIDX, iCharIDX;
  439.     CPs_Skin* pNewSkin = (CPs_Skin*)malloc(sizeof(CPs_Skin));
  440.     memset(pNewSkin, 0, sizeof(*pNewSkin));
  441.     // Read in the file line by line
  442.     iLastLineStartIDX = 0;
  443.     for(iCharIDX = 0; iCharIDX < iFileSize+1; iCharIDX++)
  444.     {
  445.         if( (pcSkinFile[iCharIDX] == 'r'
  446.                 || pcSkinFile[iCharIDX] == 'n'
  447.                 || iCharIDX == iFileSize)
  448.                 && iLastLineStartIDX < iCharIDX)
  449.         {
  450.             char cBuffer[512];
  451.             int iBytesOnLine;
  452.             iBytesOnLine = iCharIDX-iLastLineStartIDX;
  453.             if(iBytesOnLine >= 512)
  454.                 iBytesOnLine = 511;
  455.             memcpy(cBuffer, pcSkinFile + iLastLineStartIDX, iBytesOnLine);
  456.             cBuffer[iBytesOnLine] = '';
  457.             CPSK_ReadSkinLine(hComposite, pNewSkin, cBuffer);
  458.             // Set the line start for the next line
  459.             if(pcSkinFile[iCharIDX + 1] == 'n')
  460.                 iCharIDX++;
  461.             iLastLineStartIDX = iCharIDX + 1;
  462.         }
  463.     }
  464.     return pNewSkin;
  465. }
  466. //
  467. //
  468. //