home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / icm20 / icmview / dibs.h < prev    next >
C/C++ Source or Header  |  1997-09-07  |  6KB  |  119 lines

  1. //THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. //ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. //THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright  1994-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:
  9. //    DIBS.C
  10. //
  11. //  PURPOSE:
  12. //    Include file for DIBS.H
  13. //
  14. //  PLATFORMS:
  15. //    Windows 95, Windows NT
  16. //
  17. //  SPECIAL INSTRUCTIONS: N/A
  18. //
  19.  
  20. #include <math.h>
  21.  
  22. //
  23. // General pre-processor macros
  24. //
  25.  
  26. // Calculates fixed poit from floating point.
  27. #define __FXPTMANTISSA(d, f)  ( (DWORD)d << f )
  28. #define __FXPTFRACTION(d, f)  ( (DWORD)ldexp((d - (DWORD)d), f) )
  29. #define __FXPT32(d, f)      ( __FXPTMANTISSA(d, f) | __FXPTFRACTION(d, f) )
  30.  
  31. #define __FXPT2DOT30(d)   __FXPT32(d, 30)
  32. #define __FXPT16DOT16(d)  __FXPT32(d, 16)
  33.  
  34. // Max number of color bits that will have a full color table.
  35. #define MAX_BPP_COLOR_TABLE             8
  36.  
  37. // Macro to swap two values
  38. #define SWAP(x,y)   ((x)^=(y)^=(x)^=(y))
  39.  
  40. #define ABS(x)          (((x) >= 0) ? (x) : (-(x)))
  41.  
  42. #define PALVERSION      0x300
  43. #define MAXPALETTE      256     // max. # supported palette entries
  44.  
  45. #define RECTWIDTH(lpRect)     ((lpRect)->right - (lpRect)->left)
  46. #define RECTHEIGHT(lpRect)    ((lpRect)->bottom - (lpRect)->top)
  47.  
  48. // Header signatutes for various resources
  49. #define BFT_BITMAP 0x4d42   // 'BM'
  50.  
  51. // Intent flag to indicate to use what ever the bitmap header intent is.
  52. #define USE_BITMAP_INTENT       0xffffffff
  53.  
  54. // macro to determine if resource is a DIB
  55. #define ISDIB(bft) ((bft) == BFT_BITMAP)
  56.  
  57. // Universial macros to find bitmap's width and height.
  58. #define BITMAPWIDTH(lpbi)           (*(LPDWORD)lpbi >= sizeof(BITMAPINFOHEADER) ? lpbi->biWidth :  \
  59.                                     ((LPBITMAPCOREHEADER)lpbi)->bcWidth)
  60. #define BITMAPHEIGHT(lpbi)          (*(LPDWORD)lpbi >= sizeof(BITMAPINFOHEADER) ? lpbi->biHeight :  \
  61.                                     ((LPBITMAPCOREHEADER)lpbi)->bcHeight)
  62. #define BITMAPCOMPRESSION(lpbi)     (*(LPDWORD)lpbi >= sizeof(BITMAPINFOHEADER) ? lpbi->biCompression : BI_RGB)
  63. #define BITMAPIMAGESIZE(lpbi)       (*(LPDWORD)lpbi >= sizeof(BITMAPINFOHEADER) ? lpbi->biSizeImage : 0)
  64. #define BITMAPCSTYPE(lpbi)          (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER) ? ((PBITMAPV4HEADER)lpbi)->bV4CSType : LCS_sRGB)
  65. #define BITMAPCLRUSED(lpbi)         (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER) ? ((PBITMAPV4HEADER)lpbi)->bV4ClrUsed : 0)
  66. #define BITMAPCLRIMPORTANT(lpbi)    (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER) ? ((PBITMAPV4HEADER)lpbi)->bV4ClrImportant : 0)
  67. #define BITMAPREDMASK(lpbi)         ( (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER)) || (BITMAPCOMPRESSION(lpbi) == BI_BITFIELDS) ?         \
  68.                                     ((PBITMAPV4HEADER)lpbi)->bV4RedMask : 0)
  69. #define BITMAPGREENMASK(lpbi)       ( (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER)) || (BITMAPCOMPRESSION(lpbi) == BI_BITFIELDS) ?         \
  70.                                     ((PBITMAPV4HEADER)lpbi)->bV4GreenMask : 0)
  71. #define BITMAPBLUEMASK(lpbi)        ( (*(LPDWORD)lpbi >= sizeof(BITMAPV4HEADER)) || (BITMAPCOMPRESSION(lpbi) == BI_BITFIELDS) ?         \
  72.                                     ((PBITMAPV4HEADER)lpbi)->bV4BlueMask : 0)
  73. #define BITMAPINTENT(lpbi)          (*(LPDWORD)lpbi >= sizeof(BITMAPV5HEADER) ? ((PBITMAPV5HEADER)lpbi)->bV5Intent : LCS_GM_IMAGES)
  74.  
  75. // Macro to determine bitcount for all bitmap types.
  76. #define BITCOUNT(lpbi)      (*(LPDWORD)lpbi >= sizeof(BITMAPINFOHEADER) ? ((LPBITMAPINFOHEADER)lpbi)->biBitCount :  \
  77.                             ((LPBITMAPCOREHEADER)lpbi)->bcBitCount)
  78.  
  79. // Macro to determine to the DWORD aligned stride of a bitmap.
  80. #define WIDTHBYTES(lpbi)   (((BITMAPWIDTH(lpbi) * BITCOUNT(lpbi) + 31) & ~31) >> 3)
  81.  
  82. // Macro to calculate size of bitmap.
  83. #define BITMAPSIZE(lpbi)    ( 0 != BITMAPIMAGESIZE(lpbi) ? BITMAPIMAGESIZE(lpbi) : WIDTHBYTES(lpbi) * abs(BITMAPHEIGHT(lpbi)))
  84.  
  85. // Macros to query Bitmap header version
  86. #define IS_BITMAPCOREHEADER(lpbi) (sizeof(BITMAPCOREHEADER) == *(LPDWORD)lpbi)
  87. #define IS_BITMAPINFOHEADER(lpbi) (sizeof(BITMAPINFOHEADER) == *(LPDWORD)lpbi)
  88. #define IS_BITMAPV4HEADER(lpbi)   (sizeof(BITMAPV4HEADER)   == *(LPDWORD)lpbi)
  89. #define IS_BITMAPV5HEADER(lpbi)   (sizeof(BITMAPV5HEADER)   == *(LPDWORD)lpbi)
  90.  
  91. // Macro to determine the size of profile data.
  92. #define PROFILESIZE(lpbi)   (*(LPDWORD)lpbi < sizeof(BITMAPV5HEADER) ? 0 :  \
  93.                             ((LPBITMAPV5HEADER)lpbi)->bV5ProfileSize)
  94.  
  95. // Macro to that returns pointer to DIB profile data.
  96. #define GETPROFILEDATA(lpbi)    (IS_BITMAPV5HEADER(lpbi) ? (LPBYTE)lpbi + ((LPBITMAPV5HEADER)lpbi)->bV5ProfileData : NULL)
  97.  
  98. // Given a pointer to a DIB header, return TRUE if is a Windows 3.0 style
  99. //  DIB, false if otherwise (PM style DIB).  Assume it is a Windows DIB if
  100. // size (the first DWORD) at least eqal to BITMAPINFOHEADER size.
  101.  
  102. #define IS_WIN30_DIB(lpbi)  ((*(LPDWORD) (lpbi)) >= sizeof (BITMAPINFOHEADER))
  103.  
  104.  
  105. // General STRUCTS && TYPEDEFS
  106.  
  107. // Function prototypes
  108. void      DIBPaint (HDC hDC, LPRECT lpDCRect, HGLOBAL hDIB,LPRECT lpDIBRect, LPDIBINFO lpDIBInfo);
  109. HGLOBAL   ReadDIBFile(LPTSTR lpszFileName);
  110. DWORD     PaletteSize(LPBITMAPINFOHEADER lpbi);
  111. HANDLE    ReadDIBFromFile(HANDLE hFile);
  112. HPALETTE  CreateDIBPalette(HANDLE hDIB);
  113. LPBYTE    FindDIBBits(LPBITMAPINFOHEADER lpbi);
  114. HANDLE    TransformDIBOutsideDC(HANDLE hDIB, BMFORMAT bmInput, LPTSTR lpszDestProfile,
  115.                                 LPTSTR lpszTargetProfile, DWORD dwIntent, PBMCALLBACKFN pBMCallback,
  116.                                 ULONG ulCallbackData);
  117. BOOL      SaveDIBToFile(HWND hWnd, LPCTSTR lpszFileName, LPDIBINFO lpDIBInfo, DWORD dwType);
  118.  
  119.