Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
7.4 KiB

  1. /*
  2. * i m a g e l s t . c p p
  3. *
  4. * Purpose:
  5. * utilities for images and imagelists
  6. *
  7. * Copyright (C) Microsoft Corp. 1996
  8. *
  9. */
  10. #include "pch.hxx"
  11. #include "resource.h" // idb stuff
  12. #include "imagelst.h"
  13. /////////////////////////////////////////////////////////////////////////////
  14. //
  15. // Macros
  16. //
  17. #define ILT_PARTIALBLT_LEFT 0
  18. #define ILT_PARTIALBLT_TOP 1
  19. #define ILT_PARTIALBLT_RIGHT 2
  20. #define ILT_PARTIALBLT_BOTTOM 3
  21. /////////////////////////////////////////////////////////////////////////////
  22. //
  23. // Global Data
  24. //
  25. static HIMAGELIST g_himlAthSm = NULL;
  26. static HIMAGELIST g_himlAthSt = NULL;
  27. /////////////////////////////////////////////////////////////////////////////
  28. //
  29. // Prototypes
  30. //
  31. HIMAGELIST InitImageList(int cx, int cy, LPSTR szbm, int cicon);
  32. //
  33. // TileImage
  34. //
  35. // This function tiles a bitmap in lprcDest, using lpptOrigin as the origin
  36. //
  37. void TileImage(HBITMAP hbmp, HDC hdc, LPPOINT lpptOrigin, LPRECT lprcDest)
  38. {
  39. BOOL fFirstRow, fFirstCol;
  40. int nRows, nCols, nSaveCols, offset;
  41. int rgOffsetPartialBlt[4];
  42. POINT ptTileOrigin, ptDraw, ptDest, ptSrc;
  43. SIZE sizeImage, sizeRect, sizeBlt;
  44. HDC hdcBmp=0;
  45. HBITMAP hbmpOrig=0;
  46. BITMAP bm;
  47. if(!hdc)
  48. return;
  49. if(!(hdcBmp = CreateCompatibleDC(hdc)))
  50. goto fail;
  51. if(!(hbmpOrig = SelectBitmap(hdcBmp, hbmp)))
  52. goto fail;
  53. GetObject(hbmp, sizeof(BITMAP), &bm);
  54. sizeImage.cx = bm.bmWidth;
  55. sizeImage.cy = bm.bmHeight;
  56. // Generate the true origin with the tile
  57. lpptOrigin->x %= sizeImage.cx;
  58. lpptOrigin->y %= sizeImage.cy;
  59. // We will start the tile so that the origin lines up
  60. ptTileOrigin.x = lprcDest->left - lpptOrigin->x;
  61. ptTileOrigin.y = lprcDest->top - lpptOrigin->y;
  62. // Figure out how many rows and columns wo need
  63. sizeRect.cx = lprcDest->right - ptTileOrigin.x;
  64. sizeRect.cy = lprcDest->bottom - ptTileOrigin.y;
  65. nRows = sizeRect.cy / sizeImage.cy;
  66. nRows += (sizeRect.cy % sizeImage.cy) ? 1 : 0;
  67. nSaveCols = sizeRect.cx / sizeImage.cx;
  68. nSaveCols += (sizeRect.cx % sizeImage.cx) ? 1 : 0;
  69. // Generate the partial blt offsets
  70. rgOffsetPartialBlt[ILT_PARTIALBLT_TOP] = lprcDest->top - ptTileOrigin.y;
  71. rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT] = lprcDest->left - ptTileOrigin.x;
  72. if (sizeImage.cy >= sizeRect.cy)
  73. rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = sizeImage.cy - sizeRect.cy;
  74. else if(sizeRect.cy % sizeImage.cy)
  75. rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = sizeImage.cy -
  76. (sizeRect.cy % sizeImage.cy);
  77. else
  78. rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = 0;
  79. if (sizeImage.cx >= sizeRect.cx)
  80. rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = sizeImage.cx - sizeRect.cx;
  81. else if(sizeRect.cx % sizeImage.cx)
  82. rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = sizeImage.cx -
  83. (sizeRect.cx % sizeImage.cx);
  84. else
  85. rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = 0;
  86. // Draw the tiles
  87. ptDraw.y = ptTileOrigin.y;
  88. fFirstRow = TRUE;
  89. while (nRows--)
  90. {
  91. ptDraw.x = ptTileOrigin.x;
  92. nCols = nSaveCols;
  93. fFirstCol = TRUE;
  94. while (nCols--)
  95. {
  96. ptDest = ptDraw;
  97. sizeBlt = sizeImage;
  98. ptSrc.x = ptSrc.y = 0;
  99. // Handle partial boundary Blts
  100. if (fFirstRow && rgOffsetPartialBlt[ILT_PARTIALBLT_TOP] != 0)
  101. {
  102. offset = rgOffsetPartialBlt[ILT_PARTIALBLT_TOP];
  103. ptDest.y += offset;
  104. sizeBlt.cy -= offset;
  105. ptSrc.y += offset;
  106. }
  107. if (nRows == 0 && rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] != 0)
  108. sizeBlt.cy -= rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM];
  109. if (fFirstCol && rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT] != 0)
  110. {
  111. offset = rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT];
  112. ptDest.x += offset;
  113. sizeBlt.cx -= offset;
  114. ptSrc.x += offset;
  115. }
  116. if (nCols == 0 && rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] != 0)
  117. sizeBlt.cx -= rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT];
  118. // Just do it
  119. BitBlt(hdc, ptDest.x, ptDest.y, sizeBlt.cx, sizeBlt.cy,
  120. hdcBmp, ptSrc.x, ptSrc.y, SRCCOPY);
  121. ptDraw.x += sizeImage.cx;
  122. fFirstCol = FALSE;
  123. }
  124. ptDraw.y += sizeImage.cy;
  125. fFirstRow = FALSE;
  126. }
  127. fail:
  128. if(hdcBmp)
  129. {
  130. if(hbmpOrig)
  131. SelectBitmap(hdcBmp, hbmpOrig);
  132. DeleteDC(hdcBmp);
  133. }
  134. }
  135. HIMAGELIST InitImageList(int cx, int cy, LPCSTR szbm, int cicon, COLORREF cr)
  136. {
  137. HBITMAP hbm;
  138. HIMAGELIST himl;
  139. if(!fIsWhistler())
  140. himl = ImageList_Create(cx, cy, ILC_MASK, cicon, 0);
  141. else
  142. himl = ImageList_Create(cx, cy, ILC_COLOR32|ILC_MASK, cicon, 0);
  143. if (himl != NULL)
  144. {
  145. hbm = LoadBitmap(g_hLocRes, szbm);
  146. Assert(hbm != NULL);
  147. ImageList_AddMasked(himl, hbm, cr);
  148. DeleteObject((HGDIOBJ)hbm);
  149. }
  150. return(himl);
  151. }
  152. HIMAGELIST GetImageList(UINT fIml)
  153. {
  154. if (fIml == GIML_SMALL)
  155. {
  156. if (g_himlAthSm == NULL)
  157. {
  158. g_himlAthSm = InitImageList(cxImlSmall, cyImlSmall, MAKEINTRESOURCE(idb16x16), iiconSmMax, RGB(255, 0, 255));
  159. ImageList_SetOverlayImage(g_himlAthSm, iiconReplyOverlay, OVERLAY_REPLY);
  160. ImageList_SetOverlayImage(g_himlAthSm, iiconForwardOverlay, OVERLAY_FORWARD);
  161. }
  162. return(g_himlAthSm);
  163. }
  164. else if (fIml == GIML_STATE)
  165. {
  166. if (g_himlAthSt == NULL)
  167. g_himlAthSt = InitImageList(cxImlSmall, cyImlSmall, MAKEINTRESOURCE(idb16x16st), iiconStMax, RGB(255, 0, 255));
  168. return(g_himlAthSt);
  169. }
  170. return(NULL);
  171. }
  172. void FreeImageLists(void)
  173. {
  174. if (g_himlAthSm != NULL)
  175. {
  176. ImageList_Destroy(g_himlAthSm);
  177. g_himlAthSm = NULL;
  178. }
  179. if (g_himlAthSt != NULL)
  180. {
  181. ImageList_Destroy(g_himlAthSt);
  182. g_himlAthSt = NULL;
  183. }
  184. }
  185. BOOL LoadBitmapAndPalette(int idbmp, HBITMAP *phbmp, HPALETTE *phpal)
  186. {
  187. int i, n;
  188. HBITMAP hbmp;
  189. HPALETTE hpal;
  190. HDC hdcBitmap;
  191. DWORD adw[257];
  192. BOOL fret = FALSE;
  193. Assert(phbmp != NULL);
  194. Assert(phpal != NULL);
  195. hdcBitmap = NULL;
  196. *phbmp = NULL;
  197. *phpal = NULL;
  198. hbmp = (HBITMAP)LoadImage(g_hLocRes, MAKEINTRESOURCE(idbmp),
  199. IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
  200. if (hbmp == NULL)
  201. goto DoneLoadBitmap;
  202. hdcBitmap = CreateCompatibleDC(NULL);
  203. if (hdcBitmap == NULL)
  204. goto DoneLoadBitmap;
  205. SelectObject(hdcBitmap, (HGDIOBJ)hbmp);
  206. n = GetDIBColorTable(hdcBitmap, 0, 256, (LPRGBQUAD)&adw[1]);
  207. for (i = 1; i <= n; i++)
  208. adw[i] = RGB(GetBValue(adw[i]), GetGValue(adw[i]), GetRValue(adw[i]));
  209. adw[0] = MAKELONG(0x300, n);
  210. hpal = CreatePalette((LPLOGPALETTE)&adw[0]);
  211. if (hpal == NULL)
  212. goto DoneLoadBitmap;
  213. *phbmp = hbmp;
  214. *phpal = hpal;
  215. fret = TRUE;
  216. DoneLoadBitmap:
  217. if (hdcBitmap != NULL)
  218. DeleteDC(hdcBitmap);
  219. return(fret);
  220. }