home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / dxclrhlp.h < prev    next >
C/C++ Source or Header  |  2000-02-01  |  11KB  |  316 lines

  1. #pragma option push -b -a8 -pc -A- /*P_O_Push*/
  2. HRESULT WINAPI DXColorFromBSTR( BSTR Color, DWORD *pdwColor );
  3.  
  4. typedef struct _COLORVALUE_PAIR
  5. {
  6.     const CHAR  *szName;
  7.     DWORD        dwValue;
  8. } COLORVALUE_PAIR;
  9.  
  10. const COLORVALUE_PAIR
  11. rgColorNames[] =
  12. {
  13.     { ("aliceblue"),             0xfff0f8ff },
  14.     { ("antiquewhite"),          0xfffaebd7 },
  15.     { ("aqua"),                  0xff00ffff },
  16.     { ("aquamarine"),            0xff7fffd4 },
  17.     { ("azure"),                 0xfff0ffff },
  18.     { ("beige"),                 0xfff5f5dc },
  19.     { ("bisque"),                0xffffe4c4 },
  20.     { ("black"),                 0xff000000 },
  21.     { ("blanchedalmond"),        0xffffebcd },
  22.     { ("blue"),                  0xff0000ff },
  23.     { ("blueviolet"),            0xff8a2be2 },
  24.     { ("brown"),                 0xffa52a2a },
  25.     { ("burlywood"),             0xffdeb887 },
  26.     { ("cadetblue"),             0xff5f9ea0 },
  27.     { ("chartreuse"),            0xff7fff00 },
  28.     { ("chocolate"),             0xffd2691e },
  29.     { ("coral"),                 0xffff7f50 },
  30.     { ("cornflowerblue"),        0xff6495ed },
  31.     { ("cornsilk"),              0xfffff8dc },
  32.     { ("crimson"),               0xffdc143c },
  33.     { ("cyan"),                  0xff00ffff },
  34.     { ("darkblue"),              0xff00008b },
  35.     { ("darkcyan"),              0xff008b8b },
  36.     { ("darkgoldenrod"),         0xffb8860b },
  37.     { ("darkgray"),              0xffa9a9a9 },
  38.     { ("darkgreen"),             0xff006400 },
  39.     { ("darkkhaki"),             0xffbdb76b },
  40.     { ("darkmagenta"),           0xff8b008b },
  41.     { ("darkolivegreen"),        0xff556b2f },
  42.     { ("darkorange"),            0xffff8c00 },
  43.     { ("darkorchid"),            0xff9932cc },
  44.     { ("darkred"),               0xff8b0000 },
  45.     { ("darksalmon"),            0xffe9967a },
  46.     { ("darkseagreen"),          0xff8fbc8f },
  47.     { ("darkslateblue"),         0xff483d8b },
  48.     { ("darkslategray"),         0xff2f4f4f },
  49.     { ("darkturquoise"),         0xff00ced1 },
  50.     { ("darkviolet"),            0xff9400d3 },
  51.     { ("deeppink"),              0xffff1493 },
  52.     { ("deepskyblue"),           0xff00bfff },
  53.     { ("dimgray"),               0xff696969 },
  54.     { ("dodgerblue"),            0xff1e90ff },
  55.     { ("firebrick"),             0xffb22222 },
  56.     { ("floralwhite"),           0xfffffaf0 },
  57.     { ("forestgreen"),           0xff228b22 },
  58.     { ("fuchsia"),               0xffff00ff },
  59.     { ("gainsboro"),             0xffdcdcdc },
  60.     { ("ghostwhite"),            0xfff8f8ff },
  61.     { ("gold"),                  0xffffd700 },
  62.     { ("goldenrod"),             0xffdaa520 },
  63.     { ("gray"),                  0xff808080 },
  64.     { ("green"),                 0xff008000 },
  65.     { ("greenyellow"),           0xffadff2f },
  66.     { ("honeydew"),              0xfff0fff0 },
  67.     { ("hotpink"),               0xffff69b4 },
  68.     { ("indianred"),             0xffcd5c5c },
  69.     { ("indigo"),                0xff4b0082 },
  70.     { ("ivory"),                 0xfffffff0 },
  71.     { ("khaki"),                 0xfff0e68c },
  72.     { ("lavender"),              0xffe6e6fa },
  73.     { ("lavenderblush"),         0xfffff0f5 },
  74.     { ("lawngreen"),             0xff7cfc00 },
  75.     { ("lemonchiffon"),          0xfffffacd },
  76.     { ("lightblue"),             0xffadd8e6 },
  77.     { ("lightcoral"),            0xfff08080 },
  78.     { ("lightcyan"),             0xffe0ffff },
  79.     { ("lightgoldenrodyellow"),  0xfffafad2 },
  80.     { ("lightgreen"),            0xff90ee90 },
  81.     { ("lightgrey"),             0xffd3d3d3 },
  82.     { ("lightpink"),             0xffffb6c1 },
  83.     { ("lightsalmon"),           0xffffa07a },
  84.     { ("lightseagreen"),         0xff20b2aa },
  85.     { ("lightskyblue"),          0xff87cefa },
  86.     { ("lightslategray"),        0xff778899 },
  87.     { ("lightsteelblue"),        0xffb0c4de },
  88.     { ("lightyellow"),           0xffffffe0 },
  89.     { ("lime"),                  0xff00ff00 },
  90.     { ("limegreen"),             0xff32cd32 },
  91.     { ("linen"),                 0xfffaf0e6 },
  92.     { ("magenta"),               0xffff00ff },
  93.     { ("maroon"),                0xff800000 },
  94.     { ("mediumaquamarine"),      0xff66cdaa },
  95.     { ("mediumblue"),            0xff0000cd },
  96.     { ("mediumorchid"),          0xffba55d3 },
  97.     { ("mediumpurple"),          0xff9370db },
  98.     { ("mediumseagreen"),        0xff3cb371 },
  99.     { ("mediumslateblue"),       0xff7b68ee },
  100.     { ("mediumspringgreen"),     0xff00fa9a },
  101.     { ("mediumturquoise"),       0xff48d1cc },
  102.     { ("mediumvioletred"),       0xffc71585 },
  103.     { ("midnightblue"),          0xff191970 },
  104.     { ("mintcream"),             0xfff5fffa },
  105.     { ("mistyrose"),             0xffffe4e1 },
  106.     { ("moccasin"),              0xffffe4b5 },
  107.     { ("navajowhite"),           0xffffdead },
  108.     { ("navy"),                  0xff000080 },
  109.     { ("oldlace"),               0xfffdf5e6 },
  110.     { ("olive"),                 0xff808000 },
  111.     { ("olivedrab"),             0xff6b8e23 },
  112.     { ("orange"),                0xffffa500 },
  113.     { ("orangered"),             0xffff4500 },
  114.     { ("orchid"),                0xffda70d6 },
  115.     { ("palegoldenrod"),         0xffeee8aa },
  116.     { ("palegreen"),             0xff98fb98 },
  117.     { ("paleturquoise"),         0xffafeeee },
  118.     { ("palevioletred"),         0xffdb7093 },
  119.     { ("papayawhip"),            0xffffefd5 },
  120.     { ("peachpuff"),             0xffffdab9 },
  121.     { ("peru"),                  0xffcd853f },
  122.     { ("pink"),                  0xffffc0cb },
  123.     { ("plum"),                  0xffdda0dd },
  124.     { ("powderblue"),            0xffb0e0e6 },
  125.     { ("purple"),                0xff800080 },
  126.     { ("red"),                   0xffff0000 },
  127.     { ("rosybrown"),             0xffbc8f8f },
  128.     { ("royalblue"),             0xff4169e1 },
  129.     { ("saddlebrown"),           0xff8b4513 },
  130.     { ("salmon"),                0xfffa8072 },
  131.     { ("sandybrown"),            0xfff4a460 },
  132.     { ("seagreen"),              0xff2e8b57 },
  133.     { ("seashell"),              0xfffff5ee },
  134.     { ("sienna"),                0xffa0522d },
  135.     { ("silver"),                0xffc0c0c0 },
  136.     { ("skyblue"),               0xff87ceeb },
  137.     { ("slateblue"),             0xff6a5acd },
  138.     { ("slategray"),             0xff708090 },
  139.     { ("snow"),                  0xfffffafa },
  140.     { ("springgreen"),           0xff00ff7f },
  141.     { ("steelblue"),             0xff4682b4 },
  142.     { ("tan"),                   0xffd2b48c },
  143.     { ("teal"),                  0xff008080 },
  144.     { ("thistle"),               0xffd8bfd8 },
  145.     { ("tomato"),                0xffff6347 },
  146.     { ("turquoise"),             0xff40e0d0 },
  147.     { ("violet"),                0xffee82ee },
  148.     { ("wheat"),                 0xfff5deb3 },
  149.     { ("white"),                 0xffffffff },
  150.     { ("whitesmoke"),            0xfff5f5f5 },
  151.     { ("yellow"),                0xffffff00 },
  152.     { ("yellowgreen"),           0xff9acd32 }
  153.  
  154. }; // rgColorNames[]
  155.  
  156. #define SIZE_OF_COLOR_TABLE (sizeof(rgColorNames) / sizeof(COLORVALUE_PAIR))
  157.  
  158. //
  159. // Used by DXColorFromBSTR to parse the hex string.
  160. //
  161.  
  162. inline HRESULT _HexStrToDWORD( char * pch, DWORD * pdwColor )
  163. {
  164.  
  165.     HRESULT hr = S_OK;
  166.     short hexVals[8];
  167.     int numVals;
  168.     int i;
  169.     DWORD dwmult;
  170.  
  171.     if( !pch || !pdwColor )
  172.     {
  173.         hr = E_FAIL;
  174.     }
  175.     else
  176.     {
  177.         //--- parse input string
  178.         numVals = 0;
  179.         while( *pch && numVals < 8 )
  180.         {
  181.             if( *pch >= '0' && *pch <= '9' )
  182.             {
  183.                 hexVals[numVals++] = *pch++ - '0';
  184.             }
  185.             else if( *pch >= 'a' && *pch <= 'f' )
  186.             {
  187.                 hexVals[numVals++] = *pch++ - 'a' + 10;
  188.             }
  189.             else if( *pch >= 'A' && *pch <= 'F' )
  190.             {
  191.                 hexVals[numVals++] = *pch++ - 'A' + 10;
  192.             }
  193.             else
  194.             {
  195.                 break;
  196.             }
  197.         }
  198.  
  199.         if( numVals < 6 )
  200.         {
  201.             hr = E_FAIL;
  202.         }
  203.         else
  204.         {
  205.             //--- if we were passed 7 hex digits, only use the first 6
  206.             if( numVals == 7 )
  207.             {
  208.                 numVals = 6;
  209.             }
  210.  
  211.             //--- initialize multiplier
  212.             dwmult = 1;
  213.             *pdwColor = 0;
  214.  
  215.             //--- multiply hexVals by 16^i
  216.             for( i = 0; i < numVals; i++ )
  217.             {
  218.                 *pdwColor += (hexVals[numVals-(i+1)]*dwmult);
  219.                 dwmult <<= 4;
  220.             }
  221.         }
  222.     }
  223.    
  224.     return hr;
  225. }
  226.  
  227. // 
  228. // Used by DXColorFromBSTR to convert a string to lower case
  229. //
  230.  
  231. inline void StringToLowerCase( CHAR * pstrKey )
  232. {
  233.     if( pstrKey )
  234.     {
  235.         while( *pstrKey )
  236.         {
  237.             if( *pstrKey >= 'A' && *pstrKey <= 'Z' )
  238.             {
  239.                 *pstrKey = 'a' + *pstrKey - 'A';
  240.             }
  241.             pstrKey++;
  242.         }
  243.     }
  244. }
  245.  
  246.  
  247. inline HRESULT WINAPI DXColorFromBSTR( BSTR Color, DWORD *pdwColor )
  248. {
  249.     HRESULT hr = S_OK;
  250.     // validate arguments
  251.     int strLen = wcslen(Color);
  252.     if( strLen < 3 || DXIsBadReadPtr( Color, strLen ) || 
  253.         DXIsBadWritePtr( pdwColor, sizeof(*pdwColor) ) )
  254.     {
  255.         hr = E_INVALIDARG;
  256.     }
  257.     else
  258.     {
  259.         //--- first check for #AARRGGBB and #RRGGBB strings
  260.         if( Color[0] == L'#' )
  261.         {
  262.             CHAR ch[11] = "0xffffffff";
  263.             if( strLen > 9 ) strLen = 9;
  264.             if( strLen >= 7 )
  265.             {
  266.                 WideCharToMultiByte( CP_ACP, NULL, &Color[1], strLen-1, &ch[11-strLen], strLen, NULL, NULL );
  267.                 hr = _HexStrToDWORD( &ch[2], pdwColor);
  268.             }
  269.             else
  270.             {
  271.                 hr = E_FAIL;
  272.             }
  273.         }
  274.         else
  275.         {
  276.             //--- convert the string to lower case
  277.             LPSTR pstrKey = (LPSTR) alloca((strLen + 1) * sizeof(CHAR));
  278.             WideCharToMultiByte( CP_ACP, NULL, Color, strLen+1, pstrKey, strLen+1, NULL, NULL );
  279.             StringToLowerCase( pstrKey );
  280.  
  281.             //--- search the string table using a binary search
  282.             int nFirst = 0;
  283.             int nLast = SIZE_OF_COLOR_TABLE - 1;
  284.             int nCur, nCmp;
  285.             bool bFound = false;
  286.             while( (nFirst <= nLast) && !bFound )
  287.             {
  288.                 nCur = (nFirst + nLast) / 2;
  289.                 nCmp = strcmp( rgColorNames[nCur].szName, pstrKey );
  290.                 if( nCmp < 0 )
  291.                 {
  292.                     nFirst = nCur + 1;
  293.                 }
  294.                 else if( nCmp > 0 )
  295.                 {
  296.                     nLast = nCur - 1;
  297.                 }
  298.                 else
  299.                 {
  300.                     bFound = true;
  301.                     *pdwColor = rgColorNames[nCur].dwValue;
  302.                 }
  303.             }
  304.             //--- string not in table
  305.             if( !bFound )
  306.             {
  307.                 hr = E_FAIL;
  308.             }
  309.         }
  310.  
  311.     }
  312.     return hr;
  313. }
  314.  
  315. #pragma option pop /*P_O_Pop*/
  316.