colormap.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:29k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: colormap.c,v 1.6.24.1 2004/07/09 01:59:48 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxtypes.h"
  50. #if defined(_WIN32) && !defined(_WINCE)
  51. /* Windows include files: */
  52. #include <windows.h>
  53. #include <vfw.h>
  54. #include <ddraw.h>
  55. #include "hxtypes.h"
  56. #elif defined(_WINCE)
  57. #include "hxwintyp.h"
  58. #include <windows.h>
  59. #include "hxcom.h"
  60. //#undef _WIN32
  61. #include "hxvsurf.h"
  62. #endif
  63. #include "hxcom.h"
  64. #include "hlxclib/string.h"
  65. #include "hxtypes.h"
  66. #include "hxwintyp.h"
  67. #include "hxvsurf.h"
  68. /* Color IDs:*/
  69. #include "colormap.h"
  70. /*
  71.  * FOURCC codes (in addition to what is defined in wingdi.h):
  72.  */
  73. /* standard YUV formats: */
  74. #define BI_I420         MAKEFOURCC('I','4','2','0') /* planar YCrCb   */
  75. #define BI_YUVA         MAKEFOURCC('Y','U','V','A') /* planar YVU 420 plus alpha plane */
  76. #define BI_YV12         MAKEFOURCC('Y','V','1','2') /* planar YVU 420 */
  77. #define BI_YVU9         MAKEFOURCC('Y','V','U','9') /* planar YVU 420 */
  78. #define BI_YUY2         MAKEFOURCC('Y','U','Y','2') /* packed YVU 422 */
  79. #define BI_UYVY         MAKEFOURCC('U','Y','V','Y') /* packed YVU 422 */
  80. #define BI_DVPF         MAKEFOURCC('D','V','P','F') /* planar YCrCb in structure */
  81. /* Xing decoder's YUV format */
  82. #define BI_XING         MAKEFOURCC('X','I','N','G')
  83. /* MPEG-2 pre-decoded formats: */
  84. #define BI_MC12         MAKEFOURCC('M','C','1','2') /* ATI MPEG-2 M/C */
  85. #define BI_MCAM         MAKEFOURCC('M','C','A','M') /* ATI MPEG-2 M/C */
  86. #define BI_MCS3         MAKEFOURCC('M','C','S','3') /* S3 MPEG-2 M/C  */
  87. #define BI_IGOR         MAKEFOURCC('I','G','O','R') /* Intel i810 M/C */
  88. /* RMA proprietary formats: */
  89. #ifndef HXCOLOR_RGB3_ID
  90. #define HXCOLOR_RGB3_ID     MAKEFOURCC('3','B','G','R') /* RGB-32 ??      */
  91. #define HXCOLOR_RGB24_ID    MAKEFOURCC('B','G','R',' ') /* top-down RGB-24*/
  92. #define HXCOLOR_RGB565_ID   MAKEFOURCC('6','B','G','R') /* RGB-16 565     */
  93. #define HXCOLOR_RGB555_ID   MAKEFOURCC('5','B','G','R') /* RGB-16 555     */
  94. #define HXCOLOR_8BIT_ID     MAKEFOURCC('T','I','B','8') /* RGB-8 w. pal-e */
  95. #define HXCOLOR_YUV420_ID   MAKEFOURCC('2','V','U','Y') /* planar YCrCb   */
  96. #define HXCOLOR_YUV411_ID   MAKEFOURCC('1','V','U','Y') /* ???            */
  97. #define HXCOLOR_YUVRAW_ID   MAKEFOURCC('R','V','U','Y') /* ???            */
  98. #endif
  99. /*
  100.  * Color format tables:
  101.  */
  102. /* control flags: */
  103. #define _FOURCC   0x01
  104. #define _BITCOUNT 0x02
  105. #define _BITMASK  0x04
  106. /* color format descriptor: */
  107. struct _greg
  108. {
  109.     ULONG32 dwFlags;              /* indicates valid fields       */
  110.     ULONG32 dwFourCC;             /* FourCC code                  */
  111.     ULONG32 dwBitCount;           /* number of bits/pixel         */
  112.     ULONG32 dwBitMask [3];        /* RGB bit masks                */
  113. };
  114. typedef struct _greg  CIDD;
  115. typedef struct _greg* LPCIDD;
  116. /* color format descriptors to use with YUV bitmaps: */
  117. static const CIDD ciddI420      = {_FOURCC,                    BI_I420,       12, {       0,        0,        0}};
  118. static const CIDD ciddYUVA      = {_FOURCC,                    BI_YUVA,       20, {       0,        0,        0}};
  119. static const CIDD ciddYV12      = {_FOURCC,                    BI_YV12,       12, {       0,        0,        0}};
  120. static const CIDD ciddYVU9      = {_FOURCC,                    BI_YVU9,        9, {       0,        0,        0}};
  121. static const CIDD ciddYUY2      = {_FOURCC,                    BI_YUY2,       16, {       0,        0,        0}};
  122. static const CIDD ciddUYVY      = {_FOURCC,                    BI_UYVY,       16, {       0,        0,        0}};
  123. static const CIDD ciddDVPF      = {_FOURCC,                    BI_DVPF,       12, {       0,        0,        0}};
  124. static const CIDD ciddXING      = {_FOURCC,                    BI_XING,       16, {       0,        0,        0}};
  125. /* color format descriptors to use with GDI RGB bitmaps: */
  126. static const CIDD ciddBmpRGB32  = {_FOURCC+_BITCOUNT,          BI_RGB,        32, {       0,        0,        0}};
  127. static const CIDD ciddBmpARGB32 = {_FOURCC+_BITCOUNT,          HX_ARGB,      32, {       0,        0,        0}};
  128. static const CIDD ciddBmpRGB24  = {_FOURCC+_BITCOUNT,          BI_RGB,        24, {       0,        0,        0}};
  129. static const CIDD ciddBmpRGB565 = {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,  16, {  0xF800,   0x07E0,   0x001F}};
  130. static const CIDD ciddBmpRGB555 = {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,  16, {  0x7C00,   0x03E0,   0x001F}};
  131. static const CIDD ciddBmpRGB8   = {_FOURCC+_BITCOUNT,          BI_RGB,         8, {       0,        0,        0}};
  132. /* color format descriptors to use with DirectDraw RGB surfaces: */
  133. static const CIDD ciddDDrRGB32  = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        32, {0xFF0000, 0x00FF00, 0x0000FF}};
  134. static const CIDD ciddDDrARGB32 = {_FOURCC+_BITCOUNT+_BITMASK, HX_ARGB,      32, {0xFF0000, 0x00FF00, 0x0000FF}};
  135. static const CIDD ciddDDrRGB24  = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        24, {0xFF0000, 0x00FF00, 0x0000FF}};
  136. static const CIDD ciddDDrRGB565 = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        16, {  0xF800,   0x07E0,   0x001F}};
  137. static const CIDD ciddDDrRGB555 = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        16, {  0x7C00,   0x03E0,   0x001F}};
  138. static const CIDD ciddDDrRGB8   = {_FOURCC+_BITCOUNT,          BI_RGB,         8, {       0,        0,        0}};
  139. /* color format descriptors to use with BRG bitmaps: */
  140. static const CIDD ciddBGR32     = {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,  32, {0x0000FF, 0x00FF00, 0xFF0000}};
  141. static const CIDD ciddBGR24     = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        24, {0x0000FF, 0x00FF00, 0xFF0000}};
  142. /* color format descriptors to use with QuickTime byte swapped formats: */
  143. static const CIDD ciddRGB32S    = {_FOURCC+_BITCOUNT+_BITMASK, BI_RGB,        32, {0x00FF00, 0xFF0000, 0xFF000000}};
  144. /* color format descriptors to use with embedded device formats: */
  145. static const CIDD ciddRGB444    = {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,  16, {  0x0F00,   0x00F0,   0x000F}};
  146. /* color format descriptors to use with MPEG bitmaps: */
  147. static const CIDD ciddMC12      = {_FOURCC,                    BI_MC12,       12, {       0,        0,        0}};
  148. static const CIDD ciddMCAM      = {_FOURCC,                    BI_MCAM,       12, {       0,        0,        0}};
  149. static const CIDD ciddMCS3      = {_FOURCC,                    BI_MCS3,       12, {       0,        0,        0}};
  150. static const CIDD ciddIGOR      = {_FOURCC,                    BI_IGOR,       12, {       0,        0,        0}};
  151. /* non-standard descriptors we should support: */
  152. struct _stColors
  153. {
  154.     int cid;                    /* image format ID              */
  155.     CIDD  cidd;                 /* color format descriptor      */
  156. };
  157. static const struct _stColors ciddlOtherColors [] = {
  158.     {CID_I420, {_FOURCC,                    HXCOLOR_YUV420_ID, 12, {         0,          0,          0}}},
  159.     {CID_YUVA,              {_FOURCC,                    HXCOLOR_YUVA_ID,   20, {         0,          0,          0}}},
  160.     {CID_RGB32,             {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,      32, {0xFF000000, 0x00FF0000, 0x0000FF00}}}, 
  161.     {CID_RGB565,            {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,      16, {0x0000f800, 0x000007c0, 0x0000003e}}}, 
  162.     {CID_RGB32,             {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,      32, {  0xFF0000,   0x00FF00,   0x0000FF}}},
  163.     {CID_RGB32,             {_FOURCC+_BITCOUNT,          HXCOLOR_RGB3_ID,   32, {         0,          0,          0}}},
  164.     {CID_RGB24,             {_FOURCC+_BITCOUNT+_BITMASK, BI_BITFIELDS,      24, {  0xFF0000,   0x00FF00,   0x0000FF}}},
  165.     {CID_RGB24,             {_FOURCC+_BITCOUNT,          HXCOLOR_RGB3_ID,   24, {         0,          0,          0}}},
  166.     {CID_RGB24,             {_FOURCC,                    HXCOLOR_RGB24_ID,  24, {         0,          0,          0}}},
  167.     {CID_RGB565,            {_FOURCC,                    HXCOLOR_RGB565_ID, 16, {         0,          0,          0}}},
  168.     {CID_RGB555,            {_FOURCC+_BITCOUNT,          BI_RGB,            16, {         0,          0,          0}}},
  169.     {CID_RGB555,            {_FOURCC,                    HXCOLOR_RGB555_ID, 16, {         0,          0,          0}}},
  170.     {CID_RGB8,              {_FOURCC,                    HXCOLOR_8BIT_ID,    8, {         0,          0,          0}}},
  171.     {CID_UNKNOWN,           {0      ,                    0,                  0, {         0,          0,          0}}}
  172. };
  173. /* color format attributes: */
  174. #define _BITMAP         0x0001  /* has bitmap descriptor        */
  175. #define _DIRECTDRAW     0x0002  /* has DirectDraw descriptor    */
  176. #define _RGB            0x0100  /* normal RGB format            */
  177. #define _BGR            0x0200  /* B/R flipped RGB format       */
  178. #define _YUV            0x0400  /* YUV format                   */
  179. #define _MPEG           0x0800  /* MPEG pre-decoded format      */
  180. #define _RGBS           0x1000  /* Byte swapped RGB format      */
  181. /* the main color descriptors' table: */
  182. struct _stColorTable
  183. {
  184.     ULONG32 dwFlags;               /* general format properties    */
  185.     const struct _greg * lpBitmapCIDD;     /* bitmap format descriptor     */
  186.     const struct _greg * lpDirectDrawCIDD; /* DirectDraw format descriptor */
  187.     int     nBPP;                  /* bytes per pixel              */
  188. };
  189. static const struct _stColorTable  ciddTbl[NFORMATS] = {
  190.     {_BITMAP+_YUV,              &ciddI420,      (const struct _greg*)NULL,    1}, /* CID_I420   */
  191.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddYV12,      &ciddYV12,      1}, /* CID_YV12   */
  192.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddYVU9,      &ciddYVU9,      1}, /* CID_YVU9   */
  193.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddYUY2,      &ciddYUY2,      2}, /* CID_YUY2   */
  194.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddUYVY,      &ciddUYVY,      2}, /* CID_UYVY   */
  195.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpRGB32,  &ciddDDrRGB32,  4}, /* CID_RGB32  */
  196.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpRGB24,  &ciddDDrRGB24,  3}, /* CID_RGB24  */
  197.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpRGB565, &ciddDDrRGB565, 2}, /* CID_RGB565 */
  198.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpRGB555, &ciddDDrRGB555, 2}, /* CID_RGB555 */
  199.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpRGB8,   &ciddDDrRGB8,   1}, /* CID_RGB8   */
  200.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddXING,      &ciddXING,      1}, /* CID_XING   */
  201.     {_BITMAP+_DIRECTDRAW+_RGB,  &ciddBmpARGB32, &ciddDDrARGB32, 4}, /* CID_ARGB32 */
  202.     {_BITMAP+_YUV,              &ciddYUVA,      NULL,           1}, /* CID_YUVA   */
  203.     {_BITMAP+_YUV,              &ciddYUY2,      &ciddYUY2,      2}, /* CID_YUYU   */
  204.     {0,                         NULL,           NULL,           0}, /* CID_UNKNOWN*/
  205.     {_BITMAP+_BGR,              &ciddBGR32,     NULL,           4}, /* CID_BGR32  */
  206.     {_BITMAP+_BGR,              &ciddBGR24,     NULL,           3}, /* CID_BGR24  */
  207.     {_BITMAP+_RGBS,             &ciddRGB32S,    NULL,           4}, /* CID_RGB32S */
  208.     {_BITMAP+_RGB,              &ciddRGB444,    NULL,           2}, /* CID_RGB444 */
  209.     {_BITMAP+_DIRECTDRAW+_MPEG, &ciddMC12,      &ciddMC12,      1}, /* CID_MC12   */
  210.     {_BITMAP+_DIRECTDRAW+_MPEG, &ciddMCAM,      &ciddMCAM,      1}, /* CID_MCAM   */
  211.     {_BITMAP+_DIRECTDRAW+_MPEG, &ciddMCS3,      &ciddMCS3,      1}, /* CID_MCS3   */
  212.     {_BITMAP+_DIRECTDRAW+_MPEG, &ciddIGOR,      &ciddIGOR,      1}, /* CID_IGOR   */
  213.     {_BITMAP+_DIRECTDRAW+_YUV,  &ciddDVPF,      &ciddDVPF,      1}  /* CID_DVPF   */
  214. };
  215.                                                  
  216. /*********************************
  217.  *  _TEXT segment :-)
  218.  *********************************/
  219. int MapFourCCtoCID(ULONG32 dwFourCC)
  220. {
  221.     int i;
  222.     //for (i=0; i<CID_UNKNOWN; i++)
  223.     for (i=0; i<NFORMATS; i++)
  224.     {
  225.         if (ciddTbl[i].lpBitmapCIDD &&
  226.             ciddTbl[i].lpBitmapCIDD->dwFourCC == dwFourCC)
  227.     {
  228.         return i;
  229.     }
  230.     }
  231.     return CID_UNKNOWN;
  232. }
  233. int MapCIDtoFourCC(ULONG32 CID)
  234. {
  235.     if (CID < NFORMATS)
  236.         return ciddTbl[CID].lpBitmapCIDD->dwFourCC;
  237.     else
  238.         return 0;
  239. }
  240. /*
  241.  * Check color format:
  242.  */
  243. static int ChkColor (const struct _greg* pcidd, ULONG32 dwFourCC, ULONG32 dwBitCount, ULONG32 *lpBitMask)
  244. {
  245.     /* clear match flags: */
  246.     ULONG32 dwMatch = 0;
  247.     /* check FourCC: */
  248.     if ((pcidd->dwFlags & _FOURCC) && pcidd->dwFourCC == dwFourCC)
  249.         dwMatch |= _FOURCC;
  250.     /* check BitCount: */
  251.     if ((pcidd->dwFlags & _BITCOUNT) && pcidd->dwBitCount == dwBitCount)
  252.         dwMatch |= _BITCOUNT;
  253.     /* check BitMasks: */
  254.     if ((pcidd->dwFlags & _BITMASK) && lpBitMask &&
  255.         pcidd->dwBitMask[0] == lpBitMask[0] &&
  256.         pcidd->dwBitMask[1] == lpBitMask[1] &&
  257.         pcidd->dwBitMask[2] == lpBitMask[2])
  258.         dwMatch |= _BITMASK;
  259.     /* combine results: */
  260.     return dwMatch == pcidd->dwFlags;
  261. }
  262. /*
  263.  * Get color format ID.
  264.  * Use:
  265.  *  int GetBitmapColor (LPBITMAPINFO lpbi);
  266.  *  int GetDirectDrawColor (LPDDPIXELFORMAT lpddpf);
  267.  * Input:
  268.  *  lpbi - pointer to BITMAPINFO structure containing image format
  269.  *  lpddpf - pointer to a DirectDraw DDPIXELFORMAT structure
  270.  * Returns:
  271.  *  ID of the specified format, if found;
  272.  *  CID_UNKNOWN, if not supported.
  273.  */
  274. #ifdef _WIN32
  275. int GetBitmapColor (LPBITMAPINFO lpbi)
  276. #else
  277. int GetBitmapColor (HXBitmapInfo* lpHXbi)
  278. #endif
  279. {
  280.     ULONG32 dwFourCC, dwBitCount, *lpColors;
  281.     register int i;
  282. #ifdef _WIN32
  283.     HXBitmapInfo* lpHXbi;
  284.     if (!lpbi)
  285.     {
  286. return CID_UNKNOWN;
  287.     }
  288.     lpHXbi = (HXBitmapInfo*) lpbi;
  289. #endif
  290.     /* check bitmap pointer/size... */
  291.     if (lpHXbi == NULL)
  292.         return CID_UNKNOWN;
  293.     /* get bitmap parameters to compare: */
  294.     dwFourCC = lpHXbi->bmiHeader.biCompression;
  295.     dwBitCount = lpHXbi->bmiHeader.biBitCount;
  296.     lpColors = (ULONG32*)&lpHXbi->un.dwBitMask[0];
  297.     /* scan standard bitmap formats: */
  298.     for (i=0; i<NFORMATS; i++)
  299.         if ((ciddTbl[i].dwFlags & _BITMAP) && ciddTbl[i].lpBitmapCIDD &&
  300.             ChkColor (ciddTbl[i].lpBitmapCIDD, dwFourCC, dwBitCount, lpColors))
  301.             return i;
  302.     
  303.     /* scan our proprietary formats: */
  304.     for (i=0; ; i++)
  305.         if (ChkColor (&(ciddlOtherColors[i].cidd), dwFourCC, dwBitCount, lpColors))
  306.             break;
  307.     /* return color ID: */
  308.     return ciddlOtherColors[i].cid;
  309. }
  310. #if defined(_WIN32) && !defined(WINCE)
  311. int GetDirectDrawColor (LPDDPIXELFORMAT lpddpf)
  312. {
  313.     /* check bitmap pointer... */
  314.     if (lpddpf != NULL && lpddpf->dwSize >= sizeof(DDPIXELFORMAT)) {
  315.         /* scan DirectDraw formats: */
  316.         register int i;
  317.         for (i=0; i<NFORMATS; i++)
  318.             if ((ciddTbl[i].dwFlags & _DIRECTDRAW) && ciddTbl[i].lpDirectDrawCIDD &&
  319.                 ChkColor (ciddTbl[i].lpDirectDrawCIDD, lpddpf->dwFourCC, lpddpf->dwRGBBitCount, &(lpddpf->dwRBitMask)))
  320.                 return i;
  321.     }
  322.     return CID_UNKNOWN;
  323. }
  324. #endif
  325. /*
  326.  * Set color format.
  327.  * Use:
  328.  *  void SetBitmapColor (LPBITMAPINFO lpbi, int cid);
  329.  *  void SetDirectDrawColor (LPDDPIXELFORMAT lpddpf, int cid);
  330.  * Input:
  331.  *  lpbi - pointer to BITMAPINFO structure containing image format
  332.  *  lpddpf - pointer to a DirectDraw DDPIXELFORMAT structure
  333.  *  cid - color format to set
  334.  * Returns:
  335.  *  0, if success,
  336.  *  !0 if wrong color format ID passed
  337.  */
  338. #ifdef _WIN32
  339. int SetBitmapColor (LPBITMAPINFO lpbi, int cid)
  340. #else
  341. int SetBitmapColor (HXBitmapInfo* lpHXbi, int cid)
  342. #endif
  343. {
  344.     const struct _greg* lpcidd;
  345. #ifdef _WIN32
  346.     HXBitmapInfo* lpHXbi;
  347.     if (!lpbi)
  348.     {
  349. return CID_UNKNOWN;
  350.     }
  351.     lpHXbi = (HXBitmapInfo*) lpbi;
  352. #endif
  353.     /* check input parameters: */
  354.     if (lpHXbi == NULL ||
  355.         cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _BITMAP) ||
  356.         (lpcidd = ciddTbl[cid].lpBitmapCIDD) == NULL)
  357.         return -1;
  358.     /* set color-format releated fields in BITMAPINFO: */
  359.     lpHXbi->bmiHeader.biCompression = lpcidd->dwFourCC;
  360.     lpHXbi->bmiHeader.biBitCount    = (UINT16)lpcidd->dwBitCount;
  361.     /* set color masks: */
  362.     if (lpcidd->dwFlags & _BITMASK) {
  363.         /* get offset of color masks in the bitmap: */
  364.         ULONG32 *lpColors = (ULONG32*)&lpHXbi->un.dwBitMask[0];
  365.         lpColors[0] = lpcidd->dwBitMask[0];
  366.         lpColors[1] = lpcidd->dwBitMask[1];
  367.         lpColors[2] = lpcidd->dwBitMask[2];
  368.     }
  369.     /* success: */
  370.     return 0;
  371. }
  372. /*
  373.  * Calculates the size of an image with a given color format.
  374.  */
  375. static int ImageSize (int cid, ULONG32 dwWidth, ULONG32 dwHeight)
  376. {
  377.     int pitch, size;
  378.     /* do it in a lazy way: */
  379.     switch (cid) {
  380.         /* planar YUV 4:2:0 formats: */
  381.         case CID_I420:
  382.         case CID_YV12:
  383.             size = dwHeight * dwWidth * 3 / 2;
  384.             break;
  385.         /* YUV 9 format: */
  386.        case CID_YUVA:
  387.            size = (dwHeight * dwWidth) * 5 / 2;
  388.            break;
  389.         case CID_YVU9:
  390.             size = dwHeight * dwWidth * 9 / 8;
  391.             break;
  392.         /* packet YUV 4:2:2 formats: */
  393.         case CID_YUY2:
  394.         case CID_UYVY:
  395.             size = dwHeight * dwWidth * 2;
  396.             break;
  397.         /* RGB formats: */
  398.         case CID_RGB32:
  399.         case CID_ARGB32:
  400.         case CID_RGB24:
  401.         case CID_RGB565:
  402.         case CID_RGB555:
  403.         case CID_RGB8:
  404.         case CID_BGR32:
  405.         case CID_BGR24:
  406.         case CID_RGB32S:
  407.         case CID_RGB444:
  408.             pitch = dwWidth * ciddTbl[cid].nBPP;
  409.             pitch = (pitch + 3) & ~3;
  410.             size = dwHeight * pitch;
  411. break;
  412.         /* the other formats: */
  413.         default:
  414.             size = 0; /* no idea what size should be??? */
  415.     }
  416.     return size;
  417. }
  418. /*
  419.  * Get pitch of the bitmap image.
  420.  * Use:
  421.  *  int GetBitmapPitch (LPBITMAPINFO lpbi);
  422.  * Input:
  423.  *  lpbi - pointer to BITMAPINFO structure containing image format
  424.  * Returns:
  425.  *  !0 -- pitch of the bitmap image; <0 if bottom-up bitmap
  426.  *  0 - unrecognized bitmap format
  427.  */
  428. #ifdef _WIN32
  429. int GetBitmapPitch (LPBITMAPINFO lpbi)
  430. #else      
  431. int GetBitmapPitch (HXBitmapInfo* lpbi)
  432. #endif      
  433. {
  434.     register int cid, pitch;
  435.     /* check bitmap pointer & format: */
  436.     cid = GetBitmapColor (lpbi);
  437.     if (cid == CID_UNKNOWN || !(ciddTbl[cid].dwFlags & _BITMAP))
  438.         return 0;
  439.     if (cid == CID_XING)
  440.         return 768;
  441.     
  442.     /* calculate image pitch: */
  443.     pitch = lpbi->bmiHeader.biWidth * ciddTbl[cid].nBPP;
  444.     if (ciddTbl[cid].dwFlags & (_RGB|_BGR))
  445. #if defined(_MACINTOSH) || defined(_UNIX)
  446.         pitch = ((pitch + 3) & ~3);
  447. #else
  448.         pitch = -((pitch + 3) & ~3);
  449. #endif
  450.     /* return pitch: */
  451.     return pitch;
  452. }
  453. /*
  454.  * Get size of the bitmap image.
  455.  * Use:
  456.  *  int GetBitmapImageSize (LPBITMAPINFO lpbi);
  457.  * Input:
  458.  *  lpbi - pointer to BITMAPINFO structure containing image format
  459.  * Returns:
  460.  *  !0 -- size of the bitmap image
  461.  *  0 - unrecognized bitmap format
  462.  */
  463. #ifdef _WIN32
  464. int GetBitmapImageSize (LPBITMAPINFO lpbi)
  465. #else      
  466. int GetBitmapImageSize (HXBitmapInfo* lpbi)
  467. #endif      
  468. {
  469.     /* check bitmap pointer & format: */
  470.     register int cid = GetBitmapColor (lpbi);
  471.     if (cid == CID_UNKNOWN ||
  472.         !(ciddTbl[cid].dwFlags & _BITMAP) ||
  473.         lpbi->bmiHeader.biWidth <= 0 ||
  474.         lpbi->bmiHeader.biHeight <= 0 ||
  475.         lpbi->bmiHeader.biPlanes != 1)
  476.         return 0;
  477.     return ImageSize (cid, lpbi->bmiHeader.biWidth, lpbi->bmiHeader.biHeight);
  478. }
  479. /*
  480.  * Build a bitmap structure.
  481.  * Use:
  482.  *  int MakeBitmap (LPBITMAPINFO lpbi, int nBISize,
  483.  *   int cid, ULONG32 dwWidth, ULONG32 dwHeight, LPPALETTEENTRY lppe, int nColors);
  484.  * Input:
  485.  *  lpbi - pointer to BITMAPINFO structure to contain image format
  486.  *  nBISize - size of memory block allocated for BITMAPINFO structure
  487.  *  cid - color format to use for bitmap
  488.  *  dwWidth, dwHeight - image width/height
  489.  *  lppe, nColors - palette info
  490.  * Returns:
  491.  *  !0 - bitmap has been successfully created
  492.  *  0 - invalid bitmap parameters
  493.  */
  494. #ifdef _WIN32
  495. int MakeBitmap (LPBITMAPINFO lpbi, int nBISize,
  496.     int cid, ULONG32 dwWidth, ULONG32 dwHeight, LPPALETTEENTRY lppe, int nColors)
  497. #else
  498. int MakeBitmap(HXBitmapInfo* lpbi, int nBISize, int cid, ULONG32 dwWidth,
  499.                ULONG32 dwHeight, void* lppe, int nColors)
  500. #endif      
  501. {
  502.     const struct _greg* lpcidd;
  503.     int setPalette, bitmapinfoSize;
  504.     /* check input parameters: */
  505.     if (lpbi == NULL ||
  506.         cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _BITMAP) ||
  507.         (lpcidd = ciddTbl[cid].lpBitmapCIDD) == NULL ||
  508.         (int)dwWidth <= 0 || (int)dwHeight <= 0)
  509.         return 0;
  510.     /* calculate bitmapinfo size: */
  511.     setPalette = 0;
  512. #ifdef _WIN32    
  513.     bitmapinfoSize = sizeof(BITMAPINFOHEADER);
  514. #else
  515.     bitmapinfoSize = sizeof(HXBitmapInfoHeader);
  516. #endif    
  517.     if (lpcidd->dwFlags & _BITMASK)
  518.         bitmapinfoSize += 3 * sizeof(ULONG32);
  519.     else
  520.     if ((lpcidd->dwFlags & (_FOURCC|_BITCOUNT)) == (_FOURCC|_BITCOUNT) &&
  521.         lpcidd->dwFourCC == BI_RGB && lpcidd->dwBitCount <= 8 &&
  522.         nColors) {
  523.         /* check palette parameters: */
  524.         if (lppe == NULL || nColors < 0 || nColors > 256)
  525.             return 0;
  526. #ifdef _WIN32        
  527.         bitmapinfoSize += nColors * sizeof(PALETTEENTRY);
  528.         setPalette = 1;
  529. #endif        
  530.     }
  531.     /* check if we have sufficient amount of memory: */
  532.     if (nBISize < bitmapinfoSize)
  533.         return 0;
  534.     /* initialize bitmapinfo structure: */
  535.     memset((void *)lpbi, 0, bitmapinfoSize);
  536. #ifdef _WIN32    
  537.     lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  538. #else
  539.     lpbi->bmiHeader.biSize = sizeof(HXBitmapInfoHeader);
  540. #endif
  541.     
  542.     /* set image parameters: */
  543.     lpbi->bmiHeader.biWidth = dwWidth;
  544.     lpbi->bmiHeader.biHeight = dwHeight;
  545.     lpbi->bmiHeader.biPlanes = 1;
  546.     lpbi->bmiHeader.biSizeImage = ImageSize (cid, dwWidth, dwHeight);
  547.     /* set color format: */
  548.     SetBitmapColor (lpbi, cid);
  549. #ifdef _WIN32
  550.     /* set palette: */
  551.     if (setPalette)
  552.         SetBitmapPalette (lpbi, lppe, nColors);
  553. #endif
  554.     return bitmapinfoSize;  /* the number of bytes written */
  555. }
  556. #ifdef _WIN32
  557. #ifndef WINCE
  558. int SetDirectDrawColor (LPDDPIXELFORMAT lpddpf, int cid)
  559. {
  560.     LPCIDD lpcidd;
  561.     /* check input parameters: */
  562.     if (lpddpf == NULL ||
  563.         lpddpf->dwSize < sizeof(DDPIXELFORMAT) ||
  564.         cid < 0 || cid > NFORMATS || !(ciddTbl[cid].dwFlags & _DIRECTDRAW) ||
  565.         (lpcidd = ciddTbl[cid].lpDirectDrawCIDD) == NULL)
  566.         return -1;
  567.     /* set color-format releated fields in DDPIXELFORMAT: */
  568.     lpddpf->dwFourCC      = lpcidd->dwFourCC;
  569.     lpddpf->dwRGBBitCount = lpcidd->dwBitCount;
  570.     lpddpf->dwRBitMask    = lpcidd->dwBitMask[0];
  571.     lpddpf->dwGBitMask    = lpcidd->dwBitMask[1];
  572.     lpddpf->dwBBitMask    = lpcidd->dwBitMask[2];
  573.     /* set control flags: */
  574.     lpddpf->dwFlags = (lpddpf->dwFourCC == BI_RGB)? DDPF_RGB: DDPF_FOURCC;
  575.     /* success: */
  576.     return 0;
  577. }
  578. #endif
  579. /*
  580.  * Get bitmap palette.
  581.  * Use:
  582.  *  int GetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe);
  583.  * Input:
  584.  *  lpbi - pointer to BITMAPINFO structure
  585.  *  lppe - pointer to a buffer to contain palette entries
  586.  * Returns:
  587.  *  the number of colors in palette
  588.  *  0, if bitmap does not use palette.
  589.  */
  590. int GetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe)
  591. {
  592.     int i, n = 0;
  593.     /* check input parameters: */
  594.     if (lpbi != NULL && lppe != NULL &&
  595.         lpbi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) &&
  596.         lpbi->bmiHeader.biCompression == BI_RGB &&
  597.         lpbi->bmiHeader.biBitCount <= 8) {
  598.         /* get pointer to palette entries: */
  599.         RGBQUAD *prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->bmiHeader.biSize);
  600.         /* get number of entries to process: */
  601.         n = lpbi->bmiHeader.biClrUsed;
  602.         if (!n) n = 1U << lpbi->bmiHeader.biBitCount; /* !!! */
  603.         /* a DIB color table has its colors stored BGR not RGB
  604.          * so flip them around: */
  605.         for (i = 0; i < n; i ++) {
  606.             lppe[i].peRed   = prgb[i].rgbRed;
  607.             lppe[i].peGreen = prgb[i].rgbGreen;
  608.             lppe[i].peBlue  = prgb[i].rgbBlue;
  609.             lppe[i].peFlags = 0;
  610.         }
  611.     }
  612.     /* return # of colors extracted */
  613.     return n;
  614. }
  615. /*
  616.  * Set bitmap palette.
  617.  * Use:
  618.  *  int SetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe, int n);
  619.  * Input:
  620.  *  lpbi - pointer to BITMAPINFO structure
  621.  *  lppe - pointer to a buffer containing palette entries
  622.  *  n    - the total number of colors in palette
  623.  * Returns:
  624.  *  the number of colors set
  625.  *  0, if bitmap does not use palette.
  626.  */
  627. int SetBitmapPalette (LPBITMAPINFO lpbi, LPPALETTEENTRY lppe, int nColors)
  628. {
  629.     int i, m, n = 0;
  630.     /* check input parameters: */
  631.     if (lpbi != NULL && lppe != NULL && nColors > 0 && nColors <= 256 &&
  632.         lpbi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) &&
  633.         lpbi->bmiHeader.biCompression == BI_RGB &&
  634.         lpbi->bmiHeader.biBitCount <= 8) {
  635.         /* get pointer to palette entries: */
  636.         RGBQUAD *prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->bmiHeader.biSize);
  637.         /* check the number of entries to copy: */
  638.         m = 1U << lpbi->bmiHeader.biBitCount; /* !!! */
  639.         n = nColors; if (n > m) n = m;
  640.         /* a DIB color table has its colors stored BGR not RGB
  641.          * so flip them around: */
  642.         for (i = 0; i < n; i ++) {
  643.             prgb[i].rgbRed      = lppe[i].peRed;
  644.             prgb[i].rgbGreen    = lppe[i].peGreen;
  645.             prgb[i].rgbBlue     = lppe[i].peBlue;
  646.             prgb[i].rgbReserved = 0;
  647.         }
  648.         /* set number of palette entries copied: */
  649.         if (i == m) i = 0;  /* !!! */
  650.         lpbi->bmiHeader.biClrUsed = i;
  651.         lpbi->bmiHeader.biClrImportant = i;
  652.     }
  653.     /* return # of colors set */
  654.     return n;
  655. }
  656. /*
  657.  * Check the validity of a bitmap structure.
  658.  * Use:
  659.  *  int CheckBitmap (LPBITMAPINFO lpbi);
  660.  * Input:
  661.  *  lpbi - pointer to BITMAPINFO structure to check
  662.  * Returns:
  663.  *  !0 - bitmap parameters are correct
  664.  *  0 - otherwise
  665.  */
  666. int CheckBitmap (LPBITMAPINFO lpbi)
  667. {
  668.     /* check bitmap pointer & format: */
  669.     register int cid = GetBitmapColor (lpbi);
  670.     if (cid == CID_UNKNOWN ||
  671.         !(ciddTbl[cid].dwFlags & _BITMAP) ||
  672.         lpbi->bmiHeader.biWidth <= 0 ||
  673.         lpbi->bmiHeader.biHeight <= 0 ||
  674.         lpbi->bmiHeader.biPlanes != 1 ||
  675.         lpbi->bmiHeader.biSizeImage != ImageSize (cid, lpbi->bmiHeader.biWidth, lpbi->bmiHeader.biHeight))
  676.         return 0;
  677.     /* check if image should contain a palette: */
  678.     if (lpbi->bmiHeader.biCompression == BI_RGB &&
  679.         lpbi->bmiHeader.biBitCount <= 8) {
  680.         /* check ## of palette entries: */
  681.         unsigned int m = 1U << lpbi->bmiHeader.biBitCount;
  682.         if (lpbi->bmiHeader.biClrUsed > m ||
  683.             lpbi->bmiHeader.biClrImportant > lpbi->bmiHeader.biClrUsed)
  684.             return 0;
  685.     } else /* no palette: */
  686.     if (lpbi->bmiHeader.biClrUsed != 0 ||
  687.         lpbi->bmiHeader.biClrImportant != 0)
  688.         return 0;
  689.     /* all tests passed... */
  690.     return 1;
  691. }
  692. #endif //_WIN32
  693. /* colormap.c -- end of file */