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.

6913 lines
184 KiB

  1. /*++
  2. Copyright (c) 1990-1992 Microsoft Corporation
  3. Module Name:
  4. htuimain.c
  5. Abstract:
  6. This module contains all the halftone user interface's dialog box
  7. procedures
  8. Author:
  9. 21-Apr-1992 Tue 11:48:33 created -by- Daniel Chou (danielc)
  10. [Environment:]
  11. GDI Device Driver - Halftone.
  12. [Notes:]
  13. Revision History:
  14. --*/
  15. #define _HTUI_APIS_
  16. #include <stddef.h>
  17. #include <windows.h>
  18. // #include <winddi.h>
  19. #include <commdlg.h>
  20. #include <dlgs.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <stdio.h>
  24. #include <ht.h>
  25. #include "htuidlg.h"
  26. #include "htuimain.h"
  27. #include "htuigif.h"
  28. #include "htuidlg.h"
  29. #define INCLUDE_DEF_CIEINFO
  30. #define _HTUI_CIEINFO_ONLY_
  31. #include "..\\ht\\htapi.h"
  32. extern
  33. HANDLE
  34. ReadGIFFile(
  35. HANDLE hFile
  36. );
  37. #if DBG
  38. #define SCREEN_BLT 0
  39. #if 0
  40. INT MyXOrg = 0;
  41. INT MyYOrg = 0;
  42. #endif
  43. #define HTUI_ASSERT(Msg, exp) if (!(exp)) { \
  44. DbgPrint("\n%s failed: %s line %d (%s)", Msg, __FILE__, __LINE__, #exp); }
  45. #else
  46. #define SCREEN_BLT 0
  47. #define HTUI_ASSERT(Msg, exp)
  48. #endif
  49. #define ABSL(n) (((n) < 0) ? -(n) : (n))
  50. #define PBIH_HDR_SIZE(pbih) (UINT)(((pbih)->biSize) + \
  51. (((pbih)->biCompression == BI_BITFIELDS) ? \
  52. 12 : (pbih)->biClrUsed * sizeof(RGBQUAD)))
  53. #define BIH_HDR_SIZE(bih) (UINT)(((bih).biSize) + \
  54. (((bih).biCompression == BI_BITFIELDS) ? \
  55. 12 : (bih).biClrUsed * sizeof(RGBQUAD)))
  56. extern HMODULE hHTUIModule;
  57. HANDLE
  58. GetNewDIBFromFile(
  59. PHTCLRADJPARAM pHTClrAdjParam,
  60. BOOL Default
  61. );
  62. //***************************************************************************
  63. // Following are locally used #defines and structures
  64. //***************************************************************************
  65. #define VSRC_PIC_DEF_DIB 0
  66. #define VSRC_PIC_LOADED 1
  67. #define VSRC_REFCOLORS 2
  68. #define VSRC_RGB 3
  69. #define VSRC_NTSC_BAR 4
  70. #define VSRC_MAX 4
  71. #define VSRC_TEST_COUNT (FILL_MODE_MAX + 1)
  72. #define VSRC_TEST_START VSRC_REFCOLORS
  73. #define DEFAULT_VSRC VSRC_RGB
  74. #define VSRC_LB_ID_START L'A'
  75. #define VSRC_LB_ID_SEPARATOR L'.'
  76. #define ADJ_CA(a,min,max) if (a < min) { a = min; } else \
  77. if (a > max) { a = max; }
  78. #define XCHG(a,b,c) (c)=(a); (a)=(b); (b)=(c)
  79. #define TDI_REFCOLORS 0
  80. #define TDI_RGBTEST 1
  81. #define TDI_NTSC 2
  82. #define TDI_CLRPAL 3
  83. #define TDI_MAX_INDEX 3
  84. #define TDI_DEFAULT (DEFAULT_VSRC - VSRC_TEST_START)
  85. typedef struct _TESTDIBINFO {
  86. HANDLE hDIB; // if non null then is a DIB handle
  87. WORD cx; // cx Size of the bitmap
  88. WORD cy; // cy Size of the bitmap
  89. WORD ClrUsed; // num of clolor used
  90. BYTE bpp; // BitsPerPel
  91. BYTE yStrips; // total bitmap vertical strips
  92. LPWORD pRatioY; // ratio for each y strip
  93. LPBYTE pPalette; // pointer to the palette R/G/B/R/G/B
  94. LPBYTE pBmp; // pointer to the bitmap strips
  95. } TESTDIBINFO, FAR *PTESTDIBINFO;
  96. HWND hWndUITop = (HWND)NULL;
  97. HWND hWndUIDlg = (HWND)NULL;
  98. WNDPROC WndProcUITop = (WNDPROC)NULL;
  99. typedef struct _HTBLT {
  100. HDC hDCMem;
  101. HBITMAP hMemBmp;
  102. HPALETTE hBmpPal;
  103. RECT rcMemBmp;
  104. } HTBLT, FAR *PHTBLT;
  105. #define CREATE_PHTBLT(pHTCAP) pHTCAP->pCallerTitle = \
  106. (LPWSTR)LocalAlloc(LPTR, sizeof(HTBLT))
  107. #define DELETE_PHTBLT(pHTCAP) if (pHTCAP->pCallerTitle) { \
  108. pHTCAP->pCallerTitle = (LPWSTR)LocalFree((HLOCAL)pHTCAP->pCallerTitle); \
  109. HTUI_ASSERT("DELETE_PHTBLT", pHTCAP->pCallerTitle == NULL); }
  110. #define GET_PHTBLT(pHTCAP) (PHTBLT)(pHTCAP->pCallerTitle)
  111. BYTE NTSCRGB[] = {
  112. 191, 191,191, // 0:GY Gray
  113. 191, 191, 0, // 1:Y Yellow
  114. 0, 191,191, // 2:C Cyan
  115. 0, 191, 0, // 3:G Green
  116. 191, 0,191, // 4:M Magenta
  117. 191, 0, 0, // 5:R Red
  118. 0, 0,191, // 6:B Blue
  119. 0, 76,127, // 7:I I in YIQ
  120. 255, 255,255, // 8:W White
  121. 75, 0,139, // 9:Q Q in YIQ
  122. 0, 0, 0, // 10:BK Black
  123. 3, 3, 3, // 11:BK+1 1% Gray
  124. 5, 5, 5, // 12:BK+2 2% Gray
  125. 8, 8, 8, // 13:BK+3 3% Gray
  126. 11, 11, 11, // 14:BK+4 4% Gray
  127. 13, 13, 13 // 15:BK+5 5% Gray
  128. };
  129. WORD NTSCRatioY[] = { 6700, 800, 2500 };
  130. BYTE NTSCBmp[] = {
  131. 0x00,0x00,0x11,0x11,0x22,0x22,0x33,0x33,0x44,0x44,0x55,0x55,0x66,0x66,
  132. 0x66,0x66,0xaa,0xaa,0x44,0x44,0xaa,0xaa,0x22,0x22,0xaa,0xaa,0x00,0x00,
  133. 0x77,0x77,0x78,0x88,0x88,0x99,0x99,0x9a,0xaa,0xaa,0xbb,0xcc,0xdd,0xee
  134. };
  135. BYTE RefClrRGB[] = {
  136. 30, 18, 12, // A. dark skin
  137. 127, 86, 64, // B. light skin
  138. 36, 46, 82, // C. blue sky
  139. 25, 36, 13, // D. foliage
  140. 61, 53, 112, // E. blue flowers
  141. 69, 143, 113, // F. bluish green
  142. 141, 61, 11, // G. orange
  143. 20, 19, 81, // H. purplish blue
  144. 101, 25, 33, // I. moderate red
  145. 16, 5, 23, // J. purple
  146. 106, 148, 20, // K. yellow green
  147. 173, 109, 15, // L. orange yellow
  148. 6, 4, 42, // M. blue
  149. 33, 81, 19, // N. green
  150. 68, 7, 11, // O. red
  151. 203, 173, 15, // P. yellow
  152. 96, 20, 75, // Q. magenta
  153. 16, 57, 93, // R. cyan
  154. 255, 255, 255, // S. white
  155. 164, 164, 165, // T. neutral 8
  156. 97, 97, 97, // U. neutral 6.5
  157. 49, 49, 49, // V. neutral 5
  158. 18, 17, 17, // W. neutral 3.5
  159. 0, 0, 0 // X. black
  160. };
  161. WORD RefClrRatioY[] = { 2500, 2500, 2500, 2500 };
  162. BYTE RefClrBmp[] = {
  163. 0, 1, 2, 3, 4, 5,
  164. 6, 7, 8, 9, 10, 11,
  165. 12, 13, 14, 15, 16, 17,
  166. 18, 19, 20, 21, 22, 23
  167. };
  168. BYTE RGBTestRGB[] = {
  169. 26, 0, 0, 77, 0, 0,128, 0, 0,179, 0, 0,230, 0, 0, // R 216
  170. 255, 26, 26,255, 77, 77,255,128,128,255,179,179,255,230,230, // 221
  171. 0, 26, 0, 0, 77, 0, 0,128, 0, 0,179, 0, 0,230, 0, // G 226
  172. 26,255, 26, 77,255, 77,128,255,128,179,255,179,230,255,230, // 231
  173. 0, 0, 26, 0, 0, 77, 0, 0,128, 0, 0,179, 0, 0,230, // B 236
  174. 26, 26,255, 77, 77,255,128,128,255,179,179,255,230,230,255, // 241
  175. 18, 18, 18, 36, 36, 36, 69, 69, 69, 87, 87, 87,120,120,120, // W 246
  176. 138,138,138,171,171,171,189,189,189,227,227,227,240,240,240 // 251
  177. };
  178. WORD RGBTestRatioY[] = {
  179. 900, 900, 900, 900, 900, 900,
  180. 1200, 1600, 600, 600, 600
  181. };
  182. BYTE RGBTestBmp[] = {
  183. // 6:6:6 Color Cube
  184. 0, 1, 2, 3, 4, 5, 36, 37, 38, 39, 40, 41, 72, 73, 74, 75, 76, 77,
  185. 108,109,110,111,112,113, 144,145,146,147,148,149, 180,181,182,183,184,185,
  186. 6, 7, 8, 9, 10, 11, 42, 43, 44, 45, 46, 47, 78, 79, 80, 81, 82, 83,
  187. 114,115,116,117,118,119, 150,151,152,153,154,155, 186,187,188,189,190,191,
  188. 12, 13, 14, 15, 16, 17, 48, 49, 50, 51, 52, 53, 84, 85, 86, 87, 88, 89,
  189. 120,121,122,123,124,125, 156,157,158,159,160,161, 192,193,194,195,196,197,
  190. 18, 19, 20, 21, 22, 23, 54, 55, 56, 57, 58, 59, 90, 91, 92, 93, 94, 95,
  191. 126,127,128,129,130,131, 162,163,164,165,166,167, 198,199,200,201,202,203,
  192. 24, 25, 26, 27, 28, 29, 60, 61, 62, 63, 64, 65, 96, 97, 98, 99,100,101,
  193. 132,133,134,135,136,137, 168,169,170,171,172,173, 204,205,206,207,208,209,
  194. 30, 31, 32, 33, 34, 35, 66, 67, 68, 69, 70, 71, 102,103,104,105,106,107,
  195. 138,139,140,141,142,143, 174,175,176,177,178,179, 210,211,212,213,214,215,
  196. // Gray Scale
  197. 0, 0, 0, 0, 246,246, 247,247, 43, 43,248,248, 249,249, 86, 86,250,250,
  198. 251,251,129,129,252,252, 253,253,172,172,254,254, 255,255,215,215,215,215,
  199. // Hue
  200. 180,186,192,198,204,210, 174,138,102, 66, 30, 31, 32, 33, 34, 35, 29, 23,
  201. 17, 11, 5, 41, 77,113, 149,185,184,183,182,181, 180,186,192,198,204,210,
  202. // Red Dark/Lightness
  203. 216, 36, 36,217,217, 72, 72,218,218,108,108,219, 219,144,144,220,220,180,
  204. 180,221,221,187,187,222, 222,194,194,223,223,201, 201,224,224,208,208,225,
  205. // Green Dark/Lightness
  206. 226, 6, 6,227,227, 12, 12,228,228, 18, 18,229, 229, 24, 24,230,230, 30,
  207. 30,231,231, 67, 67,232, 232,104,104,233,233,141, 141,234,234,178,178,235,
  208. // Blue Dark/Lightness
  209. 236, 1, 1,237,237, 2, 2,238,238, 3, 3,239, 239, 4, 4,240,240, 5,
  210. 5,241,241, 47, 47,242, 242, 89, 89,243,243,131, 131,244,244,173,173,245
  211. };
  212. TESTDIBINFO TestDIBInfo[TDI_MAX_INDEX + 1] = {
  213. { NULL, 6, 4, 24, 8, 4, RefClrRatioY, RefClrRGB, RefClrBmp },
  214. { NULL, 36, 30, 256, 8,11, RGBTestRatioY, RGBTestRGB, RGBTestBmp },
  215. { NULL, 28, 21, 16, 4, 3, NTSCRatioY, NTSCRGB, NTSCBmp },
  216. { NULL, 16, 16, 256, 8, 0, NULL, NULL, NULL }
  217. };
  218. //***************************************************************************
  219. // Above are locally used #defines and structures
  220. //***************************************************************************
  221. WCHAR HTClrAdjSectionName[80];
  222. extern WCHAR BmpExt[];
  223. extern WCHAR FileOpenExtFilter[];
  224. extern WCHAR FileSaveExtFilter[];
  225. #if 0
  226. WCHAR BmpExt[] = L"BMP";
  227. WCHAR FileOpenExtFilter[] = L"*.bmp;*.dib;*.gif\0*.bmp;*.dib;*.gif\0*.bmp\0*.bmp\0*.dib\0*.dib\0*.gif\0*.gif\0All files (*.*)\0*.*\0\0";
  228. WCHAR FileSaveExtFilter[] = L"*.bmp;*.dib\0*.bmp;*.dib\0\0";
  229. #endif
  230. WORD IDDMonoGroup[] = {
  231. IDD_HT_COLOR_TITLE,
  232. IDD_HT_COLORFULNESS_SCROLL,
  233. IDD_HT_COLORFULNESS_INT,
  234. IDD_HT_TINT_TITLE,
  235. IDD_HT_RG_TINT_SCROLL,
  236. IDD_HT_RG_TINT_INT,
  237. IDD_HT_ILLUMINANT_TITLE,
  238. IDD_HT_ILLUMINANT_COMBO,
  239. 0
  240. };
  241. WORD IDDGammaGroup[] = {
  242. IDD_HT_R_GAMMA_SCROLL,
  243. IDD_HT_G_GAMMA_SCROLL,
  244. IDD_HT_B_GAMMA_SCROLL,
  245. 0
  246. };
  247. WORD IDDBmpTestGroup[] = {
  248. IDD_HT_SHOW_COMBO,
  249. IDD_HT_ZOOM,
  250. IDD_HT_PALETTE,
  251. IDD_HT_ASPECT_RATIO,
  252. IDD_HT_MIRROR,
  253. IDD_HT_UPSIDEDOWN,
  254. IDD_HT_OPEN,
  255. IDD_HT_SAVE_AS,
  256. IDD_HT_PIC_NAME,
  257. IDD_HT_HALFTONE_DESC,
  258. 0
  259. };
  260. typedef struct _DECICONVERT {
  261. WCHAR FormatStr[12];
  262. WORD Divider;
  263. } DECICONVERT;
  264. typedef struct _HTDEVADJSCROLL {
  265. WORD Min;
  266. WORD Max;
  267. WORD IDDText;
  268. WORD IDDScroll;
  269. BYTE DeciSize;
  270. BYTE Step;
  271. WORD Offset;
  272. } HTDEVADJSCROLL, FAR *PHTDEVADJSCROLL;
  273. #define OFF_DEVHTINFO(a) FIELD_OFFSET(DEVHTINFO, a)
  274. #define OFF_COLORINFO(a) OFF_DEVHTINFO(ColorInfo) + \
  275. FIELD_OFFSET(COLORINFO, a)
  276. #define OFF_CIEINFO(a,i) OFF_COLORINFO(a) + FIELD_OFFSET(CIECHROMA, i)
  277. #define OFF_DYEINFO(a) OFF_COLORINFO(a)
  278. DECICONVERT DeciConvert[] = {
  279. { L"%u", 1 },
  280. { L"%u%ls%01u", 10 },
  281. { L"%u%ls%02u", 100 },
  282. { L"%u%ls%03u", 1000 },
  283. { L"%u%ls%04u", 10000 }
  284. };
  285. WCHAR PelAsDevice[64];
  286. UDECI4 CIEcyNTSC[] = { 6280, 2460, // Red
  287. 2680, 5880, // Green
  288. 1500, 700, // Blue
  289. 2090, 3290, // Cyan
  290. 3890, 2080, // Magenta
  291. 4480, 4670, // Yellow
  292. 3127, 3290 }; // White (D65)
  293. #define NTSC_CIE_R_x_IDX 0
  294. #define NTSC_CIE_R_y_IDX 1
  295. #define NTSC_CIE_G_x_IDX 2
  296. #define NTSC_CIE_G_y_IDX 3
  297. #define NTSC_CIE_B_x_IDX 4
  298. #define NTSC_CIE_B_y_IDX 5
  299. #define NTSC_CIE_C_x_IDX 6
  300. #define NTSC_CIE_C_y_IDX 7
  301. #define NTSC_CIE_M_x_IDX 8
  302. #define NTSC_CIE_M_y_IDX 9
  303. #define NTSC_CIE_Y_x_IDX 10
  304. #define NTSC_CIE_Y_y_IDX 11
  305. #define NTSC_CIE_W_x_IDX 12
  306. #define NTSC_CIE_W_y_IDX 13
  307. #define NTSC_CIE_W_x CIEcyNTSC[NTSC_CIE_W_x_IDX]
  308. #define NTSC_CIE_W_y CIEcyNTSC[NTSC_CIE_W_y_IDX]
  309. #define MIN_ALIGNMENT_WHITE 2500
  310. #define MAX_ALIGNMENT_WHITE 40000
  311. #define STD_ALIGNMENT_WHITE 10000
  312. #define MIN_DYE_MIX 0
  313. #define MAX_DYE_MIX 9000
  314. #define MIN_DEVPEL 15
  315. #define MAX_DEVPEL 30000
  316. #define INCH_TO_MM(dpi) (WORD)((254000L+(DWORD)((dpi)>>1))/(DWORD)(dpi))
  317. #define MM_TO_INCH(mm) (WORD)((254000L+(DWORD)((mm)>>1))/(DWORD)(mm))
  318. #define PERCENT_FROM_SCROLL(p) (LONG)(p)=-(LONG)(p)-1+MIN_RES_PERCENT
  319. #define PEL_FROM_SCROLL(p,min) (LONG)(p)=(LONG)(p)-1+(min)
  320. #define PERCENT_TO_SCROLL(p) (LONG)(p)=-(LONG)((p)-MIN_RES_PERCENT+1)
  321. #define PEL_TO_SCROLL(p,min) (LONG)(p)=(LONG)(p)-(min)+1
  322. HTDEVADJSCROLL HTDevAdjScroll[] = {
  323. { MIN_DEVPEL, MAX_DEVPEL,
  324. IDD_HTDEV_PIXEL_TEXT, IDD_HTDEV_PIXEL_SCROLL,
  325. 4, 10, OFF_DEVHTINFO(DevPelsDPI) },
  326. { MIN_RGB_GAMMA, MAX_RGB_GAMMA,
  327. IDD_HTDEV_R_GAMMA_TEXT, IDD_HTDEV_R_GAMMA_SCROLL,
  328. 4, 100, OFF_COLORINFO(RedGamma) },
  329. { MIN_RGB_GAMMA, MAX_RGB_GAMMA,
  330. IDD_HTDEV_G_GAMMA_TEXT, IDD_HTDEV_G_GAMMA_SCROLL,
  331. 4, 100, OFF_COLORINFO(GreenGamma) },
  332. { MIN_RGB_GAMMA, MAX_RGB_GAMMA,
  333. IDD_HTDEV_B_GAMMA_TEXT, IDD_HTDEV_B_GAMMA_SCROLL,
  334. 4, 100, OFF_COLORINFO(BlueGamma) },
  335. { CIE_x_MIN, CIE_x_MAX,
  336. IDD_HTDEV_R_CIE_x_TEXT, IDD_HTDEV_R_CIE_x_SCROLL,
  337. 4, 100, OFF_CIEINFO(Red, x) },
  338. { CIE_y_MIN, CIE_y_MAX,
  339. IDD_HTDEV_R_CIE_y_TEXT, IDD_HTDEV_R_CIE_y_SCROLL,
  340. 4, 100, OFF_CIEINFO(Red, y) },
  341. { CIE_x_MIN, CIE_x_MAX,
  342. IDD_HTDEV_G_CIE_x_TEXT, IDD_HTDEV_G_CIE_x_SCROLL,
  343. 4, 100, OFF_CIEINFO(Green, x) },
  344. { CIE_y_MIN, CIE_y_MAX,
  345. IDD_HTDEV_G_CIE_y_TEXT, IDD_HTDEV_G_CIE_y_SCROLL,
  346. 4, 100, OFF_CIEINFO(Green, y) },
  347. { CIE_x_MIN, CIE_x_MAX,
  348. IDD_HTDEV_B_CIE_x_TEXT, IDD_HTDEV_B_CIE_x_SCROLL,
  349. 4, 100, OFF_CIEINFO(Blue, x) },
  350. { CIE_y_MIN, CIE_y_MAX,
  351. IDD_HTDEV_B_CIE_y_TEXT, IDD_HTDEV_B_CIE_y_SCROLL,
  352. 4, 100, OFF_CIEINFO(Blue, y) },
  353. { CIE_x_MIN, CIE_x_MAX,
  354. IDD_HTDEV_C_CIE_x_TEXT, IDD_HTDEV_C_CIE_x_SCROLL,
  355. 4, 100, OFF_CIEINFO(Cyan, x) },
  356. { CIE_y_MIN, CIE_y_MAX,
  357. IDD_HTDEV_C_CIE_y_TEXT, IDD_HTDEV_C_CIE_y_SCROLL,
  358. 4, 100, OFF_CIEINFO(Cyan, y) },
  359. { CIE_x_MIN, CIE_x_MAX,
  360. IDD_HTDEV_M_CIE_x_TEXT, IDD_HTDEV_M_CIE_x_SCROLL,
  361. 4, 100, OFF_CIEINFO(Magenta, x) },
  362. { CIE_y_MIN, CIE_y_MAX,
  363. IDD_HTDEV_M_CIE_y_TEXT, IDD_HTDEV_M_CIE_y_SCROLL,
  364. 4, 100, OFF_CIEINFO(Magenta, y) },
  365. { CIE_x_MIN, CIE_x_MAX,
  366. IDD_HTDEV_Y_CIE_x_TEXT, IDD_HTDEV_Y_CIE_x_SCROLL,
  367. 4, 100, OFF_CIEINFO(Yellow, x) },
  368. { CIE_y_MIN, CIE_y_MAX,
  369. IDD_HTDEV_Y_CIE_y_TEXT, IDD_HTDEV_Y_CIE_y_SCROLL,
  370. 4, 100, OFF_CIEINFO(Yellow, y) },
  371. { CIE_x_MIN, CIE_x_MAX,
  372. IDD_HTDEV_W_CIE_x_TEXT, IDD_HTDEV_W_CIE_x_SCROLL,
  373. 4, 100, OFF_CIEINFO(AlignmentWhite, x) },
  374. { CIE_y_MIN, CIE_y_MAX,
  375. IDD_HTDEV_W_CIE_y_TEXT, IDD_HTDEV_W_CIE_y_SCROLL,
  376. 4, 100, OFF_CIEINFO(AlignmentWhite, y) },
  377. { MIN_ALIGNMENT_WHITE, MAX_ALIGNMENT_WHITE,
  378. IDD_HTDEV_W_CIE_L_TEXT, IDD_HTDEV_W_CIE_L_SCROLL,
  379. 2, 100, OFF_CIEINFO(AlignmentWhite, Y) },
  380. { MIN_DYE_MIX, MAX_DYE_MIX,
  381. IDD_HTDEV_M_IN_C_TEXT, IDD_HTDEV_M_IN_C_SCROLL,
  382. 2, 100, OFF_DYEINFO(MagentaInCyanDye) },
  383. { MIN_DYE_MIX, MAX_DYE_MIX,
  384. IDD_HTDEV_Y_IN_C_TEXT, IDD_HTDEV_Y_IN_C_SCROLL,
  385. 2, 100, OFF_DYEINFO(YellowInCyanDye) },
  386. { MIN_DYE_MIX, MAX_DYE_MIX,
  387. IDD_HTDEV_C_IN_M_TEXT, IDD_HTDEV_C_IN_M_SCROLL,
  388. 2, 100, OFF_DYEINFO(CyanInMagentaDye) },
  389. { MIN_DYE_MIX, MAX_DYE_MIX,
  390. IDD_HTDEV_Y_IN_M_TEXT, IDD_HTDEV_Y_IN_M_SCROLL,
  391. 2, 100, OFF_DYEINFO(YellowInMagentaDye) },
  392. { MIN_DYE_MIX, MAX_DYE_MIX,
  393. IDD_HTDEV_C_IN_Y_TEXT, IDD_HTDEV_C_IN_Y_SCROLL,
  394. 2, 100, OFF_DYEINFO(CyanInYellowDye) },
  395. { MIN_DYE_MIX, MAX_DYE_MIX,
  396. IDD_HTDEV_M_IN_Y_TEXT, IDD_HTDEV_M_IN_Y_SCROLL,
  397. 2, 100, OFF_DYEINFO(MagentaInYellowDye) }
  398. };
  399. #define COUNT_HTDEVADJSCROLL COUNT_ARRAY(HTDevAdjScroll)
  400. //
  401. // The following BITMAPINFO (16) is used to SetDIBitsToDevice() for
  402. // halftoned BMF_4BPP_VGA16 format
  403. //
  404. #define HTCLRADJ_BK_BRUSH LTGRAY_BRUSH
  405. #define HTCLRADJ_DEST_PRIM_ORDER PRIMARY_ORDER_BGR
  406. //
  407. // This is used for scroll control in the dialog box.
  408. //
  409. #define HTCAS_SHORT 0x01
  410. #define HTCAS_SYNC_RGB 0x02
  411. typedef struct _HTCLRADJSCROLL {
  412. SHORT Min;
  413. SHORT Max;
  414. BYTE Mul;
  415. BYTE Step;
  416. BYTE Offset;
  417. BYTE Flags;
  418. } HTCLRADJSCROLL;
  419. #define OFF_HTCLRADJ(x) FIELD_OFFSET(COLORADJUSTMENT,x)
  420. #define HTCLRADJSCROLL_R_GAMMA HTClrAdjScroll[6]
  421. #define HTCLRADJSCROLL_G_GAMMA HTClrAdjScroll[7]
  422. #define HTCLRADJSCROLL_B_GAMMA HTClrAdjScroll[8]
  423. #define CAS_MIN_GAMMA ((MIN_RGB_GAMMA + 9) / 10)
  424. #define CAS_MAX_GAMMA ((MAX_RGB_GAMMA + 9) / 10)
  425. #define RGB_GAMMA_CAS CAS_MIN_GAMMA,CAS_MAX_GAMMA,10,25
  426. HTCLRADJSCROLL HTClrAdjScroll[TOTAL_HTCLRADJ_SCROLL] = {
  427. { -100, 100, 1, 2, OFF_HTCLRADJ(caContrast), HTCAS_SHORT },
  428. { -100, 100, 1, 2, OFF_HTCLRADJ(caBrightness), HTCAS_SHORT },
  429. { -100, 100, 1, 2, OFF_HTCLRADJ(caColorfulness), HTCAS_SHORT },
  430. { -100, 100, 1, 2, OFF_HTCLRADJ(caRedGreenTint), HTCAS_SHORT },
  431. { 0, 400,10,10, OFF_HTCLRADJ(caReferenceBlack), 0 },
  432. { 600,1000,10,10, OFF_HTCLRADJ(caReferenceWhite), 0 },
  433. { RGB_GAMMA_CAS, OFF_HTCLRADJ(caRedGamma), 0 },
  434. { RGB_GAMMA_CAS, OFF_HTCLRADJ(caGreenGamma), 0 },
  435. { RGB_GAMMA_CAS, OFF_HTCLRADJ(caBlueGamma), 0 }
  436. };
  437. #define IS_BMP_AT_TOP(f) ((f & (HT_BMP_AT_TOP | HT_BMP_ZOOM)) == \
  438. (HT_BMP_AT_TOP | HT_BMP_ZOOM))
  439. #ifdef HTUIX_STATIC_HALFTONE
  440. #define PBEG_IMAGE(p) (LPBYTE)(p) + PBIH_HDR_SIZE(p)
  441. #define GET_SCANLINEDELTA(p) -(LONG)ALIGNED_32((p)->biWidth,(p)->biBitCount)
  442. #define GET_SCAN0_OFFSET(y,d) ((y - 1) * -(d))
  443. #define GET_PPLANE(p,d) PBEG_IMAGE(p)+GET_SCAN0_OFFSET((p)->biHeight,d)
  444. typedef struct _HTLOGPAL16 {
  445. WORD Version;
  446. WORD Count;
  447. PALETTEENTRY PalEntry[16];
  448. } HTLOGPAL16;
  449. typedef struct _HTUI_DIBINFO {
  450. BITMAPINFOHEADER bi;
  451. RGBQUAD rgb[256];
  452. } HTUI_DIBINFO, *PHTUI_DIBINFO;
  453. DWORD HTUI_HTSurf = BMF_4BPP_VGA16;
  454. DWORD HTUI_DIBMode = DIB_RGB_COLORS;
  455. HPALETTE HTUI_hHTPal = NULL;
  456. PDEVICEHALFTONEINFO HTUI_pDHI = NULL;
  457. LPBYTE HTUI_pHTBits = NULL;
  458. HTUI_DIBINFO HTUI_DIBInfo;
  459. HTLOGPAL16 LogPalVGA16 = {
  460. 0x300,
  461. 16,
  462. {
  463. { 0, 0, 0, 0 }, // 0 Black
  464. { 0x80,0, 0, 0 }, // 1 Dark Red
  465. { 0, 0x80,0, 0 }, // 2 Dark Green
  466. { 0x80,0x80,0, 0 }, // 3 Dark Yellow
  467. { 0, 0, 0x80,0 }, // 4 Dark Blue
  468. { 0x80,0, 0x80,0 }, // 5 Dark Magenta
  469. { 0, 0x80,0x80,0 }, // 6 Dark Cyan
  470. { 0x80,0x80,0x80,0 }, // 7 Gray 50%
  471. { 0xC0,0xC0,0xC0,0 }, // 8 Gray 75%
  472. { 0xFF,0, 0, 0 }, // 9 Red
  473. { 0, 0xFF,0, 0 }, // 10 Green
  474. { 0xFF,0xFF,0, 0 }, // 11 Yellow
  475. { 0, 0, 0xFF,0 }, // 12 Blue
  476. { 0xFF,0, 0xFF,0 }, // 13 Magenta
  477. { 0, 0xFF,0xFF,0 }, // 14 Cyan
  478. { 0xFF,0xFF,0xFF,0 } // 15 White
  479. }
  480. };
  481. LONG
  482. TestDevHTInfo(
  483. HWND hWndOwner,
  484. PHTDEVADJPARAM pHTDevAdjParam
  485. )
  486. {
  487. //FARPROC pfnDlgCallBack;
  488. PDEVHTINFO pDevHTInfo;
  489. PCOLORINFO pColorInfo;
  490. HTCLRADJPARAM HTClrAdjParam;
  491. CIEINFO CIEInfo;
  492. SOLIDDYESINFO DyesInfo;
  493. HTINITINFO HTInitInfo;
  494. DWORD DevPelsDPI;
  495. LONG Result;
  496. ZeroMemory(&HTClrAdjParam, sizeof(HTCLRADJPARAM));
  497. ZeroMemory(&HTInitInfo, sizeof(HTINITINFO));
  498. pDevHTInfo = &(pHTDevAdjParam->CurHTInfo);
  499. pColorInfo = &(pHTDevAdjParam->CurHTInfo.ColorInfo);
  500. CIEInfo.Red.x = (UDECI4)pColorInfo->Red.x;
  501. CIEInfo.Red.y = (UDECI4)pColorInfo->Red.y;
  502. CIEInfo.Red.Y = (UDECI4)pColorInfo->Red.Y;
  503. CIEInfo.Green.x = (UDECI4)pColorInfo->Green.x;
  504. CIEInfo.Green.y = (UDECI4)pColorInfo->Green.y;
  505. CIEInfo.Green.Y = (UDECI4)pColorInfo->Green.Y;
  506. CIEInfo.Blue.x = (UDECI4)pColorInfo->Blue.x;
  507. CIEInfo.Blue.y = (UDECI4)pColorInfo->Blue.y;
  508. CIEInfo.Blue.Y = (UDECI4)pColorInfo->Blue.Y;
  509. CIEInfo.Cyan.x = (UDECI4)pColorInfo->Cyan.x;
  510. CIEInfo.Cyan.y = (UDECI4)pColorInfo->Cyan.y;
  511. CIEInfo.Cyan.Y = (UDECI4)pColorInfo->Cyan.Y;
  512. CIEInfo.Magenta.x = (UDECI4)pColorInfo->Magenta.x;
  513. CIEInfo.Magenta.y = (UDECI4)pColorInfo->Magenta.y;
  514. CIEInfo.Magenta.Y = (UDECI4)pColorInfo->Magenta.Y;
  515. CIEInfo.Yellow.x = (UDECI4)pColorInfo->Yellow.x;
  516. CIEInfo.Yellow.y = (UDECI4)pColorInfo->Yellow.y;
  517. CIEInfo.Yellow.Y = (UDECI4)pColorInfo->Yellow.Y;
  518. CIEInfo.AlignmentWhite.x = (UDECI4)pColorInfo->AlignmentWhite.x;
  519. CIEInfo.AlignmentWhite.y = (UDECI4)pColorInfo->AlignmentWhite.y;
  520. CIEInfo.AlignmentWhite.Y = (UDECI4)pColorInfo->AlignmentWhite.Y;
  521. DyesInfo.MagentaInCyanDye = (UDECI4)pColorInfo->MagentaInCyanDye;
  522. DyesInfo.YellowInCyanDye = (UDECI4)pColorInfo->YellowInCyanDye;
  523. DyesInfo.CyanInMagentaDye = (UDECI4)pColorInfo->CyanInMagentaDye;
  524. DyesInfo.YellowInMagentaDye = (UDECI4)pColorInfo->YellowInMagentaDye;
  525. DyesInfo.CyanInYellowDye = (UDECI4)pColorInfo->CyanInYellowDye;
  526. DyesInfo.MagentaInYellowDye = (UDECI4)pColorInfo->MagentaInYellowDye;
  527. HTInitInfo.Version = HTINITINFO_VERSION;
  528. HTInitInfo.Flags = (WORD)pDevHTInfo->HTFlags;
  529. HTInitInfo.HTPatternIndex = (WORD)pDevHTInfo->HTPatternSize;
  530. HTInitInfo.HTCallBackFunction = NULL;
  531. HTInitInfo.pHalftonePattern = NULL;
  532. HTInitInfo.pInputRGBInfo = NULL;
  533. HTInitInfo.pDeviceCIEInfo = &CIEInfo;
  534. HTInitInfo.pDeviceSolidDyesInfo = &DyesInfo;
  535. HTInitInfo.DevicePowerGamma = (UDECI4)pDevHTInfo->ColorInfo.RedGamma;
  536. DevPelsDPI = (DWORD)(pHTDevAdjParam->CurHTInfo.DevPelsDPI);
  537. HTInitInfo.DeviceResXDPI = (WORD)pHTDevAdjParam->DevHTAdjData.DeviceXDPI;
  538. HTInitInfo.DeviceResYDPI = (WORD)pHTDevAdjParam->DevHTAdjData.DeviceXDPI;
  539. HTInitInfo.DevicePelsDPI = (WORD)((DevPelsDPI <= HTDevAdjScroll0].Min) ?
  540. ? 0 : DevPelsDPI);
  541. HTInitInfo.DefHTColorAdjustment = DefaultCA;
  542. HTClrAdjParam.pCallerTitle = pHTDevAdjParam->pDeviceName;
  543. HTClrAdjParam.pHTInitInfo = &HTInitInfo;
  544. HTClrAdjParam.RedGamma = (UDECI4)pDevHTInfo->ColorInfo.RedGamma;
  545. HTClrAdjParam.GreenGamma = (UDECI4)pDevHTInfo->ColorInfo.GreenGamma;
  546. HTClrAdjParam.BlueGamma = (UDECI4)pDevHTInfo->ColorInfo.BlueGamma;
  547. HTClrAdjParam.ViewMode = VIEW_MODE_REFCOLORS;
  548. HTClrAdjParam.BmpNeedUpdate = 1;
  549. if (!(pHTDevAdjParam->DevHTAdjData.DeviceFlags & DEVHTADJF_COLOR_DEVICE)) {
  550. HTClrAdjParam.Flags |= HTCAPF_SHOW_MONO;
  551. }
  552. //pfnDlgCallBack = (FARPROC)MakeProcInstance(HTClrAdjDlgProc,
  553. // hHTUIModule);
  554. //Result = (LONG)DialogBoxParam(hHTUIModule,
  555. // MAKEINTRESOURCE(HTCLRADJDLG),
  556. // hWndOwner,
  557. // (DLGPROC)pfnDlgCallBack,
  558. // (LONG)&HTClrAdjParam);
  559. //FreeProcInstance(pfnDlgCallBack);
  560. Result = (LONG)DialogBoxParam(hHTUIModule,
  561. MAKEINTRESOURCE(HTCLRADJDLG),
  562. hWndOwner,
  563. HTClrAdjDlgProc,
  564. (LONG)&HTClrAdjParam);
  565. return(Result);
  566. }
  567. HPALETTE
  568. HTUI_CreateHalftonePalette(
  569. PHTCLRADJPARAM pHTClrAdjParam
  570. )
  571. {
  572. HDC hDC;
  573. HTINITINFO HTInitInfo;
  574. INT cPal;
  575. hDC = pHTClrAdjParam->hDCDlg;
  576. if (!HTUI_pDHI) {
  577. HTUI_DIBInfo.bi.biSize = sizeof(BITMAPINFOHEADER);
  578. HTUI_DIBInfo.bi.biWidth = 0;
  579. HTUI_DIBInfo.bi.biHeight = 0;
  580. HTUI_DIBInfo.bi.biPlanes = 1;
  581. HTUI_DIBInfo.bi.biBitCount = 4;
  582. HTUI_DIBInfo.bi.biCompression = BI_RGB;
  583. HTUI_DIBInfo.bi.biSizeImage = 0;
  584. HTUI_DIBInfo.bi.biXPelsPerMeter = 0;
  585. HTUI_DIBInfo.bi.biYPelsPerMeter = 0;
  586. HTUI_DIBInfo.bi.biClrUsed = 0;
  587. HTUI_DIBInfo.bi.biClrImportant = 0;
  588. cPal = (INT)GetDeviceCaps(hDC, SIZEPALETTE);
  589. if (cPal >= 32768) {
  590. HTInitInfo.HTPatternIndex = HTPAT_SIZE_2x2_M;
  591. HTUI_DIBInfo.bi.biBitCount = 16;
  592. HTUI_DIBInfo.bi.biClrUsed = 0;
  593. HTUI_DIBInfo.bi.biCompression = BI_BITFIELDS;
  594. HTUI_HTSurf = BMF_16BPP_555;
  595. HTUI_DIBMode = DIB_PAL_INDICES;
  596. } else if (cPal >= 256) {
  597. HTInitInfo.HTPatternIndex = HTPAT_SIZE_4x4_M;
  598. HTUI_DIBInfo.bi.biBitCount = 8;
  599. HTUI_DIBInfo.bi.biClrUsed = 256;
  600. HTUI_HTSurf = BMF_8BPP_VGA256;
  601. } else {
  602. HTInitInfo.HTPatternIndex = HTPAT_SIZE_4x4_M;
  603. HTUI_DIBInfo.bi.biBitCount = 4;
  604. HTUI_DIBInfo.bi.biClrUsed = 16;
  605. HTUI_HTSurf = BMF_4BPP_VGA16;
  606. }
  607. if (pHTClrAdjParam->pHTInitInfo) {
  608. HTInitInfo = *(pHTClrAdjParam->pHTInitInfo);
  609. } else {
  610. HTInitInfo.Version = HTINITINFO_VERSION;
  611. HTInitInfo.Flags = HIF_ADDITIVE_PRIMS;
  612. HTInitInfo.DevicePowerGamma = UDECI4_1;
  613. HTInitInfo.HTCallBackFunction = NULL;
  614. HTInitInfo.pHalftonePattern = NULL;
  615. HTInitInfo.pInputRGBInfo = NULL;
  616. HTInitInfo.pDeviceCIEInfo = NULL;
  617. HTInitInfo.pDeviceSolidDyesInfo = NULL;
  618. HTInitInfo.DeviceResXDPI = (WORD)GetDeviceCaps(hDC, LOGPIXELSX);
  619. HTInitInfo.DeviceResYDPI = (WORD)GetDeviceCaps(hDC, LOGPIXELSY);
  620. HTInitInfo.DevicePelsDPI = 0;
  621. }
  622. if (HT_CreateDeviceHalftoneInfo(&HTInitInfo, &HTUI_pDHI) < 0) {
  623. return(NULL);
  624. }
  625. if (HTUI_HTSurf == BMF_8BPP_VGA256) {
  626. LPLOGPALETTE pPal;
  627. DWORD Size;
  628. cPal = (INT)HT_Get8BPPFormatPalette(NULL, 0, 0, 0);
  629. Size = (DWORD)(sizeof(LOGPALETTE) +
  630. (DWORD)((DWORD)cPal * sizeof(PALETTEENTRY)));
  631. if (pPal = (LPLOGPALETTE)LocalAlloc(LPTR, Size)) {
  632. HT_Get8BPPFormatPalette(&(pPal->palPalEntry[0]),
  633. pHTClrAdjParam->RedGamma,
  634. pHTClrAdjParam->GreenGamma,
  635. pHTClrAdjParam->BlueGamma);
  636. pPal->palVersion = 0x300;
  637. pPal->palNumEntries = (WORD)cPal;
  638. HTUI_hHTPal = CreatePalette(pPal);
  639. LocalFree((HLOCAL)pPal);
  640. }
  641. } else {
  642. cPal = (INT)LogPalVGA16.Count;
  643. HTUI_hHTPal = CreatePalette((LPLOGPALETTE)&LogPalVGA16);
  644. }
  645. if ((HTUI_hHTPal) && (HTUI_DIBInfo.bi.biCompression == BI_RGB)) {
  646. PALETTEENTRY Pal;
  647. INT i;
  648. HTUI_DIBInfo.bi.biClrImportant = (DWORD)cPal;
  649. for (i = 0; i < cPal; i++) {
  650. GetPaletteEntries(HTUI_hHTPal, (INT)i, 1, &Pal);
  651. HTUI_DIBInfo.rgb[i].rgbRed = Pal.peRed;
  652. HTUI_DIBInfo.rgb[i].rgbGreen = Pal.peGreen;
  653. HTUI_DIBInfo.rgb[i].rgbBlue = Pal.peBlue;
  654. HTUI_DIBInfo.rgb[i].rgbReserved = 0;
  655. #if 0
  656. DbgPrint("\nHTPAL %3u: = %3u:%3u:%3u",
  657. (UINT)i,
  658. (UINT)Pal.peRed,
  659. (UINT)Pal.peGreen,
  660. (UINT)Pal.peBlue);
  661. #endif
  662. }
  663. } else {
  664. LPDWORD pMask = (LPDWORD)&(HTUI_DIBInfo.rgb[0]);
  665. *pMask++ = 0x7c00;
  666. *pMask++ = 0x03e0;
  667. *pMask++ = 0x001f;
  668. }
  669. }
  670. return(HTUI_hHTPal);
  671. }
  672. LONG
  673. HTUI_StretchDIBits(
  674. HDC hMemDC,
  675. LONG DestX,
  676. LONG DestY,
  677. LONG DestCX,
  678. LONG DestCY,
  679. LONG SrcX,
  680. LONG SrcY,
  681. LONG SrcCX,
  682. LONG SrcCY,
  683. LPBYTE pBits,
  684. LPBITMAPINFO pbi,
  685. DWORD Mode,
  686. DWORD Rop
  687. )
  688. {
  689. LPBITMAPINFOHEADER pSrcbih;
  690. HTSURFACEINFO SrcSI;
  691. HTSURFACEINFO DestSI;
  692. BITBLTPARAMS BBP;
  693. COLORTRIAD ColorTriad;
  694. COLORADJUSTMENT ColorAdjustment;
  695. LONG Width;
  696. LONG Height;
  697. LONG Result;
  698. if (!HTUI_pDHI) {
  699. return(0);
  700. }
  701. if ((Width = DestCX) < 0) {
  702. Width = -Width;
  703. }
  704. if ((Height = DestCY) < 0) {
  705. Height = -Height;
  706. }
  707. if ((Width != HTUI_DIBInfo.bi.biWidth) ||
  708. (Height != HTUI_DIBInfo.bi.biHeight)) {
  709. if (HTUI_pHTBits) {
  710. LocalFree((HLOCAL)HTUI_pHTBits);
  711. HTUI_DIBInfo.bi.biWidth =
  712. HTUI_DIBInfo.bi.biHeight = 0;
  713. HTUI_pHTBits = NULL;
  714. }
  715. }
  716. if (!HTUI_pHTBits) {
  717. DWORD SizeImage;
  718. SizeImage = (DWORD)ALIGN_BPP_DW(Width, HTUI_DIBInfo.bi.biBitCount) *
  719. (DWORD)Height;
  720. #if 0
  721. DbgPrint("\nHTBits Size: %ld x %ld= %ld\n",
  722. (LONG)Width, (LONG)Height, SizeImage);
  723. #endif
  724. if (!(HTUI_pHTBits = (LPBYTE)LocalAlloc(LPTR, SizeImage))) {
  725. return(0);
  726. }
  727. HTUI_DIBInfo.bi.biSizeImage = SizeImage;
  728. HTUI_DIBInfo.bi.biWidth = Width;
  729. HTUI_DIBInfo.bi.biHeight = Height;
  730. }
  731. pSrcbih = (LPBITMAPINFOHEADER)pbi;
  732. ColorTriad.Type = COLOR_TYPE_RGB;
  733. ColorTriad.BytesPerPrimary = sizeof(BYTE);
  734. ColorTriad.BytesPerEntry = sizeof(RGBQUAD);
  735. ColorTriad.PrimaryOrder = PRIMARY_ORDER_BGR;
  736. ColorTriad.PrimaryValueMax = (LONG)BYTE_MAX;
  737. ColorTriad.ColorTableEntries = pSrcbih->biClrUsed;
  738. ColorTriad.pColorTable = (LPBYTE)&(pbi->bmiColors[0]);
  739. switch(pSrcbih->biBitCount) {
  740. case 1:
  741. SrcSI.SurfaceFormat = BMF_1BPP;
  742. break;
  743. case 4:
  744. SrcSI.SurfaceFormat = BMF_4BPP;
  745. break;
  746. case 8:
  747. SrcSI.SurfaceFormat = BMF_8BPP;
  748. break;
  749. case 16:
  750. //
  751. // 16BPP/32BPP bit fields type of input the parameter of
  752. // COLORTRIAD must
  753. //
  754. // Type = COLOR_TYPE_RGB
  755. // BytesPerPrimary = 0
  756. // BytesPerEntry = (16BPP=2, 32BPP=4)
  757. // PrimaryOrder = *Ignored*
  758. // PrimaryValueMax = *Ignored*
  759. // ColorTableEntries = 3
  760. // pColorTable = Point to 3 DWORD RGB bit masks
  761. //
  762. ColorTriad.BytesPerPrimary = 0;
  763. ColorTriad.BytesPerEntry = 2;
  764. ColorTriad.ColorTableEntries = 3;
  765. SrcSI.SurfaceFormat = BMF_16BPP;
  766. break;
  767. case 32:
  768. ColorTriad.BytesPerPrimary = 0;
  769. ColorTriad.BytesPerEntry = 4;
  770. ColorTriad.ColorTableEntries = 3;
  771. SrcSI.SurfaceFormat = BMF_32BPP;
  772. break;
  773. case 24:
  774. default:
  775. //
  776. // 24BPP must has COLORTRIAD as
  777. //
  778. // Type = COLOR_TYPE_xxxx
  779. // BytesPerPrimary = 1
  780. // BytesPerEntry = 3;
  781. // PrimaryOrder = PRIMARY_ORDER_xxxx
  782. // PrimaryValueMax = 255
  783. // ColorTableEntries = 0
  784. // pColorTable = *Ignored*
  785. //
  786. ColorTriad.BytesPerEntry = sizeof(RGBTRIPLE);
  787. ColorTriad.ColorTableEntries = 0;
  788. SrcSI.SurfaceFormat = BMF_24BPP;
  789. break;
  790. }
  791. SrcSI.hSurface = (ULONG_PTR)hMemDC;
  792. SrcSI.Flags = 0;
  793. SrcSI.ScanLineAlignBytes = BMF_ALIGN_DWORD;
  794. SrcSI.Width = pSrcbih->biWidth;
  795. SrcSI.Height = pSrcbih->biHeight;
  796. SrcSI.ScanLineDelta = GET_SCANLINEDELTA(pSrcbih);
  797. SrcSI.pPlane = GET_PPLANE(pSrcbih, SrcSI.ScanLineDelta);
  798. SrcSI.pColorTriad = &ColorTriad;
  799. DestSI.hSurface = (ULONG_PTR)'HTUI';
  800. DestSI.Flags = 0;
  801. DestSI.SurfaceFormat = (BYTE)HTUI_HTSurf;
  802. DestSI.Width = Width;
  803. DestSI.Height = Height;
  804. DestSI.ScanLineAlignBytes = BMF_ALIGN_DWORD;
  805. DestSI.ScanLineDelta = GET_SCANLINEDELTA(&HTUI_DIBInfo.bi);
  806. DestSI.pPlane = HTUI_pHTBits +
  807. GET_SCAN0_OFFSET(&HTUI_DIBInfo.bi,
  808. SrcSI.ScanLineDelta);
  809. DestSI.pColorTriad = NULL;
  810. BBP.Flags = BBPF_USE_ADDITIVE_PRIMS;
  811. BBP.DestPrimaryOrder = PRIMARY_ORDER_BGR;
  812. BBP.rclSrc.left =
  813. BBP.rclSrc.top = 0;
  814. BBP.rclSrc.right = (LONG)ABSL(SrcSI.Width);
  815. BBP.rclSrc.bottom = (LONG)ABSL(SrcSI.Height);
  816. BBP.rclDest.left = DestX;
  817. BBP.rclDest.top = DestY;
  818. BBP.rclDest.right = DestX + DestCX;
  819. BBP.rclDest.bottom = DestY + DestCY;
  820. BBP.pAbort = NULL;
  821. BBP.ptlBrushOrg.x =
  822. BBP.ptlBrushOrg.y = 0;
  823. GetColorAdjustment(hMemDC, &ColorAdjustment);
  824. Result = HT_HalftoneBitmap(HTUI_pDHI,
  825. &ColorAdjustment,
  826. &SrcSI,
  827. NULL,
  828. &DestSI,
  829. &BBP);
  830. SetDIBitsToDevice(hMemDC,
  831. 0,
  832. 0, // Dest X, Y
  833. Width, // DIB cx
  834. Height, // DIB cy
  835. 0,
  836. 0, // DIB origin
  837. 0,
  838. Height, // total Scan
  839. HTUI_pHTBits, // lpBits
  840. (LPBITMAPINFO)&HTUI_DIBInfo,
  841. HTUI_DIBMode);
  842. return(Result);
  843. }
  844. #endif
  845. LRESULT
  846. APIENTRY
  847. TopWndHookProc(
  848. HWND hWnd,
  849. UINT Msg,
  850. WPARAM wParam,
  851. LPARAM lParam
  852. )
  853. {
  854. if (Msg == WM_PALETTECHANGED) {
  855. PostMessage(hWndUIDlg, WM_PALETTECHANGED, wParam, lParam);
  856. }
  857. return(CallWindowProc(WndProcUITop, hWnd, Msg, wParam, lParam));
  858. }
  859. //
  860. //************************ START HELP STUFF *****************************
  861. //
  862. HTHELPID HTSetupHelpID[] = {
  863. { IDD_HTDEV_DEVICE_NAME ,IDH_HTDEV_DEVICE_NAME },
  864. { IDD_HTDEV_DEVICE_TITLE ,IDH_HTDEV_DEVICE_NAME },
  865. { IDD_HTDEV_HTPAT_COMBO ,IDH_HTDEV_HTPAT },
  866. { IDD_HTDEV_HTPAT_TITLE ,IDH_HTDEV_HTPAT },
  867. { IDD_HTDEV_PIXEL_TEXT ,IDH_HTDEV_PIXEL_DIAMETER },
  868. { IDD_HTDEV_PIXEL_TITLE ,IDH_HTDEV_PIXEL_DIAMETER },
  869. { IDD_HTDEV_PIXEL_SCROLL ,IDH_HTDEV_PIXEL_DIAMETER },
  870. { IDD_HTDEV_R_GAMMA_TEXT ,IDH_HTDEV_DEV_RED_GAMMA },
  871. { IDD_HTDEV_G_GAMMA_TEXT ,IDH_HTDEV_DEV_GREEN_GAMMA },
  872. { IDD_HTDEV_B_GAMMA_TEXT ,IDH_HTDEV_DEV_BLUE_GAMMA },
  873. { IDD_HTDEV_DEV_GAMMA_TITLE ,IDH_HTDEV_DEV_GAMMA },
  874. { IDD_HTDEV_R_GAMMA_NAME ,IDH_HTDEV_DEV_RED_GAMMA },
  875. { IDD_HTDEV_G_GAMMA_NAME ,IDH_HTDEV_DEV_GREEN_GAMMA },
  876. { IDD_HTDEV_B_GAMMA_NAME ,IDH_HTDEV_DEV_BLUE_GAMMA },
  877. { IDD_HTDEV_R_GAMMA_SCROLL ,IDH_HTDEV_DEV_RED_GAMMA },
  878. { IDD_HTDEV_G_GAMMA_SCROLL ,IDH_HTDEV_DEV_GREEN_GAMMA },
  879. { IDD_HTDEV_B_GAMMA_SCROLL ,IDH_HTDEV_DEV_BLUE_GAMMA },
  880. { IDD_HTDEV_R_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  881. { IDD_HTDEV_G_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  882. { IDD_HTDEV_B_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  883. { IDD_HTDEV_C_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  884. { IDD_HTDEV_M_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  885. { IDD_HTDEV_Y_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  886. { IDD_HTDEV_W_CIE_TITLE ,IDH_HTDEV_RGBW_CIE_XY },
  887. { IDD_HTDEV_CIE_GROUPBOX ,IDH_HTDEV_RGBW_CIE_XY },
  888. { IDD_HTDEV_R_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  889. { IDD_HTDEV_G_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  890. { IDD_HTDEV_B_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  891. { IDD_HTDEV_C_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  892. { IDD_HTDEV_M_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  893. { IDD_HTDEV_Y_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  894. { IDD_HTDEV_W_CIE_x_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  895. { IDD_HTDEV_R_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  896. { IDD_HTDEV_G_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  897. { IDD_HTDEV_B_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  898. { IDD_HTDEV_C_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  899. { IDD_HTDEV_M_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  900. { IDD_HTDEV_Y_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  901. { IDD_HTDEV_W_CIE_x_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  902. { IDD_HTDEV_R_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  903. { IDD_HTDEV_G_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  904. { IDD_HTDEV_B_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  905. { IDD_HTDEV_C_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  906. { IDD_HTDEV_M_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  907. { IDD_HTDEV_Y_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  908. { IDD_HTDEV_W_CIE_x_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  909. { IDD_HTDEV_R_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  910. { IDD_HTDEV_G_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  911. { IDD_HTDEV_B_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  912. { IDD_HTDEV_C_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  913. { IDD_HTDEV_M_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  914. { IDD_HTDEV_Y_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  915. { IDD_HTDEV_W_CIE_y_TEXT ,IDH_HTDEV_RGBW_CIE_XY },
  916. { IDD_HTDEV_R_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  917. { IDD_HTDEV_G_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  918. { IDD_HTDEV_B_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  919. { IDD_HTDEV_C_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  920. { IDD_HTDEV_M_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  921. { IDD_HTDEV_Y_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  922. { IDD_HTDEV_W_CIE_y_SCROLL ,IDH_HTDEV_RGBW_CIE_XY },
  923. { IDD_HTDEV_R_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  924. { IDD_HTDEV_G_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  925. { IDD_HTDEV_B_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  926. { IDD_HTDEV_C_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  927. { IDD_HTDEV_M_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  928. { IDD_HTDEV_Y_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  929. { IDD_HTDEV_W_CIE_y_NAME ,IDH_HTDEV_RGBW_CIE_XY },
  930. { IDD_HTDEV_W_CIE_L_GROUPBOX ,IDH_HTDEV_ALIGNMENT_WHITE },
  931. { IDD_HTDEV_W_CIE_L_TEXT ,IDH_HTDEV_ALIGNMENT_WHITE },
  932. { IDD_HTDEV_W_CIE_L_NAME ,IDH_HTDEV_ALIGNMENT_WHITE },
  933. { IDD_HTDEV_W_CIE_L_SCROLL ,IDH_HTDEV_ALIGNMENT_WHITE },
  934. { IDD_HTDEV_DYE_GROUPBOX ,IDH_HTDEV_CMY_DYE_PERCENT },
  935. { IDD_HTDEV_M_IN_C_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  936. { IDD_HTDEV_Y_IN_C_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  937. { IDD_HTDEV_C_IN_M_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  938. { IDD_HTDEV_Y_IN_M_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  939. { IDD_HTDEV_C_IN_Y_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  940. { IDD_HTDEV_M_IN_Y_TEXT ,IDH_HTDEV_CMY_DYE_PERCENT },
  941. { IDD_HTDEV_M_IN_C_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  942. { IDD_HTDEV_Y_IN_C_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  943. { IDD_HTDEV_C_IN_M_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  944. { IDD_HTDEV_Y_IN_M_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  945. { IDD_HTDEV_C_IN_Y_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  946. { IDD_HTDEV_M_IN_Y_SCROLL ,IDH_HTDEV_CMY_DYE_PERCENT },
  947. { IDD_HTDEV_CYAN_NAME ,IDH_HTDEV_CMY_DYE_PERCENT },
  948. { IDD_HTDEV_CYAN_M_EQAUL ,IDH_HTDEV_CMY_DYE_PERCENT },
  949. { IDD_HTDEV_CYAN_M_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  950. { IDD_HTDEV_CYAN_Y_EQUAL ,IDH_HTDEV_CMY_DYE_PERCENT },
  951. { IDD_HTDEV_CYAN_Y_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  952. { IDD_HTDEV_MAGENTA_NAME ,IDH_HTDEV_CMY_DYE_PERCENT },
  953. { IDD_HTDEV_MAGENTA_C_EQAUL ,IDH_HTDEV_CMY_DYE_PERCENT },
  954. { IDD_HTDEV_MAGENTA_C_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  955. { IDD_HTDEV_MAGENTA_Y_EQUAL ,IDH_HTDEV_CMY_DYE_PERCENT },
  956. { IDD_HTDEV_MAGENTA_Y_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  957. { IDD_HTDEV_YELLOW_NAME ,IDH_HTDEV_CMY_DYE_PERCENT },
  958. { IDD_HTDEV_YELLOW_C_EQAUL ,IDH_HTDEV_CMY_DYE_PERCENT },
  959. { IDD_HTDEV_YELLOW_C_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  960. { IDD_HTDEV_YELLOW_M_EQUAL ,IDH_HTDEV_CMY_DYE_PERCENT },
  961. { IDD_HTDEV_YELLOW_M_PERCENT ,IDH_HTDEV_CMY_DYE_PERCENT },
  962. { IDD_HTDEV_DEFAULT ,IDH_HTDEV_DEFAULT },
  963. { IDD_HTDEV_REVERT ,IDH_HTDEV_REVERT },
  964. { IDOK ,IDH_HTDEV_OK },
  965. { IDCANCEL ,IDH_HTDEV_CANCEL }
  966. };
  967. HTHELPID HTClrHelpID[] = {
  968. { IDD_HT_CONTRAST_TITLE, IDH_HTCLR_CONTRAST },
  969. { IDD_HT_CONTRAST_INT, IDH_HTCLR_CONTRAST },
  970. { IDD_HT_CONTRAST_SCROLL, IDH_HTCLR_CONTRAST },
  971. { IDD_HT_BRIGHTNESS_TITLE, IDH_HTCLR_BRIGHTNESS },
  972. { IDD_HT_BRIGHTNESS_INT, IDH_HTCLR_BRIGHTNESS },
  973. { IDD_HT_BRIGHTNESS_SCROLL, IDH_HTCLR_BRIGHTNESS },
  974. { IDD_HT_COLOR_TITLE, IDH_HTCLR_COLOR },
  975. { IDD_HT_COLORFULNESS_INT, IDH_HTCLR_COLOR },
  976. { IDD_HT_COLORFULNESS_SCROLL, IDH_HTCLR_COLOR },
  977. { IDD_HT_TINT_TITLE, IDH_HTCLR_TINT },
  978. { IDD_HT_RG_TINT_INT, IDH_HTCLR_TINT },
  979. { IDD_HT_RG_TINT_SCROLL, IDH_HTCLR_TINT },
  980. { IDD_HT_LOG_FILTER, IDH_HTCLR_DARK_PIC },
  981. { IDD_HT_NEGATIVE, IDH_HTCLR_NEGATIVE },
  982. { IDD_HT_ILLUMINANT_TITLE, IDH_HTCLR_ILLUMINANT },
  983. { IDD_HT_ILLUMINANT_COMBO, IDH_HTCLR_ILLUMINANT },
  984. { IDD_HT_LINEAR_GAMMA, IDH_HTCLR_LINEAR_GAMMA },
  985. { IDD_HT_SYNC_R, IDH_HTCLR_SYNC_R_CHKBOX },
  986. { IDD_HT_R_GAMMA_INT, IDH_HTCLR_RED_GAMMA },
  987. { IDD_HT_R_GAMMA_SCROLL, IDH_HTCLR_RED_GAMMA },
  988. { IDD_HT_SYNC_G, IDH_HTCLR_SYNC_G_CHKBOX },
  989. { IDD_HT_G_GAMMA_INT, IDH_HTCLR_GREEN_GAMMA },
  990. { IDD_HT_G_GAMMA_SCROLL, IDH_HTCLR_GREEN_GAMMA },
  991. { IDD_HT_SYNC_B, IDH_HTCLR_SYNC_B_CHKBOX },
  992. { IDD_HT_B_GAMMA_INT, IDH_HTCLR_BLUE_GAMMA },
  993. { IDD_HT_B_GAMMA_SCROLL, IDH_HTCLR_BLUE_GAMMA },
  994. { IDD_HT_REF_BLACK_TITLE, IDH_HTCLR_BLACK_REF },
  995. { IDD_HT_REF_BLACK_INT, IDH_HTCLR_BLACK_REF },
  996. { IDD_HT_REF_BLACK_SCROLL, IDH_HTCLR_BLACK_REF },
  997. { IDD_HT_REF_WHITE_TITLE, IDH_HTCLR_WHITE_REF },
  998. { IDD_HT_REF_WHITE_INT, IDH_HTCLR_WHITE_REF },
  999. { IDD_HT_REF_WHITE_SCROLL, IDH_HTCLR_WHITE_REF },
  1000. { IDD_HT_BMP_TITLE, IDH_HTCLR_PICTURE_NAME },
  1001. { IDD_HT_SHOW_COMBO, IDH_HTCLR_PICTURE_NAME },
  1002. { IDD_HT_PIC_NAME, IDH_HTCLR_PICTURE_DESC },
  1003. { IDD_HT_HALFTONE_DESC, IDH_HTCLR_PICTURE_DESC },
  1004. { IDD_HT_BMP_TEST, IDH_HTCLR_VIEW },
  1005. { IDD_HT_ZOOM, IDH_HTCLR_MAXIMIZE },
  1006. { IDD_HT_PALETTE, IDH_HTCLR_PALETTE },
  1007. { IDD_HT_ASPECT_RATIO, IDH_HTCLR_SCALE },
  1008. { IDD_HT_MIRROR, IDH_HTCLR_FLIP_X },
  1009. { IDD_HT_UPSIDEDOWN, IDH_HTCLR_FLIP_Y },
  1010. { IDOK, IDH_HTCLR_OK },
  1011. { IDCANCEL, IDH_HTCLR_CANCEL },
  1012. { IDD_HT_DEFAULT, IDH_HTCLR_DEFAULT },
  1013. { IDD_HT_RESET, IDH_HTCLR_REVERT },
  1014. { IDD_HT_OPEN, IDH_HTCLR_OPEN },
  1015. { IDD_HT_SAVE_AS, IDH_HTCLR_SAVE_AS }
  1016. };
  1017. VOID
  1018. DoHalftoneHelp(
  1019. HWND hDlg,
  1020. HWND hWndHelp,
  1021. UINT HelpType,
  1022. UINT HelpCmd,
  1023. DWORD MousePos
  1024. )
  1025. /*++
  1026. Routine Description:
  1027. This fucntion take current help window where user clik the right mouse
  1028. button and do a context help
  1029. Arguments:
  1030. hDlg - Handle to the dialog box
  1031. hWndHelp - The control window which user clik the right mouse button or
  1032. drag the help button to it.
  1033. HelpType - HELP_TYPE_xxx, it either halftone color adjustment help or
  1034. halftone setup help
  1035. HelpCmd - How to help, it either a right click or help cursor button
  1036. MousePos - The mouse position for the right click or help cursor drag.
  1037. Return Value:
  1038. VOID
  1039. Author:
  1040. 05-Mar-1996 Tue 15:56:27 created -by- Daniel Chou (danielc)
  1041. Revision History:
  1042. --*/
  1043. {
  1044. HWND hWndTmp;
  1045. PHTHELPID pHTHelpID;
  1046. UINT cHTHelpID;
  1047. POINT pt;
  1048. DWORD HelpID[4];
  1049. ULONG_PTR dwData;
  1050. WORD DlgID;
  1051. WCHAR HelpFile[MAX_PATH];
  1052. //
  1053. // Convert the mouse position from screen to the client window
  1054. //
  1055. pt.x = LOWORD(MousePos);
  1056. pt.y = HIWORD(MousePos);
  1057. ScreenToClient(hDlg, &pt);
  1058. //
  1059. // If the help is from the dialog, then find the control window in that
  1060. // mouse position
  1061. //
  1062. if (hDlg == hWndHelp) {
  1063. hWndHelp = ChildWindowFromPointEx(hDlg, pt, CWP_SKIPTRANSPARENT);
  1064. }
  1065. //
  1066. // If cursor is not on any control window or the control window is frame
  1067. // type (ie. no window ID for it) then exit now
  1068. //
  1069. if ((!hWndHelp) ||
  1070. ((DlgID = (WORD)GetDlgCtrlID(hWndHelp)) == 0xFFFF)) {
  1071. return;
  1072. }
  1073. #if 0
  1074. DbgPrint("\nhDlg=%08lx, hWndHelp=%08lx (%ld)", hDlg, hWndHelp, DlgID);
  1075. #endif
  1076. switch (HelpType) {
  1077. case HELP_TYPE_HTCLRADJ:
  1078. cHTHelpID = (UINT)COUNT_ARRAY(HTClrHelpID);
  1079. pHTHelpID = HTClrHelpID;
  1080. break;
  1081. case HELP_TYPE_HTSETUP:
  1082. cHTHelpID = (UINT)COUNT_ARRAY(HTSetupHelpID);
  1083. pHTHelpID = HTSetupHelpID;
  1084. break;
  1085. default:
  1086. return;
  1087. }
  1088. //
  1089. // Find the help ID based on the control window ID
  1090. //
  1091. HelpID[1] = 0;
  1092. while (cHTHelpID--) {
  1093. if (pHTHelpID->DlgID == DlgID) {
  1094. HelpID[1] = (DWORD)pHTHelpID->HelpID;
  1095. #if 0
  1096. DbgPrint("\nFind HelpID=%ld, HelpID's DlgID=%ld",
  1097. pHTHelpID->HelpID, pHTHelpID->DlgID);
  1098. #endif
  1099. break;
  1100. }
  1101. pHTHelpID++;
  1102. }
  1103. //
  1104. // If we cannot find the help ID for the control window then NO HELP
  1105. //
  1106. if (!HelpID[1]) {
  1107. return;
  1108. }
  1109. //
  1110. // We need to do this, since the substractive device (printer alike) only
  1111. // has one gamma setting, (using only the RED GAMMA), opposit to the
  1112. // additive devices which has red, green and blue gamma adjustment
  1113. //
  1114. if ((HelpID[1] == IDH_HTDEV_DEV_RED_GAMMA) &&
  1115. (!GetDlgItem(hDlg, IDD_HTDEV_B_GAMMA_SCROLL))) {
  1116. HelpID[1] = IDH_HTDEV_DEV_GAMMA;
  1117. #if 0
  1118. DbgPrint("\nIDH_HTDEV_DEV_RED_GAMMA: No BLUE scroll, use IDH_HTDEV_DEV_GAMMA");
  1119. #endif
  1120. }
  1121. //
  1122. // load the help file form the resource, if failed then use static one
  1123. //
  1124. if (!LoadString(hHTUIModule,
  1125. IDS_HELP_FILENAME,
  1126. HelpFile,
  1127. COUNT_ARRAY(HelpFile) - 1)) {
  1128. lstrcpy(HelpFile, L"Halftone.Hlp");
  1129. }
  1130. //
  1131. // Try to pop-up help on the right click position, where we will create
  1132. // a temp button window and do the help, this way we can do context
  1133. // sensitive help on any type of window (static, icon) and even it is
  1134. // disabled. We need to destroy this temp window before we exit from
  1135. // this fucntion
  1136. //
  1137. if (hWndTmp = CreateWindowEx(WS_EX_NOPARENTNOTIFY | WS_EX_CONTEXTHELP,
  1138. L"button",
  1139. L"",
  1140. WS_CHILD | BS_CHECKBOX,
  1141. pt.x,
  1142. pt.y,
  1143. 1,
  1144. 1,
  1145. hDlg,
  1146. (HMENU)TMP_HELP_WND_ID,
  1147. hHTUIModule,
  1148. 0)) {
  1149. hWndHelp = hWndTmp;
  1150. }
  1151. HelpID[0] = GetWindowLong(hWndHelp, GWL_ID);
  1152. HelpID[2] =
  1153. HelpID[3] = 0;
  1154. switch (HelpCmd) {
  1155. case HELP_WM_HELP:
  1156. if ((!HelpID[0]) || (!HelpID[1])) {
  1157. HelpCmd = HELP_CONTENTS;
  1158. hWndHelp = hDlg;
  1159. dwData = 0;
  1160. break;
  1161. }
  1162. case HELP_CONTEXTMENU:
  1163. SetWindowContextHelpId(hWndHelp, HelpID[1]);
  1164. dwData = (ULONG_PTR)&HelpID[0];
  1165. break;
  1166. case HELP_CONTEXT:
  1167. case HELP_CONTEXTPOPUP:
  1168. dwData = HelpID[1];
  1169. break;
  1170. default:
  1171. dwData = 0;
  1172. break;
  1173. }
  1174. //
  1175. // Try Winhelp now
  1176. //
  1177. WinHelp(hWndHelp, HelpFile, HelpCmd, dwData);
  1178. //
  1179. // If we do create a temp. button window, we need to destroy it
  1180. //
  1181. if (hWndTmp) {
  1182. DestroyWindow(hWndTmp);
  1183. }
  1184. }
  1185. //
  1186. //************************ END HELP STUFF ********************************
  1187. //
  1188. UINT
  1189. GetSaveDefDIBFileName(
  1190. HWND hDlg,
  1191. LPWSTR pFileName,
  1192. UINT SizeFileName
  1193. )
  1194. {
  1195. LPWSTR pName;
  1196. WCHAR KeyName[64];
  1197. WCHAR ch;
  1198. if (hDlg) {
  1199. LoadString(hHTUIModule,
  1200. IDS_INI_KEY_BITMAP,
  1201. KeyName,
  1202. COUNT_ARRAY(KeyName));
  1203. if (SizeFileName) {
  1204. GetProfileString(HTClrAdjSectionName,
  1205. KeyName,
  1206. L"",
  1207. pFileName,
  1208. SizeFileName);
  1209. } else {
  1210. WriteProfileString(HTClrAdjSectionName, KeyName, pFileName);
  1211. }
  1212. }
  1213. if (pFileName) {
  1214. if (SizeFileName = wcslen(pFileName)) {
  1215. pName = pFileName + SizeFileName;
  1216. while ((pName > pFileName) &&
  1217. ((ch = *(pName - 1)) != L'\\') &&
  1218. (ch != L'/') &&
  1219. (ch != L':')) {
  1220. --pName;
  1221. }
  1222. SizeFileName = (UINT)(pName - pFileName);
  1223. }
  1224. return(SizeFileName);
  1225. } else {
  1226. return(0);
  1227. }
  1228. }
  1229. //
  1230. // Load current setting from win.ini
  1231. //
  1232. VOID
  1233. LoadHTCLRADJPARAMToWININI(
  1234. HWND hDlg,
  1235. PHTCLRADJPARAM pHTClrAdjParam
  1236. )
  1237. {
  1238. LPWSTR pStop;
  1239. SIZEL DlgSize;
  1240. SIZEL MinVisible;
  1241. SIZEL Scr;
  1242. RECT rcBmp;
  1243. RECT rcDlg;
  1244. WCHAR KeyName[64];
  1245. WCHAR Buf[130];
  1246. GetWindowText(hDlg, HTClrAdjSectionName, COUNT_ARRAY(HTClrAdjSectionName));
  1247. GetWindowRect(hDlg, &rcDlg);
  1248. //
  1249. // Default always, and the last DIB is not loaded yet
  1250. //
  1251. if (pHTClrAdjParam->pCallerTitle) {
  1252. if((wcslen(HTClrAdjSectionName) +
  1253. wcslen(pHTClrAdjParam->pCallerTitle) + 4 ) < COUNT_ARRAY(Buf))
  1254. { // skip if Buf too small. Worst case is Window Text not decorated with Caller Title. Big Deal!
  1255. wsprintf(Buf, L"%s: %s", HTClrAdjSectionName,
  1256. pHTClrAdjParam->pCallerTitle);
  1257. SetWindowText(hDlg, Buf);
  1258. }
  1259. }
  1260. DlgSize.cx = rcDlg.right - rcDlg.left;
  1261. DlgSize.cy = rcDlg.bottom - rcDlg.top;
  1262. LoadString(hHTUIModule,
  1263. IDS_INI_KEY_OPTIONS,
  1264. KeyName,
  1265. COUNT_ARRAY(KeyName));
  1266. if (GetProfileString(HTClrAdjSectionName,
  1267. KeyName,
  1268. L"\0",
  1269. Buf,
  1270. COUNT_ARRAY(Buf))) {
  1271. pHTClrAdjParam->BmpFlags = (WORD)wcstol(Buf, &pStop, 16) &
  1272. (WORD)(HT_BMP_PALETTE |
  1273. HT_BMP_SCALE |
  1274. HT_BMP_AUTO_MOVE |
  1275. HT_BMP_AT_TOP |
  1276. HT_BMP_MIRROR |
  1277. HT_BMP_UPSIDEDOWN |
  1278. HT_BMP_ENABLE |
  1279. HT_BMP_ZOOM |
  1280. HT_BMP_SYNC_R |
  1281. HT_BMP_SYNC_G |
  1282. HT_BMP_SYNC_B);
  1283. } else {
  1284. pHTClrAdjParam->BmpFlags = (WORD)(HT_BMP_SYNC_R |
  1285. HT_BMP_SYNC_G |
  1286. HT_BMP_SYNC_B |
  1287. HT_BMP_SCALE |
  1288. HT_BMP_AUTO_MOVE |
  1289. HT_BMP_ENABLE);
  1290. }
  1291. pHTClrAdjParam->BmpFlags |= HT_BMP_AUTO_MOVE;
  1292. Scr.cx = (LONG)GetSystemMetrics(SM_CXSCREEN);
  1293. Scr.cy = (LONG)GetSystemMetrics(SM_CYSCREEN);
  1294. //
  1295. // Assume that dialog box must be center
  1296. //
  1297. rcDlg.left = (LONG)((Scr.cx - DlgSize.cx) / 2);
  1298. rcDlg.top = (LONG)((Scr.cy - DlgSize.cy) / 2);
  1299. LoadString(hHTUIModule,
  1300. IDS_INI_KEY_DLGBOX_ORG,
  1301. KeyName,
  1302. COUNT_ARRAY(KeyName));
  1303. if (GetProfileString(HTClrAdjSectionName,
  1304. KeyName,
  1305. L"\0",
  1306. Buf,
  1307. COUNT_ARRAY(Buf))) {
  1308. rcDlg.left = wcstol(Buf, &pStop, 10);
  1309. rcDlg.top = wcstol(pStop, &pStop, 10);
  1310. }
  1311. MinVisible.cx = (LONG)(DlgSize.cx >> 1);
  1312. MinVisible.cy = (LONG)(GetSystemMetrics(SM_CYDLGFRAME) +
  1313. GetSystemMetrics(SM_CYCAPTION));
  1314. if (rcDlg.left < -(DlgSize.cx - MinVisible.cx)) {
  1315. rcDlg.left = -(DlgSize.cx - MinVisible.cx);
  1316. } else if (rcDlg.left > (Scr.cx - MinVisible.cx)) {
  1317. rcDlg.left = Scr.cx - MinVisible.cx;
  1318. }
  1319. if (rcDlg.top < 0) {
  1320. rcDlg.top = 0;
  1321. } else if (rcDlg.top > (Scr.cy - MinVisible.cy)) {
  1322. rcDlg.top = Scr.cy - MinVisible.cy;
  1323. }
  1324. LoadString(hHTUIModule,
  1325. IDS_INI_KEY_VIEW_RECT,
  1326. KeyName,
  1327. COUNT_ARRAY(KeyName));
  1328. rcBmp.left = rcBmp.top = rcBmp.right = rcBmp.bottom = 0;
  1329. if (GetProfileString(HTClrAdjSectionName,
  1330. KeyName,
  1331. L"\0",
  1332. Buf,
  1333. COUNT_ARRAY(Buf))) {
  1334. rcBmp.left = wcstol(Buf, &pStop, 10);
  1335. rcBmp.top = wcstol(pStop, &pStop, 10);
  1336. rcBmp.right = wcstol(pStop, &pStop, 10);
  1337. rcBmp.bottom = wcstol(pStop, &pStop, 10);
  1338. switch(pHTClrAdjParam->ViewMode = (BYTE)wcstol(pStop, &pStop, 10)) {
  1339. case VSRC_PIC_LOADED:
  1340. case VSRC_REFCOLORS:
  1341. case VSRC_RGB:
  1342. case VSRC_NTSC_BAR:
  1343. break;
  1344. default:
  1345. pHTClrAdjParam->ViewMode = DEFAULT_VSRC;
  1346. break;
  1347. }
  1348. }
  1349. MinVisible.cx = rcBmp.right - rcBmp.left;
  1350. MinVisible.cy = rcBmp.bottom - rcBmp.top;
  1351. if ((MinVisible.cx < GetSystemMetrics(SM_CXMIN)) ||
  1352. (MinVisible.cy < GetSystemMetrics(SM_CYMIN))) {
  1353. //
  1354. // Making default bitmap size, make sure that dialog box and bitmap
  1355. // both are within the screen limit
  1356. //
  1357. LONG cyBmp;
  1358. cyBmp = (LONG)((DlgSize.cx * Scr.cy) / Scr.cx);
  1359. if ((cyBmp + DlgSize.cy) > Scr.cy) {
  1360. //
  1361. // cannot fit that on the screen, so reduced the bitmap Y size
  1362. //
  1363. cyBmp = Scr.cy - DlgSize.cy;
  1364. }
  1365. rcBmp.top = (LONG)((Scr.cy - DlgSize.cy - cyBmp) / 2);
  1366. rcBmp.bottom = rcBmp.top + cyBmp;
  1367. rcBmp.left = rcDlg.left;
  1368. rcBmp.right = rcBmp.left + DlgSize.cx;
  1369. //
  1370. // Move dialog box down
  1371. //
  1372. rcDlg.top = rcBmp.bottom;
  1373. } else {
  1374. if (MinVisible.cx > Scr.cx) {
  1375. rcBmp.left = 0;
  1376. rcBmp.right =
  1377. MinVisible.cx = Scr.cx;
  1378. }
  1379. if (MinVisible.cy > Scr.cy) {
  1380. rcBmp.top = 0;
  1381. rcBmp.bottom =
  1382. MinVisible.cy = Scr.cy;
  1383. }
  1384. }
  1385. if ((MinVisible.cx == Scr.cx) &&
  1386. (MinVisible.cy == Scr.cy)) {
  1387. pHTClrAdjParam->BmpFlags |= HT_BMP_ZOOM;
  1388. }
  1389. rcDlg.right = rcDlg.left + DlgSize.cx;
  1390. rcDlg.bottom = rcDlg.top + DlgSize.cy;
  1391. pHTClrAdjParam->rcDlg = rcDlg;
  1392. pHTClrAdjParam->rcBmp = rcBmp;
  1393. }
  1394. VOID
  1395. UpdateHTCLRADJPARAMToWININI(
  1396. HWND hDlg,
  1397. PHTCLRADJPARAM pHTClrAdjParam
  1398. )
  1399. {
  1400. WORD ViewSrc;
  1401. WCHAR KeyName[64];
  1402. WCHAR Buf[64];
  1403. LoadString(hHTUIModule,
  1404. IDS_INI_KEY_DLGBOX_ORG,
  1405. KeyName,
  1406. COUNT_ARRAY(KeyName));
  1407. wsprintf(Buf, L"%ld %ld", (LONG)pHTClrAdjParam->rcDlg.left,
  1408. (LONG)pHTClrAdjParam->rcDlg.top);
  1409. WriteProfileString(HTClrAdjSectionName, KeyName, Buf);
  1410. switch(ViewSrc = (WORD)pHTClrAdjParam->ViewMode) {
  1411. case VSRC_PIC_LOADED:
  1412. case VSRC_REFCOLORS:
  1413. case VSRC_RGB:
  1414. case VSRC_NTSC_BAR:
  1415. break;
  1416. default:
  1417. ViewSrc = DEFAULT_VSRC;
  1418. break;
  1419. }
  1420. LoadString(hHTUIModule,
  1421. IDS_INI_KEY_VIEW_RECT,
  1422. KeyName,
  1423. COUNT_ARRAY(KeyName));
  1424. wsprintf(Buf, L"%ld %ld %ld %ld %u",
  1425. pHTClrAdjParam->rcBmp.left, pHTClrAdjParam->rcBmp.top,
  1426. pHTClrAdjParam->rcBmp.right, pHTClrAdjParam->rcBmp.bottom,
  1427. (INT)ViewSrc);
  1428. WriteProfileString(HTClrAdjSectionName, KeyName, Buf);
  1429. LoadString(hHTUIModule,
  1430. IDS_INI_KEY_OPTIONS,
  1431. KeyName,
  1432. COUNT_ARRAY(KeyName));
  1433. wsprintf(Buf, L"0x%04x", (UINT)pHTClrAdjParam->BmpFlags);
  1434. WriteProfileString(HTClrAdjSectionName, KeyName, Buf);
  1435. }
  1436. HANDLE
  1437. MakeTestDIB(
  1438. UINT TestDIBIndex
  1439. )
  1440. /*++
  1441. Routine Description:
  1442. This function take TESTDIBINFO data structure and use that information
  1443. to make up a DIB
  1444. Arguments:
  1445. pTestDIBInfo
  1446. Return Value:
  1447. HANDLE to the DIB if ok, NULL if failed, this function will only make
  1448. one dib per TESTDIBINFO.
  1449. Author:
  1450. 02-Sep-1992 Wed 10:04:41 created -by- Daniel Chou (danielc)
  1451. Revision History:
  1452. --*/
  1453. {
  1454. HANDLE hDIB;
  1455. LPBITMAPINFO pbi;
  1456. LPBYTE pbSrc;
  1457. LPBYTE pbDest;
  1458. LPWORD pRatioY;
  1459. RGBQUAD FAR *pRGBQ;
  1460. TESTDIBINFO TDInfo;
  1461. DWORD SizeI;
  1462. DWORD Size;
  1463. DWORD cxBytes;
  1464. WORD cy;
  1465. WORD RatioY[64];
  1466. UINT i;
  1467. UINT yLoop;
  1468. if (TestDIBIndex > TDI_MAX_INDEX) {
  1469. TestDIBIndex = TDI_RGBTEST;
  1470. }
  1471. TDInfo = TestDIBInfo[TestDIBIndex];
  1472. if (hDIB = TDInfo.hDIB) {
  1473. return(hDIB); // already make up
  1474. }
  1475. pRatioY = TDInfo.pRatioY;
  1476. if (TDInfo.yStrips > 64) {
  1477. TDInfo.yStrips = 64;
  1478. }
  1479. for (i = 0, cy = 0; i < (UINT)TDInfo.yStrips; i++) {
  1480. RatioY[i] = (WORD)((((DWORD)TDInfo.cy * (DWORD)(*pRatioY++)) +
  1481. 5000)/10000);
  1482. cy += RatioY[i];
  1483. }
  1484. if (!cy) {
  1485. cy = TDInfo.cy;
  1486. }
  1487. cxBytes = (DWORD)ALIGN_BPP_DW(TDInfo.cx, TDInfo.bpp);
  1488. SizeI = (DWORD)cy * cxBytes;
  1489. Size = (DWORD)sizeof(BITMAPINFOHEADER) +
  1490. (DWORD)(TDInfo.ClrUsed * sizeof(RGBQUAD)) + SizeI;
  1491. if (hDIB = GlobalAlloc(GMEM_MOVEABLE, Size)) {
  1492. pbi = (LPBITMAPINFO)GlobalLock(hDIB);
  1493. //
  1494. // make header
  1495. //
  1496. pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  1497. pbi->bmiHeader.biWidth = (LONG)TDInfo.cx;
  1498. pbi->bmiHeader.biHeight = (LONG)cy;
  1499. pbi->bmiHeader.biPlanes = 1;
  1500. pbi->bmiHeader.biBitCount = (WORD)TDInfo.bpp;
  1501. pbi->bmiHeader.biCompression = BI_RGB;
  1502. pbi->bmiHeader.biSizeImage = SizeI;
  1503. pbi->bmiHeader.biXPelsPerMeter = 0;
  1504. pbi->bmiHeader.biYPelsPerMeter = 0;
  1505. pbi->bmiHeader.biClrUsed =
  1506. pbi->bmiHeader.biClrImportant = TDInfo.ClrUsed;
  1507. //
  1508. // Compute and make up the color table
  1509. //
  1510. pRGBQ = (RGBQUAD FAR *)(pbi->bmiColors);
  1511. if (TestDIBIndex == TDI_RGBTEST) {
  1512. RGBQUAD rgbQ;
  1513. rgbQ.rgbRed =
  1514. rgbQ.rgbGreen =
  1515. rgbQ.rgbBlue = 255;
  1516. rgbQ.rgbReserved = 0;
  1517. //
  1518. // Make up for first 6:6:6 (216) table
  1519. //
  1520. for (i = 0; i <= 215; i++) {
  1521. if (rgbQ.rgbBlue == 255) {
  1522. rgbQ.rgbBlue = 0;
  1523. if (rgbQ.rgbGreen == 255) {
  1524. rgbQ.rgbGreen = 0;
  1525. if (rgbQ.rgbRed == 255) {
  1526. rgbQ.rgbRed = 0;
  1527. } else {
  1528. rgbQ.rgbRed += 51;
  1529. }
  1530. } else {
  1531. rgbQ.rgbGreen += 51;
  1532. }
  1533. } else {
  1534. rgbQ.rgbBlue += 51;
  1535. }
  1536. *pRGBQ++ = rgbQ;
  1537. }
  1538. TDInfo.ClrUsed -= 216;
  1539. }
  1540. if (pbSrc = TDInfo.pPalette) {
  1541. for (i = 0; i < (UINT)TDInfo.ClrUsed; i++) {
  1542. pRGBQ->rgbRed = *pbSrc++;
  1543. pRGBQ->rgbGreen = *pbSrc++;
  1544. pRGBQ->rgbBlue = *pbSrc++;
  1545. pRGBQ->rgbReserved = 0;
  1546. ++pRGBQ;
  1547. }
  1548. } else {
  1549. pRGBQ += (UINT)TDInfo.ClrUsed;
  1550. }
  1551. //
  1552. // Now make up the image
  1553. //
  1554. pbDest = (LPBYTE)pRGBQ;
  1555. if (TDInfo.pBmp) {
  1556. switch(TDInfo.bpp) {
  1557. case 1:
  1558. SizeI = (DWORD)((TDInfo.cx + 7) / 8);
  1559. break;
  1560. case 4:
  1561. SizeI = (DWORD)((TDInfo.cx + 1) / 2);
  1562. break;
  1563. case 8:
  1564. SizeI = (DWORD)TDInfo.cx;
  1565. break;
  1566. case 16:
  1567. SizeI = (DWORD)TDInfo.cx * 2;
  1568. break;
  1569. }
  1570. //
  1571. // Since DIB is up-side down then we will go to end of the DIB
  1572. //
  1573. i = (UINT)TDInfo.yStrips;
  1574. pbSrc = TDInfo.pBmp + (SizeI * (DWORD)(i - 1));
  1575. while (i--) {
  1576. yLoop = RatioY[i];
  1577. while (yLoop--) {
  1578. CopyMemory(pbDest, pbSrc, SizeI);
  1579. pbDest += cxBytes;
  1580. }
  1581. pbSrc -= SizeI;
  1582. }
  1583. } else {
  1584. pbi->bmiHeader.biClrUsed = 0;
  1585. }
  1586. TestDIBInfo[TestDIBIndex].hDIB = hDIB;
  1587. GlobalUnlock(hDIB);
  1588. }
  1589. return(hDIB);
  1590. }
  1591. #if 0
  1592. HPALETTE
  1593. CreatePaletteFromDIB(
  1594. PHTCLRADJPARAM pHTClrAdjParam
  1595. )
  1596. /*++
  1597. Routine Description:
  1598. This function create a Palette from a handle to the DIB, it will check if
  1599. the palette is realizable, if not then system palette is used.
  1600. Arguments:
  1601. hDIB - handle to the dib, if hDIB = NULL then it create the palette
  1602. same as the one used by halftone VGA256 mode.
  1603. Return Value:
  1604. HPALETTE - NULL if failed
  1605. Author:
  1606. 03-Jun-1992 Wed 15:09:41 created -by- Daniel Chou (danielc)
  1607. Revision History:
  1608. --*/
  1609. {
  1610. HANDLE hDIB;
  1611. if (hDIB = pHTClrAdjParam->hCurDIB) {
  1612. PHTBLT pHTBlt;
  1613. HDC hDCScr;
  1614. LPBITMAPINFO pbi;
  1615. LPLOGPALETTE pPal;
  1616. DWORD Size;
  1617. WORD Colors;
  1618. INT BitsPerPel;
  1619. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  1620. hDCScr = GetDC(NULL);
  1621. BitsPerPel = GetDeviceCaps(hDCScr, BITSPIXEL);
  1622. ReleaseDC(NULL, hDCScr);
  1623. if (BitsPerPel <= 4) {
  1624. //
  1625. // Assume no palette change be changed on system
  1626. //
  1627. pHTBlt->hBmpPal = NULL;
  1628. } else {
  1629. if (pHTBlt->hBmpPal) {
  1630. pHTBlt->hBmpPal = (HANDLE)DeleteObject(pHTBlt->hBmpPal);
  1631. HTUI_ASSERT("DeleteObject(hOldBmpPal)", pHTBlt->hBmpPal);
  1632. pHTBlt->hBmpPal = NULL;
  1633. }
  1634. pbi = (LPBITMAPINFO)GlobalLock(hDIB);
  1635. if (Colors = (WORD)pbi->bmiHeader.biClrUsed) {
  1636. Size = (DWORD)(sizeof(LOGPALETTE) +
  1637. (DWORD)(Colors * sizeof(PALETTEENTRY)));
  1638. if (pPal = (LPLOGPALETTE)LocalAlloc(LPTR, Size)) {
  1639. LPPALETTEENTRY pPalEntry;
  1640. RGBQUAD FAR *prgb;
  1641. RGBQUAD rgb;
  1642. pPal->palVersion = 0x300;
  1643. pPal->palNumEntries = Colors;
  1644. pPalEntry = &(pPal->palPalEntry[0]);
  1645. prgb = pbi->bmiColors;
  1646. while (Colors--) {
  1647. rgb = *prgb++;
  1648. pPalEntry->peRed = rgb.rgbRed;
  1649. pPalEntry->peGreen = rgb.rgbGreen;
  1650. pPalEntry->peBlue = rgb.rgbBlue;
  1651. pPalEntry->peFlags = 0;
  1652. ++pPalEntry;
  1653. }
  1654. pHTBlt->hBmpPal = CreatePalette(pPal);
  1655. pPal = (LPLOGPALETTE)LocalFree((HLOCAL)pPal);
  1656. HTUI_ASSERT("LocalFree(pLogPal)", pPal == NULL);
  1657. }
  1658. }
  1659. GlobalUnlock(hDIB);
  1660. }
  1661. return(pHTBlt->hBmpPal);
  1662. } else {
  1663. return(NULL);
  1664. }
  1665. }
  1666. #endif
  1667. HBITMAP
  1668. CopyMemBmp(
  1669. PHTCLRADJPARAM pHTClrAdjParam
  1670. )
  1671. /*++
  1672. Routine Description:
  1673. This function duplicate the memory bitmap and return a handle to the
  1674. newly copied bitmap
  1675. Arguments:
  1676. pHTClrAdjParam
  1677. Return Value:
  1678. HBITMAP
  1679. Author:
  1680. 01-Sep-1992 Tue 11:50:54 created -by- Daniel Chou (danielc)
  1681. Revision History:
  1682. --*/
  1683. {
  1684. PHTBLT pHTBlt;
  1685. HDC hDCScr;
  1686. HDC hDCMem;
  1687. HBITMAP hMemBmp;
  1688. BITMAP Bmp;
  1689. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  1690. GetObject(pHTBlt->hMemBmp, sizeof(BITMAP), &Bmp);
  1691. if (!(hDCScr = GetDC(NULL))) {
  1692. return (NULL);
  1693. }
  1694. if (!(hDCMem = CreateCompatibleDC(hDCScr))) {
  1695. ReleaseDC(NULL, hDCScr);
  1696. return (NULL);
  1697. }
  1698. if (!(hMemBmp = CreateCompatibleBitmap(hDCScr, Bmp.bmWidth, Bmp.bmHeight))) {
  1699. DeleteDC(hDCMem);
  1700. ReleaseDC(NULL, hDCScr);
  1701. return (NULL);
  1702. }
  1703. ReleaseDC(NULL, hDCScr);
  1704. //
  1705. // Select the newly create bitmap in the compatible memory dc
  1706. //
  1707. hMemBmp = SelectObject(hDCMem, hMemBmp);
  1708. BitBlt(hDCMem, 0, 0, Bmp.bmWidth, Bmp.bmHeight,
  1709. pHTBlt->hDCMem, 0, 0,
  1710. SRCCOPY);
  1711. //
  1712. // Select the old one back, and delete that DC, return the blt'd bitmap
  1713. //
  1714. hMemBmp = SelectObject(hDCMem, hMemBmp);
  1715. DeleteDC(hDCMem);
  1716. return(hMemBmp);
  1717. }
  1718. HANDLE
  1719. BMPToDIB(
  1720. HPALETTE hBmpPal,
  1721. HBITMAP hBitmap
  1722. )
  1723. {
  1724. HANDLE hDIB = NULL;
  1725. LPBITMAPINFO pbi;
  1726. HDC hDC;
  1727. BITMAP Bmp;
  1728. DWORD BIMode;
  1729. DWORD Colors;
  1730. DWORD SizeH;
  1731. DWORD SizeI;
  1732. GetObject(hBitmap, sizeof(BITMAP), &Bmp);
  1733. if (Bmp.bmPlanes == 1) {
  1734. switch(Bmp.bmBitsPixel) {
  1735. case 1:
  1736. case 4:
  1737. case 8:
  1738. BIMode = BI_RGB;
  1739. Colors = (DWORD)(1L << Bmp.bmBitsPixel);
  1740. break;
  1741. case 16:
  1742. BIMode = BI_BITFIELDS;
  1743. Colors = 3;
  1744. break;
  1745. case 24:
  1746. BIMode = BI_RGB;
  1747. Colors = 0;
  1748. break;
  1749. default:
  1750. return(NULL);
  1751. }
  1752. SizeH = (DWORD)sizeof(BITMAPINFOHEADER) +
  1753. (DWORD)(Colors * sizeof(RGBQUAD));
  1754. SizeI = (DWORD)ALIGN_BPP_DW(Bmp.bmWidth, Bmp.bmBitsPixel) *
  1755. (DWORD)Bmp.bmHeight;
  1756. if (hDIB = GlobalAlloc(GHND, (SizeH + SizeI))) {
  1757. hDC = GetDC(NULL);
  1758. if (!hDC) {
  1759. GlobalFree(hDIB);
  1760. return NULL;
  1761. }
  1762. pbi = GlobalLock(hDIB);
  1763. pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  1764. pbi->bmiHeader.biWidth = Bmp.bmWidth;
  1765. pbi->bmiHeader.biHeight = Bmp.bmHeight;
  1766. pbi->bmiHeader.biPlanes = 1;
  1767. pbi->bmiHeader.biBitCount = Bmp.bmBitsPixel;
  1768. pbi->bmiHeader.biCompression = BIMode;
  1769. pbi->bmiHeader.biSizeImage = SizeI;
  1770. pbi->bmiHeader.biXPelsPerMeter = 0;
  1771. pbi->bmiHeader.biYPelsPerMeter = 0;
  1772. SelectPalette(hDC, hBmpPal, FALSE);
  1773. RealizePalette(hDC);
  1774. GetDIBits(hDC,
  1775. hBitmap,
  1776. 0,
  1777. Bmp.bmHeight,
  1778. (LPBYTE)pbi + SizeH,
  1779. pbi,
  1780. DIB_RGB_COLORS);
  1781. pbi->bmiHeader.biClrUsed =
  1782. pbi->bmiHeader.biClrImportant = Colors;
  1783. GlobalUnlock(hDIB);
  1784. ReleaseDC(NULL, hDC);
  1785. }
  1786. }
  1787. return(hDIB);
  1788. }
  1789. HANDLE
  1790. ReadDIBFile(
  1791. HANDLE hFile
  1792. )
  1793. /*++
  1794. Routine Description:
  1795. This function read the file in DIB format and return a global HANDLE
  1796. to it's BITMAPINFO and it also fill the BITMAPINFOHEADER at return.
  1797. This function will work with both "old" (BITMAPCOREHEADER) and "new"
  1798. (BITMAPINFOHEADER) bitmap formats, but will always return a
  1799. "new" BITMAPINFO
  1800. Arguments:
  1801. hFile - Handle to the opened DIB file
  1802. Return Value:
  1803. A handle to the BITMAPINFO of the DIB in the file if sucessful and it
  1804. return NULL if failed.
  1805. Author:
  1806. 14-Nov-1991 Thu 18:22:08 created -by- Daniel Chou (danielc)
  1807. Revision History:
  1808. --*/
  1809. {
  1810. HANDLE hDIB;
  1811. LPBYTE pDIB;
  1812. RGBQUAD FAR *pRGBQUAD;
  1813. RGBTRIPLE FAR *pRGBTRIPLE;
  1814. BITMAPINFOHEADER bi;
  1815. BITMAPCOREHEADER bc;
  1816. DWORD cx;
  1817. DWORD cy;
  1818. DWORD OffBits;
  1819. DWORD cbRead;
  1820. DWORD PalCount;
  1821. DWORD PalSize;
  1822. WORD BmpType;
  1823. BYTE Buf[sizeof(DWORD) + sizeof(WORD) * 2];
  1824. BOOL bcType = FALSE;
  1825. BOOL Ok = TRUE;
  1826. SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
  1827. //
  1828. // typedef struct tagBITMAPFILEHEADER {
  1829. // WORD bfType;
  1830. // DWORD bfSize;
  1831. // WORD bfReserved1;
  1832. // WORD bfReserved2;
  1833. // DWORD bfOffBits;
  1834. // } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
  1835. //
  1836. // Since the BITMAPFILEHEADER is not dword aligned, we must make sure
  1837. // it read in correct data, so we will read the data in fields
  1838. //
  1839. if ((!ReadFile(hFile, &BmpType, sizeof(WORD), &cbRead, NULL)) ||
  1840. (cbRead != sizeof(WORD)) ||
  1841. (!ISDIB(BmpType)) ||
  1842. (!ReadFile(hFile, Buf, sizeof(Buf), &cbRead, NULL)) ||
  1843. (cbRead != sizeof(Buf)) ||
  1844. (!ReadFile(hFile, &OffBits, sizeof(OffBits), &cbRead, NULL)) ||
  1845. (cbRead != sizeof(OffBits)) ||
  1846. (!ReadFile(hFile, &bi, sizeof(bi), &cbRead, NULL)) ||
  1847. (cbRead != sizeof(bi))) {
  1848. return(NULL);
  1849. }
  1850. //
  1851. // Check the nature (BITMAPINFO or BITMAPCORE) of the info. block
  1852. // and extract the field information accordingly. If a BITMAPCOREHEADER,
  1853. // transfer it's field information to a BITMAPINFOHEADER-style block
  1854. //
  1855. if (bi.biSize == sizeof(BITMAPCOREHEADER)) {
  1856. bcType = TRUE;
  1857. bc = *(BITMAPCOREHEADER*)&bi;
  1858. bi.biSize = sizeof(BITMAPINFOHEADER);
  1859. bi.biWidth = (LONG)bc.bcWidth;
  1860. bi.biHeight = (LONG)bc.bcHeight;
  1861. bi.biPlanes = (WORD)bc.bcPlanes;
  1862. bi.biBitCount = (WORD)bc.bcBitCount;
  1863. bi.biCompression = (DWORD)BI_RGB;
  1864. bi.biXPelsPerMeter = 0;
  1865. bi.biYPelsPerMeter = 0;
  1866. bi.biClrUsed = (DWORD)(1L << bi.biBitCount);
  1867. SetFilePointer(hFile,
  1868. (LONG)(sizeof(BITMAPCOREHEADER)-sizeof(BITMAPINFOHEADER)),
  1869. NULL,
  1870. FILE_CURRENT);
  1871. } else if (bi.biSize != sizeof(BITMAPINFOHEADER)) {
  1872. return(NULL); // unknown format
  1873. }
  1874. if ((bi.biPlanes != 1) ||
  1875. (bi.biCompression == BI_RLE4) ||
  1876. (bi.biCompression == BI_RLE8)) {
  1877. return(NULL); // do not know how to do this
  1878. }
  1879. switch(bi.biBitCount) {
  1880. case 1:
  1881. case 4:
  1882. case 8:
  1883. PalCount = (DWORD)(1L << bi.biBitCount);
  1884. if ((!bi.biClrUsed) ||
  1885. (bi.biClrUsed > PalCount)) {
  1886. bi.biClrUsed = PalCount;
  1887. } else {
  1888. PalCount = bi.biClrUsed;
  1889. }
  1890. break;
  1891. case 16:
  1892. case 32:
  1893. if (bi.biCompression != BI_BITFIELDS) {
  1894. return(NULL);
  1895. }
  1896. PalCount = 3;
  1897. bi.biClrUsed = 0; // 3 DWORDs
  1898. break;
  1899. case 24:
  1900. PalCount =
  1901. bi.biClrUsed = 0;
  1902. break;
  1903. default:
  1904. return(NULL);
  1905. }
  1906. cx = (DWORD)ABSL(bi.biWidth);
  1907. cy = (DWORD)ABSL(bi.biHeight);
  1908. bi.biClrImportant = bi.biClrUsed;
  1909. bi.biSizeImage = (DWORD)ALIGN_BPP_DW(cx, bi.biBitCount) * cy;
  1910. PalSize = PalCount * sizeof(RGBQUAD);
  1911. //
  1912. // Allocate the header+palette
  1913. //
  1914. if (!(hDIB = GlobalAlloc(GHND, bi.biSize + PalSize + bi.biSizeImage))) {
  1915. return(NULL);
  1916. }
  1917. pDIB = (LPBYTE)GlobalLock(hDIB);
  1918. *(LPBITMAPINFOHEADER)pDIB = bi;
  1919. if (PalCount) {
  1920. pRGBQUAD = (RGBQUAD FAR *)(pDIB + bi.biSize);
  1921. if (bcType) {
  1922. //
  1923. // Convert a old color table (3 byte RGBTRIPLEs) to a new color
  1924. // table (4 byte RGBQUADs)
  1925. //
  1926. pRGBTRIPLE = (RGBTRIPLE FAR *)
  1927. (pDIB + bi.biSize +
  1928. ((sizeof(RGBQUAD) -
  1929. sizeof(RGBTRIPLE)) * PalCount));
  1930. if ((!ReadFile(hFile,
  1931. pRGBTRIPLE,
  1932. sizeof(RGBTRIPLE) * PalCount,
  1933. &cbRead,
  1934. NULL)) ||
  1935. (cbRead != sizeof(RGBTRIPLE) * PalCount)) {
  1936. Ok = FALSE;
  1937. } else {
  1938. cbRead = PalCount;
  1939. while (cbRead--) {
  1940. pRGBQUAD->rgbRed = pRGBTRIPLE->rgbtRed;
  1941. pRGBQUAD->rgbGreen = pRGBTRIPLE->rgbtGreen;
  1942. pRGBQUAD->rgbBlue = pRGBTRIPLE->rgbtBlue;
  1943. pRGBQUAD->rgbReserved = 0;
  1944. ++pRGBQUAD;
  1945. ++pRGBTRIPLE;
  1946. }
  1947. }
  1948. } else {
  1949. Ok = ((ReadFile(hFile, pRGBQUAD, PalSize, &cbRead, NULL)) &&
  1950. (cbRead == PalSize));
  1951. }
  1952. }
  1953. //
  1954. // set it to the begining of the bitmap if it said so.
  1955. //
  1956. if ((Ok) && (OffBits)) {
  1957. SetFilePointer(hFile, OffBits, NULL, FILE_BEGIN);
  1958. }
  1959. //
  1960. // Read in the bitmap
  1961. //
  1962. if ((!Ok) ||
  1963. (!ReadFile(hFile,
  1964. pDIB + bi.biSize + PalSize,
  1965. bi.biSizeImage,
  1966. &cbRead,
  1967. NULL)) ||
  1968. (cbRead != bi.biSizeImage)) {
  1969. Ok = FALSE;
  1970. }
  1971. GlobalUnlock(hDIB);
  1972. if (!Ok) {
  1973. GlobalFree(hDIB);
  1974. hDIB = NULL;
  1975. }
  1976. return(hDIB);
  1977. }
  1978. HANDLE
  1979. CreateDIBFromFile(
  1980. LPWSTR pFile
  1981. )
  1982. /*++
  1983. Routine Description:
  1984. This function open a DIB file and create a MEMORY DIB, the memory handle
  1985. contains BITMAPINFO/palette data and bits, this function will also read
  1986. os/2 style bitmap. This functions also read GIF file
  1987. Arguments:
  1988. pFile - The DIB file name
  1989. Return Value:
  1990. Return the handle to the created memory DIB if sucessful, NULL if
  1991. failed.
  1992. Author:
  1993. 14-Nov-1991 Thu 18:13:21 created -by- Daniel Chou (danielc)
  1994. Revision History:
  1995. --*/
  1996. {
  1997. HCURSOR hCursorOld;
  1998. HANDLE hFile;
  1999. HANDLE hDIB;
  2000. //
  2001. // Open the file and read the DIB information
  2002. //
  2003. hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
  2004. hFile = CreateFile(pFile,
  2005. GENERIC_READ,
  2006. FILE_SHARE_READ,
  2007. NULL,
  2008. OPEN_EXISTING,
  2009. FILE_ATTRIBUTE_NORMAL,
  2010. NULL);
  2011. if (hFile == INVALID_HANDLE_VALUE) {
  2012. hDIB = NULL;
  2013. } else {
  2014. if (!(hDIB = ReadDIBFile(hFile))) {
  2015. hDIB = ReadGIFFile(hFile); // try again with GIF file
  2016. }
  2017. CloseHandle(hFile);
  2018. }
  2019. SetCursor(hCursorOld);
  2020. return(hDIB);
  2021. }
  2022. VOID
  2023. AdjustDlgZorder(
  2024. PHTCLRADJPARAM pHTClrAdjParam
  2025. )
  2026. {
  2027. HDWP hDWP;
  2028. HWND hWndTop;
  2029. HWND hWndBot;
  2030. HWND hWndBmp;
  2031. UINT SWPMode;
  2032. if ((hWndBmp = pHTClrAdjParam->hWndBmp) &&
  2033. (IsWindowEnabled(hWndBmp))) {
  2034. if (IS_BMP_AT_TOP(pHTClrAdjParam->BmpFlags)) {
  2035. hWndBot = pHTClrAdjParam->hDlg;
  2036. hWndTop = hWndBmp;
  2037. SWPMode = SWP_NOMOVE |
  2038. SWP_NOSIZE |
  2039. SWP_NOOWNERZORDER;
  2040. } else {
  2041. hWndBot = hWndBmp;
  2042. hWndTop = pHTClrAdjParam->hDlg;
  2043. SWPMode = SWP_NOMOVE |
  2044. SWP_NOSIZE |
  2045. SWP_NOACTIVATE |
  2046. SWP_NOOWNERZORDER;
  2047. }
  2048. hDWP = BeginDeferWindowPos(2);
  2049. if (!hDWP) {
  2050. return;
  2051. }
  2052. hDWP = DeferWindowPos(hDWP,
  2053. hWndTop, NULL,
  2054. 0, 0, 0, 0, SWPMode ^ SWP_NOACTIVATE);
  2055. if (!hDWP) {
  2056. return;
  2057. }
  2058. hDWP = DeferWindowPos(hDWP,
  2059. hWndBot, hWndTop,
  2060. 0, 0, 0, 0, SWPMode);
  2061. if (!hDWP) {
  2062. return;
  2063. }
  2064. EndDeferWindowPos(hDWP);
  2065. }
  2066. }
  2067. VOID
  2068. SetBmpDescription(
  2069. HWND hDlg,
  2070. LPBITMAPINFOHEADER pbih,
  2071. DWORD cx,
  2072. DWORD cy,
  2073. INT DlgID
  2074. )
  2075. /*++
  2076. Routine Description:
  2077. Set current dialog box title
  2078. Arguments:
  2079. hDIB - The DIB to set the description
  2080. Return Value:
  2081. VOID
  2082. Author:
  2083. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  2084. Revision History:
  2085. --*/
  2086. {
  2087. LPWSTR pStr;
  2088. WCHAR Buf[82];
  2089. Buf[0] = L'\0';
  2090. if (cx) {
  2091. if (DlgID == IDD_HT_HALFTONE_DESC) {
  2092. Buf[0] =
  2093. Buf[1] = L'-';
  2094. Buf[2] = L'>';
  2095. pStr = (LPWSTR)&Buf[3];
  2096. } else {
  2097. pStr = (LPWSTR)Buf;
  2098. }
  2099. pStr += wsprintf(pStr, L" %ldx%ld", cx, cy);
  2100. if ((DlgID != IDD_HT_HALFTONE_DESC) && (pbih)) {
  2101. if (pbih->biBitCount >= 16) {
  2102. wsprintf(pStr, L", %ld bpp", pbih->biBitCount);
  2103. } else {
  2104. wsprintf(pStr, L", %ld @%ld",
  2105. pbih->biClrUsed, pbih->biBitCount);
  2106. }
  2107. }
  2108. }
  2109. SetDlgItemText(hDlg, DlgID, Buf);
  2110. }
  2111. BOOL
  2112. ReSizeBmpWindow(
  2113. PHTCLRADJPARAM pHTClrAdjParam
  2114. )
  2115. /*++
  2116. Routine Description:
  2117. This functions resize the bitmap window and hBitmap selected in the
  2118. memory DC
  2119. Arguments:
  2120. pHTClrAdjParam
  2121. Return Value:
  2122. BOOL, true if final size changed
  2123. Author:
  2124. 31-Aug-1992 Mon 14:38:45 created -by- Daniel Chou (danielc)
  2125. Revision History:
  2126. --*/
  2127. {
  2128. HWND hWnd;
  2129. HDC hDCWnd;
  2130. BOOL SizeChanged = FALSE;
  2131. if (hWnd = pHTClrAdjParam->hWndBmp) {
  2132. PHTBLT pHTBlt;
  2133. HDC hDCMem;
  2134. BITMAP bmp;
  2135. HBITMAP hBmpOld, hMemBmp;
  2136. RECT rcWnd;
  2137. LONG xSize;
  2138. LONG ySize;
  2139. DWORD biWidth;
  2140. DWORD biHeight;
  2141. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  2142. //
  2143. // Only if we ever create this window
  2144. //
  2145. if (!(hDCMem = pHTBlt->hDCMem)) {
  2146. hDCWnd = GetDC(NULL);
  2147. if (!hDCWnd) {
  2148. return FALSE;
  2149. }
  2150. hDCMem =
  2151. pHTBlt->hDCMem = CreateCompatibleDC(hDCWnd);
  2152. if (!pHTBlt->hDCMem) {
  2153. ReleaseDC(NULL, hDCWnd);
  2154. return FALSE;
  2155. }
  2156. pHTBlt->hMemBmp = CreateCompatibleBitmap(hDCWnd, 1, 1);
  2157. ReleaseDC(NULL, hDCWnd);
  2158. if (!pHTBlt->hMemBmp) {
  2159. DeleteDC(pHTBlt->hDCMem);
  2160. pHTBlt->hDCMem = NULL;
  2161. return FALSE;
  2162. }
  2163. }
  2164. //
  2165. // Find out the current size, left,top always 0 at here, this imply
  2166. // that bottom, right is the size
  2167. //
  2168. GetClientRect(hWnd, &rcWnd);
  2169. xSize = (LONG)rcWnd.right;
  2170. ySize = (LONG)rcWnd.bottom;
  2171. if ((pHTClrAdjParam->BmpFlags & HT_BMP_SCALE) &&
  2172. (pHTClrAdjParam->hCurDIB)) {
  2173. LPBITMAPINFOHEADER pbih;
  2174. LONG xRatio;
  2175. LONG yRatio;
  2176. pbih = (LPBITMAPINFOHEADER)GlobalLock(pHTClrAdjParam->hCurDIB);
  2177. biWidth = ABSL(pbih->biWidth);
  2178. biHeight = ABSL(pbih->biHeight);
  2179. xRatio = (LONG)((xSize * 1000L) / biWidth);
  2180. yRatio = (LONG)((ySize * 1000L) / biHeight);
  2181. //
  2182. // Using xRatio as final minimum ratio
  2183. //
  2184. if (xRatio <= yRatio) {
  2185. //
  2186. // Width size does not chagned, but height must scale
  2187. //
  2188. if ((ySize = (LONG)(((biHeight * xRatio) + 500L) /
  2189. 1000L)) > (LONG)rcWnd.bottom) {
  2190. ySize = (LONG)rcWnd.bottom;
  2191. }
  2192. rcWnd.top = ((LONG)rcWnd.bottom - ySize) / 2;
  2193. rcWnd.bottom = rcWnd.top + ySize;
  2194. } else {
  2195. //
  2196. // Height size does not chagned, but width must scale
  2197. //
  2198. if ((xSize = (LONG)(((biWidth * yRatio) + 500L) /
  2199. 1000L)) > (LONG)rcWnd.right) {
  2200. xSize = (LONG)rcWnd.right;
  2201. }
  2202. rcWnd.left = ((LONG)rcWnd.right - xSize) / 2;
  2203. rcWnd.right = rcWnd.left + xSize;
  2204. }
  2205. GlobalUnlock(pHTClrAdjParam->hCurDIB);
  2206. }
  2207. if (!GetObject(pHTBlt->hMemBmp, sizeof(BITMAP), &bmp)) {
  2208. return FALSE;
  2209. }
  2210. if ((xSize != bmp.bmWidth) || (ySize != bmp.bmHeight)) {
  2211. //
  2212. // Size of the final bitmap has changed
  2213. //
  2214. hDCWnd = GetDC(NULL);
  2215. if (!hDCWnd) {
  2216. return FALSE;
  2217. }
  2218. hMemBmp = CreateCompatibleBitmap(hDCWnd, xSize, ySize);
  2219. ReleaseDC(NULL, hDCWnd);
  2220. if (!hMemBmp) {
  2221. return FALSE;
  2222. }
  2223. hBmpOld = SelectObject(hDCMem, hMemBmp);
  2224. if (!hBmpOld) {
  2225. DeleteObject(hMemBmp);
  2226. return FALSE;
  2227. }
  2228. pHTBlt->hMemBmp = hMemBmp;
  2229. DeleteObject(hBmpOld);
  2230. SetBmpDescription(pHTClrAdjParam->hDlg,
  2231. NULL,
  2232. xSize,
  2233. ySize,
  2234. IDD_HT_HALFTONE_DESC);
  2235. SizeChanged = TRUE;
  2236. }
  2237. pHTBlt->rcMemBmp = rcWnd;
  2238. }
  2239. return(SizeChanged);
  2240. }
  2241. INT
  2242. FindViewSource(
  2243. HWND hDlg,
  2244. LPWSTR pNewString,
  2245. WORD ViewSrc,
  2246. BOOL Delete
  2247. )
  2248. /*++
  2249. Routine Description:
  2250. This functions return the zero based index number for a list box item
  2251. which has CB_ITEMDATA set to the ItemData.
  2252. Arguments:
  2253. hDlg - Handle to the dialog box to search for.
  2254. ViewSrc - The view mode which was set to the ITEMDATA
  2255. pNewString - If not NULL then it will replace found index's string
  2256. Select - TRUE if this is the new selection
  2257. Return Value:
  2258. it return a zero based index, if it can not find the ItemData passed it
  2259. return 0
  2260. Author:
  2261. 22-Apr-1992 Wed 10:20:36 created -by- Daniel Chou (danielc)
  2262. Revision History:
  2263. --*/
  2264. {
  2265. INT Index = 0;
  2266. INT Count;
  2267. BYTE Buf[80];
  2268. Count = (INT)SendDlgItemMessage(hDlg,
  2269. IDD_HT_SHOW_COMBO,
  2270. CB_GETCOUNT,
  2271. (WPARAM)NULL,
  2272. (LPARAM)NULL);
  2273. while (Index < Count) {
  2274. if ((WORD)SendDlgItemMessage(hDlg,
  2275. IDD_HT_SHOW_COMBO,
  2276. CB_GETITEMDATA,
  2277. (WPARAM)Index,
  2278. (LPARAM)NULL) == ViewSrc) {
  2279. break;
  2280. }
  2281. ++Index;
  2282. }
  2283. if (pNewString) {
  2284. if (Index >= Count) {
  2285. Index = (INT)(Count - VSRC_TEST_COUNT);
  2286. *pNewString = (WCHAR)(Index + VSRC_LB_ID_START);
  2287. ++Count; // insert one more
  2288. } else {
  2289. SendDlgItemMessage(hDlg,
  2290. IDD_HT_SHOW_COMBO,
  2291. CB_GETLBTEXT,
  2292. (WPARAM)Index,
  2293. (LPARAM)Buf);
  2294. *pNewString = Buf[0];
  2295. SendDlgItemMessage(hDlg,
  2296. IDD_HT_SHOW_COMBO,
  2297. CB_DELETESTRING,
  2298. (WPARAM)Index,
  2299. (LPARAM)NULL);
  2300. }
  2301. Index = (INT)SendDlgItemMessage(hDlg,
  2302. IDD_HT_SHOW_COMBO,
  2303. CB_INSERTSTRING,
  2304. (WPARAM)Index,
  2305. (LPARAM)pNewString);
  2306. SendDlgItemMessage(hDlg,
  2307. IDD_HT_SHOW_COMBO,
  2308. CB_SETITEMDATA,
  2309. (WPARAM)Index,
  2310. (LPARAM)ViewSrc);
  2311. Delete = FALSE;
  2312. }
  2313. if (Index < Count) {
  2314. SendDlgItemMessage(hDlg,
  2315. IDD_HT_SHOW_COMBO,
  2316. (Delete) ? CB_DELETESTRING : CB_SETCURSEL,
  2317. (WPARAM)Index,
  2318. (LPARAM)NULL);
  2319. return(Index);
  2320. } else {
  2321. return(-1);
  2322. }
  2323. }
  2324. BOOL
  2325. ChangeViewSource(
  2326. HWND hDlg,
  2327. PHTCLRADJPARAM pHTClrAdjParam,
  2328. WORD ViewSrc
  2329. )
  2330. /*++
  2331. Routine Description:
  2332. This function will pop up the file selection dialog box and let user to
  2333. select a test bitmap (ie. either a DIB or GIF), then create the memory
  2334. DIB based on the opened bitmap file.
  2335. Arguments:
  2336. pHTClrAdjParam - Pointer to the HTCLRADJPARAM
  2337. Return Value:
  2338. BOOLEAN indicate if the DIB was created, if created the new DIB handle will
  2339. be set in the pHTClrAdjParam->hCurDIB, otherwise nothing is modified.
  2340. Author:
  2341. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  2342. Revision History:
  2343. 02-Jun-1992 Tue 21:53:09 updated -by- Daniel Chou (danielc)
  2344. 1. Aligned FileName[] start at WORD boundary so the comdlg32.dll will
  2345. not GP. (it will be a bug raised against comdlg32.dll)
  2346. --*/
  2347. {
  2348. HANDLE hDIB = NULL;
  2349. LPBITMAPINFOHEADER pbih;
  2350. switch(ViewSrc) {
  2351. case VSRC_PIC_DEF_DIB:
  2352. hDIB = pHTClrAdjParam->hDefDIB;
  2353. break;
  2354. case VSRC_PIC_LOADED:
  2355. if (!(hDIB = pHTClrAdjParam->hSrcDIB)) {
  2356. //
  2357. // The hSrcDIB is not loaded, go load the last time loaded picture
  2358. //
  2359. if (!(hDIB = GetNewDIBFromFile(pHTClrAdjParam, TRUE))) {
  2360. //
  2361. // The default picture (bitmap) file does not exist, we will
  2362. // delete list box entry for default picture and switch to
  2363. // default View MODE
  2364. //
  2365. FindViewSource(hDlg, NULL, VSRC_PIC_LOADED, TRUE);
  2366. GetSaveDefDIBFileName(hDlg, NULL, 0);
  2367. }
  2368. }
  2369. break;
  2370. case VSRC_RGB:
  2371. hDIB = MakeTestDIB(TDI_RGBTEST);
  2372. break;
  2373. case VSRC_REFCOLORS:
  2374. hDIB = MakeTestDIB(TDI_REFCOLORS);
  2375. break;
  2376. case VSRC_NTSC_BAR:
  2377. hDIB = MakeTestDIB(TDI_NTSC);
  2378. break;
  2379. }
  2380. if (!hDIB) {
  2381. hDIB = MakeTestDIB(TDI_DEFAULT);
  2382. if (!hDIB) {
  2383. return FALSE;
  2384. }
  2385. pHTClrAdjParam->ViewMode = 0xff;
  2386. ViewSrc = DEFAULT_VSRC;
  2387. }
  2388. if (pHTClrAdjParam->ViewMode != (BYTE)ViewSrc) {
  2389. FindViewSource(hDlg,
  2390. NULL,
  2391. pHTClrAdjParam->ViewMode = (BYTE)ViewSrc,
  2392. FALSE);
  2393. }
  2394. pbih = (LPBITMAPINFOHEADER)GlobalLock(pHTClrAdjParam->hCurDIB = hDIB);
  2395. SetBmpDescription(hDlg,
  2396. pbih,
  2397. pbih->biWidth,
  2398. pbih->biHeight,
  2399. IDD_HT_PIC_NAME);
  2400. GlobalUnlock(hDIB);
  2401. #if 0
  2402. CreatePaletteFromDIB(pHTClrAdjParam);
  2403. #endif
  2404. ReSizeBmpWindow(pHTClrAdjParam);
  2405. pHTClrAdjParam->BmpNeedUpdate = 1;
  2406. if (hDIB = TestDIBInfo[TDI_CLRPAL].hDIB) {
  2407. pbih = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  2408. pbih->biClrUsed = 0;
  2409. GlobalUnlock(hDIB);
  2410. }
  2411. return(TRUE);
  2412. }
  2413. HANDLE
  2414. GetNewDIBFromFile(
  2415. PHTCLRADJPARAM pHTClrAdjParam,
  2416. BOOL Default
  2417. )
  2418. /*++
  2419. Routine Description:
  2420. This functions pop-up dialog box and ask a new dib, if file exist and
  2421. user select ok then it create a new dib from the file.
  2422. Arguments:
  2423. pHTClrAdjParam
  2424. Return Value:
  2425. HANDLE to the DIB, NULL if not sucessful
  2426. Author:
  2427. 02-Sep-1992 Wed 12:53:21 created -by- Daniel Chou (danielc)
  2428. Revision History:
  2429. --*/
  2430. {
  2431. HWND hDlg = pHTClrAdjParam->hDlg;
  2432. HANDLE hDIB;
  2433. OPENFILENAME ofn;
  2434. BOOL Ok;
  2435. UINT Index;
  2436. WCHAR ch;
  2437. WCHAR FileDlgTitle[96];
  2438. WCHAR FileName[84 + 164];
  2439. FileName[0] = L'\0';
  2440. FileName[1] = L'?';
  2441. FileName[2] = VSRC_LB_ID_SEPARATOR;
  2442. FileName[3] = L' ';
  2443. if (Default) {
  2444. Ok = TRUE;
  2445. GetSaveDefDIBFileName(hDlg,
  2446. &FileName[4],
  2447. COUNT_ARRAY(FileName)-4);
  2448. } else {
  2449. LoadString(hHTUIModule,
  2450. IDS_FILEDLGTITLE,
  2451. FileDlgTitle,
  2452. COUNT_ARRAY(FileDlgTitle));
  2453. Index = (UINT)(GetSaveDefDIBFileName(hDlg,
  2454. &FileName[84],
  2455. COUNT_ARRAY(FileName) - 84) + 84);
  2456. wcscpy(&FileName[4], &FileName[Index]); // copy filename over
  2457. FileName[Index] = L'\0'; // leave only path
  2458. if (Index > 84) {
  2459. switch (FileName[--Index]) {
  2460. case L':':
  2461. FileName[Index] = L'\0';
  2462. break;
  2463. case L'\\':
  2464. case L'/':
  2465. if (Index > 84) {
  2466. if (((ch = FileName[Index-1]) != L'\\') &&
  2467. (ch != L'/') &&
  2468. (ch != L'.') &&
  2469. (ch != L':')) {
  2470. FileName[Index] = L'\0';
  2471. }
  2472. }
  2473. break;
  2474. default:
  2475. break;
  2476. }
  2477. }
  2478. ofn.lStructSize = sizeof(OPENFILENAME);
  2479. ofn.hwndOwner = hDlg;
  2480. ofn.hInstance = hHTUIModule;
  2481. ofn.lpstrFilter = FileOpenExtFilter;
  2482. ofn.lpstrCustomFilter = NULL;
  2483. ofn.nMaxCustFilter = 0;
  2484. ofn.nFilterIndex = 1;
  2485. ofn.lpstrFile = &FileName[4];
  2486. ofn.nMaxFile = COUNT_ARRAY(FileName) - 4;
  2487. ofn.lpstrFileTitle = NULL;
  2488. ofn.lpstrInitialDir = &FileName[84];
  2489. ofn.lpstrTitle = FileDlgTitle;
  2490. ofn.Flags = OFN_PATHMUSTEXIST |
  2491. OFN_FILEMUSTEXIST |
  2492. OFN_HIDEREADONLY;
  2493. ofn.nFileOffset = 0;
  2494. ofn.nFileExtension = 0;
  2495. ofn.lpstrDefExt = BmpExt;
  2496. ofn.lCustData = 0;
  2497. ofn.lpfnHook = NULL;
  2498. ofn.lpTemplateName = NULL;
  2499. EnableWindow(pHTClrAdjParam->hWndBmp, FALSE);
  2500. Ok = GetOpenFileName(&ofn);
  2501. EnableWindow(pHTClrAdjParam->hWndBmp, TRUE);
  2502. }
  2503. //
  2504. // Fall through
  2505. //
  2506. if ((!Ok) || (!(hDIB = CreateDIBFromFile(&FileName[4])))) {
  2507. return(NULL);
  2508. }
  2509. Index = GetSaveDefDIBFileName(hDlg, &FileName[4], 0);
  2510. wcscpy(&FileName[4], &FileName[Index + 4]);
  2511. if (pHTClrAdjParam->hSrcDIB) {
  2512. pHTClrAdjParam->hSrcDIB = GlobalFree(pHTClrAdjParam->hSrcDIB);
  2513. HTUI_ASSERT("GlobalFree(hOldSrcDIB)", pHTClrAdjParam->hSrcDIB == NULL);
  2514. }
  2515. pHTClrAdjParam->hSrcDIB = hDIB;
  2516. FindViewSource(hDlg, &FileName[1], VSRC_PIC_LOADED, FALSE);
  2517. ChangeViewSource(pHTClrAdjParam->hDlg, pHTClrAdjParam, VSRC_PIC_LOADED);
  2518. return(hDIB);
  2519. }
  2520. LRESULT
  2521. APIENTRY
  2522. HTClrAdjBmpWndProc(
  2523. HWND hWnd,
  2524. UINT Msg,
  2525. WPARAM wParam,
  2526. LPARAM lParam
  2527. )
  2528. {
  2529. PHTBLT pHTBlt;
  2530. HPALETTE hCurPal;
  2531. HPALETTE hPalDlg;
  2532. HPALETTE hPalMem;
  2533. HPALETTE hPalDC;
  2534. HWND hDlg;
  2535. HDC hDCMem;
  2536. HDC hDC;
  2537. PHTCLRADJPARAM pHTClrAdjParam;
  2538. PAINTSTRUCT ps;
  2539. SHORT Colorfulness;
  2540. SHORT RedGreenTint;
  2541. RECT Rect;
  2542. RECT rcMemBmp;
  2543. WORD BmpFlags;
  2544. WORD Zoomed;
  2545. pHTClrAdjParam = (PHTCLRADJPARAM)GetWindowLongPtr(hWnd, GWLP_USERDATA);
  2546. if ((!pHTClrAdjParam) ||
  2547. (!IsWindowVisible(hWnd))) {
  2548. //
  2549. // nothing to do really
  2550. //
  2551. return(DefWindowProc(hWnd, Msg, wParam, lParam));
  2552. }
  2553. hDlg = pHTClrAdjParam->hDlg;
  2554. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  2555. BmpFlags = pHTClrAdjParam->BmpFlags;
  2556. switch(Msg) {
  2557. case WM_NCLBUTTONDOWN:
  2558. lParam = DefWindowProc(hWnd, Msg, wParam, lParam);
  2559. SetActiveWindow(hDlg);
  2560. return(lParam);
  2561. case WM_LBUTTONDOWN:
  2562. if ((pHTClrAdjParam->Flags & HTCAPF_CAN_UPDATE) &&
  2563. (!(BmpFlags & HT_BMP_ZOOM))) {
  2564. POINT pt;
  2565. pt.x = (LONG)LOWORD(lParam);
  2566. pt.y = (LONG)HIWORD(lParam);
  2567. ClientToScreen(hWnd, &pt);
  2568. SendMessage(hWnd,
  2569. WM_NCLBUTTONDOWN,
  2570. HTCAPTION,
  2571. MAKELPARAM(pt.x, pt.y));
  2572. }
  2573. break;
  2574. case WM_NCRBUTTONDOWN:
  2575. case WM_RBUTTONDOWN:
  2576. if ((pHTClrAdjParam->Flags & HTCAPF_CAN_UPDATE) &&
  2577. (BmpFlags & HT_BMP_ZOOM)) {
  2578. pHTClrAdjParam->BmpFlags ^= HT_BMP_AT_TOP;
  2579. AdjustDlgZorder(pHTClrAdjParam);
  2580. SendMessage(hDlg, WM_COMMAND, (WPARAM)IDD_HT_BRING_TO_TOP, 0L);
  2581. }
  2582. break;
  2583. case WM_COMMAND:
  2584. switch (LOWORD(wParam)) {
  2585. case IDD_HT_BRING_TO_TOP:
  2586. AdjustDlgZorder(pHTClrAdjParam);
  2587. }
  2588. break;
  2589. case WM_SIZE:
  2590. if (ReSizeBmpWindow(pHTClrAdjParam)) {
  2591. pHTClrAdjParam->BmpNeedUpdate = 1;
  2592. }
  2593. case WM_MOVE:
  2594. if (!(BmpFlags & HT_BMP_ZOOM)) {
  2595. GetWindowRect(hWnd, &(pHTClrAdjParam->rcBmp));
  2596. }
  2597. break;
  2598. case WM_LBUTTONDBLCLK:
  2599. pHTClrAdjParam->BmpFlags &= ~HT_BMP_AT_TOP;
  2600. pHTClrAdjParam->BmpFlags ^= HT_BMP_ZOOM;
  2601. BmpFlags = pHTClrAdjParam->BmpFlags;
  2602. Zoomed = (WORD)((BmpFlags & HT_BMP_ZOOM) ? 1 : 0);
  2603. CheckDlgButton(hDlg, IDD_HT_ZOOM, Zoomed);
  2604. SetClassLongPtr(hWnd,
  2605. GCLP_HCURSOR,
  2606. (LONG_PTR)LoadCursor(NULL, (Zoomed) ? IDC_NO : IDC_SIZEALL));
  2607. if (Zoomed) {
  2608. Rect.left = -(LONG)GetSystemMetrics(SM_CXFRAME);
  2609. Rect.top = -(LONG)GetSystemMetrics(SM_CYFRAME);
  2610. Rect.right = (LONG)GetSystemMetrics(SM_CXSCREEN) - Rect.left;
  2611. Rect.bottom = (LONG)GetSystemMetrics(SM_CYSCREEN) - Rect.top;
  2612. } else {
  2613. Rect = pHTClrAdjParam->rcBmp;
  2614. }
  2615. SetWindowPos(hWnd,
  2616. IS_BMP_AT_TOP(BmpFlags) ? NULL : hDlg,
  2617. Rect.left,
  2618. Rect.top,
  2619. Rect.right - Rect.left,
  2620. Rect.bottom - Rect.top,
  2621. SWP_DRAWFRAME | SWP_NOACTIVATE);
  2622. break;
  2623. case WM_PAINT:
  2624. if (!(hDCMem = pHTBlt->hDCMem)) {
  2625. ReSizeBmpWindow(pHTClrAdjParam);
  2626. hDCMem = pHTBlt->hDCMem;
  2627. if (!hDCMem) {
  2628. return 0;
  2629. }
  2630. }
  2631. GetClientRect(hWnd, &Rect);
  2632. hDC = BeginPaint(hWnd, &ps);
  2633. rcMemBmp = pHTBlt->rcMemBmp;
  2634. if (BmpFlags & HT_BMP_SCALE) {
  2635. INT SaveID = SaveDC(hDC);
  2636. ExcludeClipRect(hDC,
  2637. rcMemBmp.left,
  2638. rcMemBmp.top,
  2639. rcMemBmp.right,
  2640. rcMemBmp.bottom);
  2641. FillRect(hDC, &Rect, GetStockObject(HTCLRADJ_BK_BRUSH));
  2642. RestoreDC(hDC, SaveID);
  2643. }
  2644. #if 0
  2645. hCurPal = (BmpFlags & HT_BMP_HALFTONE) ? pHTClrAdjParam->hHTPal :
  2646. pHTBlt->hBmpPal;
  2647. #else
  2648. hCurPal = pHTClrAdjParam->hHTPal;
  2649. #endif
  2650. if (hCurPal) {
  2651. hPalDlg = SelectPalette(pHTClrAdjParam->hDCDlg, hCurPal, FALSE);
  2652. RealizePalette(pHTClrAdjParam->hDCDlg);
  2653. hPalMem = SelectPalette(pHTBlt->hDCMem, hCurPal, FALSE);
  2654. RealizePalette(pHTBlt->hDCMem);
  2655. hPalDC = SelectPalette(hDC, hCurPal, FALSE);
  2656. RealizePalette(hDC);
  2657. }
  2658. #if SCREEN_BLT
  2659. pHTClrAdjParam->BmpNeedUpdate = 1;
  2660. #endif
  2661. if (pHTClrAdjParam->BmpNeedUpdate) {
  2662. HCURSOR hCursorOld;
  2663. HANDLE hDIB;
  2664. LPBITMAPINFOHEADER pbih;
  2665. DWORD Rop;
  2666. LONG Tmp;
  2667. INT StretchMode;
  2668. hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
  2669. Rect.left =
  2670. Rect.top = 0;
  2671. Rect.right = rcMemBmp.right - rcMemBmp.left;
  2672. Rect.bottom = rcMemBmp.bottom - rcMemBmp.top;
  2673. #if SCREEN_BLT
  2674. Rect = rcMemBmp;
  2675. hDCMem = hDC;
  2676. #endif
  2677. //
  2678. // 03-Feb-1999 Wed 01:30:03 updated -by- Daniel Chou (danielc)
  2679. // Fix Flip X, Y that we need to make right inclusive and left
  2680. // exclusive
  2681. //
  2682. if (BmpFlags & HT_BMP_MIRROR) {
  2683. XCHG(Rect.left, Rect.right, Tmp);
  2684. --Rect.left;
  2685. --Rect.right;
  2686. }
  2687. if (BmpFlags & HT_BMP_UPSIDEDOWN) {
  2688. XCHG(Rect.top, Rect.bottom, Tmp);
  2689. --Rect.top;
  2690. --Rect.bottom;
  2691. }
  2692. //
  2693. // Check out the fill mode, default by using sources
  2694. //
  2695. Rop = SRCCOPY;
  2696. hDIB = pHTClrAdjParam->hCurDIB;
  2697. pbih = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  2698. if (BmpFlags & HT_BMP_PALETTE) {
  2699. if (pbih->biBitCount >= 16) {
  2700. GlobalUnlock(hDIB);
  2701. hDIB = MakeTestDIB(TDI_RGBTEST);
  2702. pbih = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  2703. } else {
  2704. HANDLE hPalDIB;
  2705. LPBITMAPINFOHEADER pbihPal;
  2706. LPBYTE pBits;
  2707. UINT cx;
  2708. UINT cy;
  2709. UINT SizeI;
  2710. UINT xLoop;
  2711. DWORD Colors;
  2712. BYTE Data;
  2713. Colors = pbih->biClrUsed;
  2714. hPalDIB = MakeTestDIB(TDI_CLRPAL);
  2715. pbihPal = GlobalLock(hPalDIB);
  2716. if (!pbihPal) {
  2717. goto CleanupWM_PAINT;
  2718. }
  2719. if (!pbihPal->biClrUsed) {
  2720. if (Colors <= 16) {
  2721. cx =
  2722. cy = 4;
  2723. SizeI = 16;
  2724. } else {
  2725. cx =
  2726. cy = 16;
  2727. SizeI = 256;
  2728. }
  2729. pbihPal->biWidth = (LONG)cx;
  2730. pbihPal->biHeight = (LONG)cy;
  2731. pbihPal->biSizeImage = (DWORD)SizeI;
  2732. pbihPal->biClrUsed =
  2733. pbihPal->biClrImportant = Colors;
  2734. CopyMemory((LPBYTE)pbihPal+sizeof(BITMAPINFOHEADER),
  2735. (LPBYTE)pbih + sizeof(BITMAPINFOHEADER),
  2736. Colors *= sizeof(RGBQUAD));
  2737. Data = 0;
  2738. pBits = (LPBYTE)pbihPal +
  2739. sizeof(BITMAPINFOHEADER) +
  2740. Colors + (DWORD)SizeI - (DWORD)cx;
  2741. SizeI = cx + cx;
  2742. while (cy--) {
  2743. xLoop = cx;
  2744. while (xLoop--) {
  2745. *pBits++ = Data++;
  2746. }
  2747. pBits -= SizeI;
  2748. }
  2749. }
  2750. GlobalUnlock(hDIB);
  2751. hDIB = hPalDIB;
  2752. pbih = pbihPal;
  2753. }
  2754. }
  2755. #if 0
  2756. if (BmpFlags & HT_BMP_HALFTONE) {
  2757. StretchMode = HALFTONE;
  2758. } else {
  2759. StretchMode = COLORONCOLOR;
  2760. if (pHTClrAdjParam->CurHTClrAdj.caFlags & CLRADJF_NEGATIVE) {
  2761. //
  2762. // It just cannot do negative, and we will just use this
  2763. //
  2764. Rop = NOTSRCCOPY;
  2765. }
  2766. }
  2767. SetStretchBltMode(hDCMem, StretchMode);
  2768. #else
  2769. SetStretchBltMode(hDCMem, StretchMode = HALFTONE);
  2770. #endif
  2771. //
  2772. // If adjust for monochrome device then make it so tempopary.
  2773. //
  2774. if (pHTClrAdjParam->Flags & HTCAPF_SHOW_MONO) {
  2775. Colorfulness = pHTClrAdjParam->CurHTClrAdj.caColorfulness;
  2776. RedGreenTint = pHTClrAdjParam->CurHTClrAdj.caRedGreenTint;
  2777. pHTClrAdjParam->CurHTClrAdj.caColorfulness = COLOR_ADJ_MIN;
  2778. pHTClrAdjParam->CurHTClrAdj.caRedGreenTint = 0;
  2779. SetColorAdjustment(hDCMem, &(pHTClrAdjParam->CurHTClrAdj));
  2780. pHTClrAdjParam->CurHTClrAdj.caColorfulness = Colorfulness;
  2781. pHTClrAdjParam->CurHTClrAdj.caRedGreenTint = RedGreenTint;
  2782. } else {
  2783. SetColorAdjustment(hDCMem, &(pHTClrAdjParam->CurHTClrAdj));
  2784. }
  2785. #ifdef HTUIX_STATIC_HALFTONE
  2786. if (StretchMode == HALFTONE) {
  2787. HTUI_StretchDIBits(hDCMem,
  2788. Rect.left,
  2789. Rect.top,
  2790. Rect.right - Rect.left,
  2791. Rect.bottom - Rect.top,
  2792. 0,
  2793. 0,
  2794. pbih->biWidth,
  2795. pbih->biHeight,
  2796. (LPBYTE)pbih + PBIH_HDR_SIZE(pbih),
  2797. (LPBITMAPINFO)pbih,
  2798. DIB_RGB_COLORS,
  2799. Rop);
  2800. } else {
  2801. StretchDIBits(hDCMem,
  2802. Rect.left,
  2803. Rect.top,
  2804. Rect.right - Rect.left,
  2805. Rect.bottom - Rect.top,
  2806. 0,
  2807. 0,
  2808. pbih->biWidth,
  2809. pbih->biHeight,
  2810. (LPBYTE)pbih + PBIH_HDR_SIZE(pbih),
  2811. (LPBITMAPINFO)pbih,
  2812. DIB_RGB_COLORS,
  2813. Rop);
  2814. }
  2815. #else
  2816. #if 0
  2817. if (!SetBrushOrgEx(hDCMem, MyXOrg, MyYOrg, NULL)) {
  2818. DbgPrint("\nSetBrushOrgEx(%d, %d) failed", MyXOrg, MyYOrg);
  2819. }
  2820. #endif
  2821. StretchDIBits(hDCMem,
  2822. Rect.left,
  2823. Rect.top,
  2824. Rect.right - Rect.left,
  2825. Rect.bottom - Rect.top,
  2826. 0,
  2827. 0,
  2828. pbih->biWidth,
  2829. pbih->biHeight,
  2830. (LPBYTE)pbih + PBIH_HDR_SIZE(pbih),
  2831. (LPBITMAPINFO)pbih,
  2832. DIB_RGB_COLORS,
  2833. Rop);
  2834. // DbgPrint("\nStretchDIBits()=%ld", GetLastError());
  2835. #endif
  2836. pHTClrAdjParam->BmpNeedUpdate = 0;
  2837. GlobalUnlock(hDIB);
  2838. SetCursor(hCursorOld);
  2839. }
  2840. //
  2841. // Now blt the result to the screen
  2842. //
  2843. #if (SCREEN_BLT == 0)
  2844. SetStretchBltMode(hDC, COLORONCOLOR);
  2845. BitBlt(hDC,
  2846. rcMemBmp.left,
  2847. rcMemBmp.top,
  2848. rcMemBmp.right - rcMemBmp.left,
  2849. rcMemBmp.bottom - rcMemBmp.top,
  2850. hDCMem,
  2851. 0,
  2852. 0,
  2853. SRCCOPY);
  2854. #endif
  2855. CleanupWM_PAINT:
  2856. if (hCurPal) {
  2857. SelectPalette(pHTClrAdjParam->hDCDlg, hPalDlg, FALSE);
  2858. SelectPalette(pHTBlt->hDCMem, hPalMem, FALSE);
  2859. SelectPalette(hDC, hPalDC, FALSE);
  2860. }
  2861. EndPaint(hWnd, &ps);
  2862. return(0);
  2863. case WM_ERASEBKGND:
  2864. return(1);
  2865. default:
  2866. return(DefWindowProc(hWnd, Msg, wParam, lParam));
  2867. }
  2868. SetActiveWindow(hDlg);
  2869. return(0);
  2870. }
  2871. BOOL
  2872. SaveHalftonedDIB(
  2873. HWND hDlg,
  2874. PHTCLRADJPARAM pHTClrAdjParam
  2875. )
  2876. /*++
  2877. Routine Description:
  2878. This function will pop up the file selection dialog box and let user to
  2879. select a test bitmap (ie. either a DIB or GIF), then create the memory
  2880. DIB based on the opened bitmap file.
  2881. Arguments:
  2882. pHTClrAdjParam - Pointer to the HTCLRADJPARAM
  2883. Return Value:
  2884. BOOLEAN indicate if the DIB was created, if created the new DIB handle will
  2885. be set in the pHTClrAdjParam->hCurDIB, otherwise nothing is modified.
  2886. Author:
  2887. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  2888. Revision History:
  2889. --*/
  2890. {
  2891. PHTBLT pHTBlt;
  2892. HANDLE hDIB;
  2893. HANDLE hFile;
  2894. HCURSOR hCursorOld;
  2895. BITMAPFILEHEADER bfh;
  2896. WCHAR Title[80];
  2897. WCHAR Buf[160];
  2898. OPENFILENAME ofn;
  2899. DWORD cbWritten;
  2900. BOOL Ok = FALSE;
  2901. LoadString(hHTUIModule, IDS_SAVE_AS_DLGTITLE, Title, COUNT_ARRAY(Title));
  2902. Buf[0] = L'\0';
  2903. ofn.lStructSize = sizeof(OPENFILENAME);
  2904. ofn.hwndOwner = hDlg;
  2905. ofn.hInstance = hHTUIModule;
  2906. ofn.lpstrFilter = FileSaveExtFilter;
  2907. ofn.lpstrCustomFilter = NULL;
  2908. ofn.nMaxCustFilter = 0;
  2909. ofn.nFilterIndex = 1;
  2910. ofn.lpstrFile = Buf;
  2911. ofn.nMaxFile = COUNT_ARRAY(Buf);
  2912. ofn.lpstrFileTitle = NULL;
  2913. ofn.lpstrInitialDir = NULL;
  2914. ofn.lpstrTitle = Title,
  2915. ofn.Flags = OFN_CREATEPROMPT |
  2916. OFN_OVERWRITEPROMPT |
  2917. OFN_HIDEREADONLY;
  2918. ofn.nFileOffset = 0;
  2919. ofn.nFileExtension = 0;
  2920. ofn.lpstrDefExt = BmpExt;
  2921. ofn.lCustData = 0;
  2922. ofn.lpfnHook = NULL;
  2923. ofn.lpTemplateName = NULL;
  2924. EnableWindow(pHTClrAdjParam->hWndBmp, FALSE);
  2925. if (GetSaveFileName(&ofn)) {
  2926. hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
  2927. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  2928. if ((hDIB = BMPToDIB(pHTClrAdjParam->hHTPal, pHTBlt->hMemBmp)) &&
  2929. ((hFile = CreateFile(Buf,
  2930. GENERIC_WRITE,
  2931. 0,
  2932. NULL,
  2933. CREATE_ALWAYS,
  2934. FILE_FLAG_WRITE_THROUGH,
  2935. NULL)) != INVALID_HANDLE_VALUE)) {
  2936. LPBITMAPINFOHEADER pbih;
  2937. DWORD HeaderSize;
  2938. pbih = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  2939. HeaderSize = PBIH_HDR_SIZE(pbih);
  2940. bfh.bfType = (WORD)BFT_BITMAP;
  2941. bfh.bfOffBits = (DWORD)sizeof(bfh) + HeaderSize;
  2942. bfh.bfSize = bfh.bfOffBits + pbih->biSizeImage;
  2943. bfh.bfReserved1 =
  2944. bfh.bfReserved2 = (WORD)0;
  2945. WriteFile(hFile,
  2946. &bfh,
  2947. sizeof(bfh),
  2948. &cbWritten,
  2949. NULL);
  2950. WriteFile(hFile,
  2951. pbih,
  2952. pbih->biSizeImage + HeaderSize,
  2953. &cbWritten,
  2954. NULL);
  2955. CloseHandle(hFile);
  2956. GlobalUnlock(hDIB);
  2957. Ok = TRUE;
  2958. }
  2959. if (hDIB) {
  2960. hDIB = GlobalFree(hDIB);
  2961. HTUI_ASSERT("GlobalFree(hSaveDIB)", hDIB == NULL);
  2962. }
  2963. SetCursor(hCursorOld);
  2964. }
  2965. EnableWindow(pHTClrAdjParam->hWndBmp, TRUE);
  2966. return(Ok);
  2967. }
  2968. BOOL
  2969. CreateBmpWindow(
  2970. PHTCLRADJPARAM pHTClrAdjParam
  2971. )
  2972. {
  2973. HWND hDlg;
  2974. HWND hWndBmp;
  2975. WNDCLASS WndClass;
  2976. DWORD WndStyle;
  2977. RECT rcBmp;
  2978. if (pHTClrAdjParam->hWndBmp) {
  2979. return(TRUE);
  2980. }
  2981. //
  2982. // Firstable creat the class if one does not exist
  2983. //
  2984. pHTClrAdjParam->BmpNeedUpdate = 1;
  2985. //
  2986. // If we do not have permission then we will not allowed the user to
  2987. // adjust the size of the viewing bitmap or moving the bitmap window
  2988. //
  2989. if (pHTClrAdjParam->Flags & HTCAPF_CAN_UPDATE) {
  2990. WndClass.lpszClassName = L"HTClrAdjBmp";
  2991. WndStyle = WS_POPUP |
  2992. WS_BORDER |
  2993. WS_CLIPSIBLINGS |
  2994. WS_THICKFRAME;
  2995. WndClass.style = CS_DBLCLKS |
  2996. CS_NOCLOSE |
  2997. CS_HREDRAW |
  2998. CS_VREDRAW;
  2999. WndClass.hCursor = LoadCursor(NULL, IDC_SIZEALL);
  3000. } else {
  3001. WndClass.lpszClassName = L"HTClrNoAdjBmp";
  3002. WndStyle = WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS;
  3003. WndClass.style = CS_NOCLOSE | CS_HREDRAW | CS_VREDRAW;
  3004. WndClass.hCursor = LoadCursor(NULL, IDC_NO);
  3005. }
  3006. WndClass.lpfnWndProc = HTClrAdjBmpWndProc;
  3007. WndClass.cbClsExtra = 0;
  3008. WndClass.cbWndExtra = 0;
  3009. WndClass.hInstance = hHTUIModule;
  3010. WndClass.hIcon = NULL;
  3011. WndClass.hbrBackground = NULL;
  3012. WndClass.lpszMenuName = NULL;
  3013. RegisterClass(&WndClass);
  3014. hDlg = pHTClrAdjParam->hDlg;
  3015. rcBmp = pHTClrAdjParam->rcBmp;
  3016. if (hWndBmp = CreateWindow(WndClass.lpszClassName,
  3017. L"",
  3018. WndStyle,
  3019. rcBmp.left,
  3020. rcBmp.top,
  3021. rcBmp.right - rcBmp.left,
  3022. rcBmp.bottom - rcBmp.top,
  3023. GetParent(hDlg),
  3024. (HMENU)NULL,
  3025. hHTUIModule,
  3026. NULL)) {
  3027. SetWindowLongPtr(pHTClrAdjParam->hWndBmp = hWndBmp,
  3028. GWLP_USERDATA,
  3029. (LONG_PTR)pHTClrAdjParam);
  3030. pHTClrAdjParam->BmpFlags |= HT_BMP_ENABLE;
  3031. ShowWindow(pHTClrAdjParam->hWndBmp, SW_SHOWNOACTIVATE);
  3032. if (pHTClrAdjParam->BmpFlags & HT_BMP_ZOOM) {
  3033. pHTClrAdjParam->BmpFlags &= (WORD)~HT_BMP_ZOOM;
  3034. PostMessage(hWndBmp, WM_LBUTTONDBLCLK, 0, 0);
  3035. }
  3036. }
  3037. return((hWndBmp) ? TRUE : FALSE);
  3038. }
  3039. BOOL
  3040. CALLBACK
  3041. DisableDlgUpdate(
  3042. HWND hWnd,
  3043. LPARAM lParam
  3044. )
  3045. {
  3046. UINT DlgID;
  3047. UNREFERENCED_PARAMETER(lParam);
  3048. DlgID = (UINT)GetDlgCtrlID(hWnd);
  3049. EnableWindow(hWnd, (DlgID == IDOK) || (DlgID == IDCANCEL));
  3050. return(TRUE);
  3051. }
  3052. VOID
  3053. EnableDlgGroup(
  3054. HWND hDlg,
  3055. LPWORD pwGroup,
  3056. BOOL Enabled
  3057. )
  3058. {
  3059. WORD DlgID;
  3060. while (DlgID = *pwGroup++) {
  3061. EnableWindow(GetDlgItem(hDlg, DlgID), Enabled);
  3062. }
  3063. }
  3064. #if DBG
  3065. UINT DbgShowPal = 0x00;
  3066. INT
  3067. __cdecl
  3068. PalCompare(
  3069. const void *pA,
  3070. const void *pB
  3071. )
  3072. {
  3073. return((INT)((*(PLONG)pA & 0xFFFFFF) - (*(PLONG)pB & 0xFFFFFF)));
  3074. }
  3075. VOID
  3076. ShowDCPal(
  3077. PHTCLRADJPARAM pHTClrAdjParam,
  3078. HPALETTE hPal
  3079. )
  3080. /*++
  3081. Routine Description:
  3082. Arguments:
  3083. Return Value:
  3084. Author:
  3085. 02-Feb-1999 Tue 21:08:25 created -by- Daniel Chou (danielc)
  3086. Revision History:
  3087. --*/
  3088. {
  3089. BOOL HasPal = (hPal != (HPALETTE)0);
  3090. if (DbgShowPal & 0x01) {
  3091. UINT i;
  3092. UINT j;
  3093. UINT k;
  3094. BYTE bInv;
  3095. PALETTEENTRY Pal[256];
  3096. PALETTEENTRY Dif;
  3097. if (!HasPal) {
  3098. hPal = SelectPalette(pHTClrAdjParam->hDCDlg,
  3099. pHTClrAdjParam->hHTPal, FALSE);
  3100. }
  3101. GetPaletteEntries(hPal, 0, 256, Pal);
  3102. for (i = 0; i < 256; i++) {
  3103. Pal[i].peFlags = (BYTE)i;
  3104. }
  3105. if (DbgShowPal & 0x80) {
  3106. qsort((LPVOID)Pal, 256, sizeof(PALETTEENTRY), PalCompare);
  3107. }
  3108. for (i = 0; i < 256; i++) {
  3109. bInv = 255 - Pal[i].peFlags;
  3110. j = 0;
  3111. while ((j < 256) && (Pal[j].peFlags != bInv)) {
  3112. ++j;
  3113. }
  3114. Dif.peRed = 0xFF - Pal[i].peRed - Pal[j].peRed;
  3115. Dif.peGreen = 0xFF - Pal[i].peGreen - Pal[j].peGreen;
  3116. Dif.peBlue = 0xFF - Pal[i].peBlue - Pal[j].peBlue;
  3117. k = j;
  3118. if ((Dif.peRed) || (Dif.peGreen) || (Dif.peBlue)) {
  3119. k = 0;
  3120. while (k < 256) {
  3121. if (((Pal[k].peRed + Pal[i].peRed) == 0xFF) &&
  3122. ((Pal[k].peGreen + Pal[i].peGreen) == 0xFF) &&
  3123. ((Pal[k].peBlue + Pal[i].peBlue) == 0xFF)) {
  3124. break;
  3125. } else {
  3126. ++k;
  3127. }
  3128. }
  3129. }
  3130. if (k > 255) {
  3131. k = 0;
  3132. }
  3133. DbgPrint("\nPal(%3ld/%02lx)=%3ld:%3ld:%3ld, Inv(%3ld/%02lx)=%3ld:%3ld:%3ld, Real(%3ld/%02lx)=%3ld:%3ld:%3ld [%hs], Dif=%02lx:%02lx:%02lx",
  3134. i, i, Pal[i].peRed, Pal[i].peGreen, Pal[i].peBlue,
  3135. j, j, Pal[j].peRed, Pal[j].peGreen, Pal[j].peBlue,
  3136. k, k, Pal[k].peRed, Pal[k].peGreen, Pal[k].peBlue,
  3137. (k == j) ? "-----" : "Error",
  3138. Dif.peRed, Dif.peGreen, Dif.peBlue);
  3139. }
  3140. if (!HasPal) {
  3141. SelectPalette(pHTClrAdjParam->hDCDlg, hPal, FALSE);
  3142. }
  3143. }
  3144. }
  3145. #endif
  3146. LONG
  3147. InitHTClrAdjDlg(
  3148. HWND hDlg,
  3149. PHTCLRADJPARAM pHTClrAdjParam
  3150. )
  3151. /*++
  3152. Routine Description:
  3153. This function will intialized the pop up halftone color adjustment dialog
  3154. box, it also tempopary create a display device halftone info for halftone
  3155. incoming DIB, it will also allocate the memory for necessary halftoned
  3156. result to be displayed.
  3157. Arguments:
  3158. hDlg - The handle to the owner dialog box
  3159. pHTClrAdjParam - Pointer to the HTCLRADJPARAM
  3160. Return Value:
  3161. VOID
  3162. Author:
  3163. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  3164. Revision History:
  3165. --*/
  3166. {
  3167. HWND hWndCur;
  3168. LPWSTR pName;
  3169. WORD BmpFlags;
  3170. BYTE ViewSrc;
  3171. BYTE ViewIdx;
  3172. WCHAR Buf[128];
  3173. UINT ViewID;
  3174. UINT Loop;
  3175. UINT Idx;
  3176. //
  3177. // Initialize the color table dib to be used later
  3178. //
  3179. LoadHTCLRADJPARAMToWININI(hDlg, pHTClrAdjParam);
  3180. BmpFlags = pHTClrAdjParam->BmpFlags;
  3181. pHTClrAdjParam->ViewMode =
  3182. ViewSrc =
  3183. ViewIdx = 0xff;
  3184. //
  3185. // Get the string from static control and put it into combo boxes
  3186. //
  3187. Loop = IDS_ILLUMINANT;
  3188. while (LoadString(hHTUIModule, Loop++, Buf, COUNT_ARRAY(Buf))) {
  3189. SendDlgItemMessage(hDlg,
  3190. IDD_HT_ILLUMINANT_COMBO,
  3191. CB_ADDSTRING,
  3192. (WPARAM)NULL,
  3193. (LPARAM)Buf);
  3194. }
  3195. Buf[0] = VSRC_LB_ID_START;
  3196. Buf[1] = VSRC_LB_ID_SEPARATOR;
  3197. Buf[2] = L' ';
  3198. Buf[3] = L'\0';
  3199. //
  3200. // Starting by the default DIB passed from the caller
  3201. //
  3202. if (pHTClrAdjParam->hDefDIB) {
  3203. if (pName = pHTClrAdjParam->pDefDIBTitle) {
  3204. pName += GetSaveDefDIBFileName(NULL, pName, 0);
  3205. wcscpy(&Buf[3], pName);
  3206. } else {
  3207. LoadString(hHTUIModule,IDS_DEFAULT_DIB,&Buf[3],COUNT_ARRAY(Buf)-3);
  3208. }
  3209. Idx = (UINT)SendDlgItemMessage(hDlg,
  3210. IDD_HT_SHOW_COMBO,
  3211. CB_ADDSTRING,
  3212. (WPARAM)NULL,
  3213. (LPARAM)Buf);
  3214. SendDlgItemMessage(hDlg,
  3215. IDD_HT_SHOW_COMBO,
  3216. CB_SETITEMDATA,
  3217. (WPARAM)Idx,
  3218. (LPARAM)VSRC_PIC_DEF_DIB);
  3219. ++Buf[0]; // Increment by 1 from 'A' to 'B'
  3220. ViewSrc = (BYTE)VSRC_PIC_DEF_DIB;
  3221. ViewIdx = (BYTE)Idx;
  3222. }
  3223. //
  3224. // Secondary Add the last time saved bitmap file name
  3225. //
  3226. Idx = GetSaveDefDIBFileName(hDlg, &Buf[3], COUNT_ARRAY(Buf) - 3);
  3227. if (Buf[3]) {
  3228. wcscpy(&Buf[3], &Buf[Idx + 3]);
  3229. Idx = (UINT)SendDlgItemMessage(hDlg,
  3230. IDD_HT_SHOW_COMBO,
  3231. CB_ADDSTRING,
  3232. (WPARAM)NULL,
  3233. (LPARAM)Buf);
  3234. SendDlgItemMessage(hDlg,
  3235. IDD_HT_SHOW_COMBO,
  3236. CB_SETITEMDATA,
  3237. (WPARAM)Idx,
  3238. (LPARAM)VSRC_PIC_LOADED);
  3239. if (ViewSrc == 0xff) {
  3240. ViewSrc = VSRC_PIC_LOADED;
  3241. ViewIdx = (BYTE)Idx;
  3242. }
  3243. }
  3244. Loop = IDS_TEST_MODE_START;
  3245. ViewID = VSRC_TEST_START;
  3246. while (Loop <= IDS_TEST_MODE_END) {
  3247. LoadString(hHTUIModule, Loop, Buf, COUNT_ARRAY(Buf));
  3248. Idx = (UINT)SendDlgItemMessage(hDlg,
  3249. IDD_HT_SHOW_COMBO,
  3250. CB_ADDSTRING,
  3251. (WPARAM)NULL,
  3252. (LPARAM)Buf);
  3253. SendDlgItemMessage(hDlg,
  3254. IDD_HT_SHOW_COMBO,
  3255. CB_SETITEMDATA,
  3256. (WPARAM)Idx,
  3257. (LPARAM)ViewID);
  3258. if ((ViewSrc == 0xff) &&
  3259. (ViewID == DEFAULT_VSRC)) {
  3260. ViewSrc = (BYTE)ViewID;
  3261. ViewIdx = (BYTE)Idx;
  3262. }
  3263. ++ViewID;
  3264. ++Loop;
  3265. }
  3266. SendDlgItemMessage(hDlg, IDD_HT_ILLUMINANT_COMBO, CB_SETEXTENDEDUI,
  3267. (WPARAM)TRUE, (LPARAM)NULL);
  3268. SendDlgItemMessage(hDlg, IDD_HT_SHOW_COMBO, CB_SETEXTENDEDUI,
  3269. (WPARAM)TRUE, (LPARAM)NULL);
  3270. for (Loop = 0; Loop < TOTAL_HTCLRADJ_SCROLL; Loop++) {
  3271. SetScrollRange(GetDlgItem(hDlg, IDD_HT_FIRST_SCROLL + Loop),
  3272. SB_CTL,
  3273. 0,
  3274. HTClrAdjScroll[Loop].Max - HTClrAdjScroll[Loop].Min,
  3275. FALSE);
  3276. }
  3277. if (!(CREATE_PHTBLT(pHTClrAdjParam))) {
  3278. return(-2);
  3279. }
  3280. #ifdef HTUIX_STATIC_HALFTONE
  3281. pHTClrAdjParam->hHTPal = HTUI_CreateHalftonePalette(pHTClrAdjParam);
  3282. #else
  3283. pHTClrAdjParam->hHTPal = CreateHalftonePalette(pHTClrAdjParam->hDCDlg);
  3284. #endif
  3285. #if DBG
  3286. ShowDCPal(pHTClrAdjParam, pHTClrAdjParam->hHTPal);
  3287. #endif
  3288. hWndUIDlg =
  3289. hWndUITop = hDlg;
  3290. while (hWndCur = GetWindow(hWndUITop, GW_OWNER)) {
  3291. hWndUITop = hWndCur;
  3292. }
  3293. if (hWndUITop == hDlg) {
  3294. hWndUITop = (HWND)NULL;
  3295. } else {
  3296. WndProcUITop = (WNDPROC)SetWindowLongPtr(hWndUITop,
  3297. GWLP_WNDPROC,
  3298. (LONG_PTR)TopWndHookProc);
  3299. }
  3300. //***********************************************************************
  3301. // FOLLOWING must in that order
  3302. //***********************************************************************
  3303. //
  3304. // 2. Check various button from default/setting
  3305. //
  3306. CheckDlgButton(hDlg, IDD_HT_LOG_FILTER,
  3307. (pHTClrAdjParam->CurHTClrAdj.caFlags & CLRADJF_LOG_FILTER) ?
  3308. 1 : 0);
  3309. CheckDlgButton(hDlg,
  3310. IDD_HT_NEGATIVE,
  3311. (pHTClrAdjParam->CurHTClrAdj.caFlags & CLRADJF_NEGATIVE) ?
  3312. 1 : 0);
  3313. CheckDlgButton(hDlg,
  3314. IDD_HT_ASPECT_RATIO,
  3315. (UINT)((BmpFlags & HT_BMP_SCALE) ? 1 : 0));
  3316. CheckDlgButton(hDlg,
  3317. IDD_HT_PALETTE,
  3318. (UINT)((BmpFlags & HT_BMP_PALETTE) ? 1 : 0));
  3319. CheckDlgButton(hDlg,
  3320. IDD_HT_MIRROR,
  3321. (UINT)((BmpFlags & HT_BMP_MIRROR) ? 1 : 0));
  3322. CheckDlgButton(hDlg,
  3323. IDD_HT_UPSIDEDOWN,
  3324. (UINT)((BmpFlags & HT_BMP_UPSIDEDOWN) ? 1 : 0));
  3325. CheckDlgButton(hDlg,
  3326. IDD_HT_BMP_TEST,
  3327. (UINT)((BmpFlags & HT_BMP_ENABLE) ? 1 : 0));
  3328. CheckDlgButton(hDlg,
  3329. IDD_HT_ZOOM,
  3330. (UINT)((BmpFlags & HT_BMP_ZOOM) ? 1 : 0));
  3331. CheckDlgButton(hDlg,
  3332. IDD_HT_SYNC_R,
  3333. (UINT)((BmpFlags & HT_BMP_SYNC_R) ? 1 : 0));
  3334. CheckDlgButton(hDlg,
  3335. IDD_HT_SYNC_G,
  3336. (UINT)((BmpFlags & HT_BMP_SYNC_G) ? 1 : 0));
  3337. CheckDlgButton(hDlg,
  3338. IDD_HT_SYNC_B,
  3339. (UINT)((BmpFlags & HT_BMP_SYNC_B) ? 1 : 0));
  3340. if (BmpFlags & HT_BMP_SYNC_R) {
  3341. HTCLRADJSCROLL_R_GAMMA.Flags = HTCAS_SYNC_RGB;
  3342. } else {
  3343. HTCLRADJSCROLL_R_GAMMA.Flags = 0;
  3344. }
  3345. if (BmpFlags & HT_BMP_SYNC_G) {
  3346. HTCLRADJSCROLL_G_GAMMA.Flags = HTCAS_SYNC_RGB;
  3347. } else {
  3348. HTCLRADJSCROLL_G_GAMMA.Flags = 0;
  3349. }
  3350. if (BmpFlags & HT_BMP_SYNC_B) {
  3351. HTCLRADJSCROLL_B_GAMMA.Flags = HTCAS_SYNC_RGB;
  3352. } else {
  3353. HTCLRADJSCROLL_B_GAMMA.Flags = 0;
  3354. }
  3355. //
  3356. // If the caller (device driver/application) has default bitmap to
  3357. // be adjusted then display that one first, otherwise try to display
  3358. // the last loaded bitmap, else it will just display the reference
  3359. // colors, since we calling to load the last DIB so we will make the
  3360. // current selection as the other DIB.
  3361. //
  3362. ChangeViewSource(hDlg, pHTClrAdjParam, ViewSrc);
  3363. //
  3364. // 3. Now adjust the dialog box position from the win.ini or default,
  3365. // remember must in this order
  3366. //
  3367. SetWindowPos(hDlg, NULL,
  3368. pHTClrAdjParam->rcDlg.left,
  3369. pHTClrAdjParam->rcDlg.top,
  3370. 0, 0, SWP_NOSIZE | SWP_NOZORDER);
  3371. return(1);
  3372. }
  3373. BOOL
  3374. UpdateAppHTBitmap(
  3375. PHTCLRADJPARAM pHTClrAdjParam
  3376. )
  3377. /*++
  3378. Routine Description:
  3379. Arguments:
  3380. Return Value:
  3381. Author:
  3382. 01-Feb-1997 Sat 17:44:58 created -by- Daniel Chou (danielc)
  3383. Revision History:
  3384. --*/
  3385. {
  3386. HPALETTE hPal;
  3387. if (hPal = (HPALETTE)SendMessage(pHTClrAdjParam->hWndApp,
  3388. WM_HALFTONE_UI,
  3389. HTUI_MSG_GETPAL,
  3390. 0)) {
  3391. SelectPalette(pHTClrAdjParam->hDCDlg, hPal, FALSE);
  3392. RealizePalette(pHTClrAdjParam->hDCDlg);
  3393. #if DBG
  3394. ShowDCPal(pHTClrAdjParam, NULL);
  3395. #endif
  3396. PostMessage(pHTClrAdjParam->hWndApp,
  3397. WM_HALFTONE_UI,
  3398. (WPARAM)HTUI_MSG_CLRADJ_CHANGED,
  3399. (LPARAM)&(pHTClrAdjParam->CurHTClrAdj));
  3400. return(TRUE);
  3401. }
  3402. return(FALSE);
  3403. }
  3404. INT_PTR
  3405. CALLBACK
  3406. HTClrAdjDlgProc(
  3407. HWND hDlg,
  3408. UINT Msg,
  3409. WPARAM wParam,
  3410. LPARAM lParam
  3411. )
  3412. /*++
  3413. Routine Description:
  3414. This is the halftone color adjustments main DlgProc().
  3415. Arguments:
  3416. hDlg - The handle to the owner dialog box
  3417. Msg - message from window
  3418. wParam - First parameter
  3419. lParam - Second parameter.
  3420. Return Value:
  3421. a non-zero if process message, 0 otherwise.
  3422. This function assume is called from a DialogBoxParam() call, and expected
  3423. the WM_INITDIALOG message will have lParam equ to initialized
  3424. pHTClrAdjParam
  3425. Author:
  3426. 06-Dec-1993 Mon 20:58:58 updated -by- Daniel Chou (danielc)
  3427. Allowed F1=Help even permission flag is not set
  3428. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  3429. Revision History:
  3430. --*/
  3431. {
  3432. HWND hWndBmp;
  3433. HWND hCtrl;
  3434. LPWSTR pwBuf;
  3435. LPBYTE pCurScroll;
  3436. PHTBLT pHTBlt;
  3437. PHTCLRADJPARAM pHTClrAdjParam;
  3438. COLORADJUSTMENT CurHTClrAdj;
  3439. HTCLRADJSCROLL ScrollControl;
  3440. RECT Rect;
  3441. LONG ScrollOld;
  3442. LONG ScrollCur;
  3443. LONG Result;
  3444. INT i;
  3445. UINT IDScroll;
  3446. UINT IDScrollEnd;
  3447. UINT ScrollIndex;
  3448. WORD DoComboBox = 0;
  3449. WORD DlgID;
  3450. WORD Mask;
  3451. BOOL Changed = FALSE;
  3452. BOOL Enabled;
  3453. WCHAR Buf[16];
  3454. if (Msg == WM_INITDIALOG) {
  3455. pHTClrAdjParam = (PHTCLRADJPARAM)lParam;
  3456. SetWindowLongPtr(pHTClrAdjParam->hDlg = hDlg, GWLP_USERDATA, lParam);
  3457. pHTClrAdjParam->hDCDlg = GetWindowDC(hDlg);
  3458. if ((pHTClrAdjParam->pCallerHTClrAdj) &&
  3459. (pHTClrAdjParam->pCallerHTClrAdj->caSize ==
  3460. sizeof(COLORADJUSTMENT)) &&
  3461. (!(pHTClrAdjParam->pCallerHTClrAdj->caFlags &
  3462. (~CLRADJF_FLAGS_MASK)))) {
  3463. pHTClrAdjParam->CurHTClrAdj = *(pHTClrAdjParam->pCallerHTClrAdj);
  3464. } else {
  3465. pHTClrAdjParam->Flags |= HTCAPF_FORCE_OK;
  3466. pHTClrAdjParam->CurHTClrAdj = DefaultCA;
  3467. }
  3468. //
  3469. // Setup halftone UI extended help style
  3470. //
  3471. pHTClrAdjParam->CallerHTClrAdj = pHTClrAdjParam->CurHTClrAdj;
  3472. SetWindowLong(hDlg,
  3473. GWL_EXSTYLE,
  3474. GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
  3475. } else if (!(pHTClrAdjParam =
  3476. (PHTCLRADJPARAM)GetWindowLongPtr(hDlg, GWLP_USERDATA))) {
  3477. return(FALSE);
  3478. }
  3479. IDScroll = 1;
  3480. IDScrollEnd = 0;
  3481. CurHTClrAdj = pHTClrAdjParam->CurHTClrAdj;
  3482. hWndBmp = pHTClrAdjParam->hWndBmp;
  3483. pHTBlt = GET_PHTBLT(pHTClrAdjParam);
  3484. switch(Msg) {
  3485. case WM_INITDIALOG: // set the previouse one equal to current setting
  3486. CurHTClrAdj.caSize = sizeof(COLORADJUSTMENT);
  3487. CurHTClrAdj.caFlags &= CLRADJF_FLAGS_MASK;
  3488. if (CurHTClrAdj.caIlluminantIndex > ILLUMINANT_MAX_INDEX) {
  3489. CurHTClrAdj.caIlluminantIndex = DefaultCA.caIlluminantIndex;
  3490. }
  3491. ADJ_CA(CurHTClrAdj.caRedGamma, MIN_RGB_GAMMA, MAX_RGB_GAMMA);
  3492. ADJ_CA(CurHTClrAdj.caGreenGamma, MIN_RGB_GAMMA, MAX_RGB_GAMMA);
  3493. ADJ_CA(CurHTClrAdj.caBlueGamma, MIN_RGB_GAMMA, MAX_RGB_GAMMA);
  3494. ADJ_CA(CurHTClrAdj.caReferenceBlack, 0, REFERENCE_BLACK_MAX);
  3495. ADJ_CA(CurHTClrAdj.caReferenceWhite, REFERENCE_WHITE_MIN, 10000);
  3496. ADJ_CA(CurHTClrAdj.caContrast, MIN_COLOR_ADJ, MAX_COLOR_ADJ);
  3497. ADJ_CA(CurHTClrAdj.caBrightness, MIN_COLOR_ADJ, MAX_COLOR_ADJ);
  3498. ADJ_CA(CurHTClrAdj.caColorfulness, MIN_COLOR_ADJ, MAX_COLOR_ADJ);
  3499. ADJ_CA(CurHTClrAdj.caRedGreenTint, MIN_COLOR_ADJ, MAX_COLOR_ADJ);
  3500. pHTClrAdjParam->CurHTClrAdj =
  3501. pHTClrAdjParam->LastHTClrAdj = CurHTClrAdj;
  3502. DoComboBox = 0x3;
  3503. IDScroll = (INT)IDD_HT_FIRST_SCROLL;
  3504. IDScrollEnd = (INT)IDD_HT_LAST_SCROLL;
  3505. if ((Result = InitHTClrAdjDlg(hDlg, pHTClrAdjParam)) < 0) {
  3506. EndDialog(hDlg, Result);
  3507. return(TRUE);
  3508. }
  3509. if (pHTClrAdjParam->Flags & HTCAPF_SHOW_MONO) {
  3510. EnableDlgGroup(hDlg, IDDMonoGroup, FALSE);
  3511. }
  3512. if (CurHTClrAdj.caColorfulness == COLOR_ADJ_MIN) {
  3513. EnableDlgGroup(hDlg, &IDDMonoGroup[3], FALSE);
  3514. }
  3515. if (!IsDlgButtonChecked(hDlg, IDD_HT_BMP_TEST)) {
  3516. EnableDlgGroup(hDlg, IDDBmpTestGroup, FALSE);
  3517. }
  3518. Changed = TRUE;
  3519. break;
  3520. case WM_NCRBUTTONDOWN:
  3521. case WM_RBUTTONDOWN:
  3522. if (pHTClrAdjParam->BmpFlags & HT_BMP_ZOOM) {
  3523. pHTClrAdjParam->BmpFlags ^= HT_BMP_AT_TOP;
  3524. AdjustDlgZorder(pHTClrAdjParam);
  3525. if (hWndBmp) {
  3526. SendMessage(hWndBmp,
  3527. WM_COMMAND,
  3528. (WPARAM)IDD_HT_BRING_TO_TOP,
  3529. (LPARAM)NULL);
  3530. }
  3531. }
  3532. break;
  3533. case WM_SIZE:
  3534. case WM_MOVE:
  3535. Rect = pHTClrAdjParam->rcDlg;
  3536. GetWindowRect(hDlg, &(pHTClrAdjParam->rcDlg));
  3537. if (pHTClrAdjParam->BmpFlags & HT_BMP_AUTO_MOVE) {
  3538. RECT rcBmp = pHTClrAdjParam->rcBmp;
  3539. rcBmp.left += (Result = pHTClrAdjParam->rcDlg.left - Rect.left);
  3540. rcBmp.right += Result;
  3541. rcBmp.top += (Result = pHTClrAdjParam->rcDlg.top - Rect.top);
  3542. rcBmp.bottom += Result;
  3543. if ((hWndBmp) &&
  3544. (!(pHTClrAdjParam->BmpFlags & HT_BMP_ZOOM))) {
  3545. SetWindowPos(hWndBmp,
  3546. IS_BMP_AT_TOP(pHTClrAdjParam->BmpFlags) ? NULL :
  3547. hDlg,
  3548. rcBmp.left,
  3549. rcBmp.top,
  3550. rcBmp.right - rcBmp.left,
  3551. rcBmp.bottom - rcBmp.top,
  3552. SWP_DRAWFRAME | SWP_NOACTIVATE);
  3553. }
  3554. pHTClrAdjParam->rcBmp = rcBmp;
  3555. }
  3556. return(FALSE);
  3557. case WM_DESTROY:
  3558. if (hWndUITop) {
  3559. SetWindowLongPtr(hWndUITop, GWLP_WNDPROC, (LONG_PTR)WndProcUITop);
  3560. hWndUITop = NULL;
  3561. }
  3562. hWndUIDlg = NULL;
  3563. WndProcUITop = (WNDPROC)NULL;
  3564. if (pHTClrAdjParam->hWndBmp) {
  3565. DestroyWindow(pHTClrAdjParam->hWndBmp);
  3566. pHTClrAdjParam->hWndBmp = NULL;
  3567. }
  3568. if (pHTClrAdjParam->hDCDlg) {
  3569. ReleaseDC(hDlg, pHTClrAdjParam->hDCDlg);
  3570. pHTClrAdjParam->hDCDlg = NULL;
  3571. }
  3572. if (pHTBlt) {
  3573. if (pHTBlt->hDCMem) {
  3574. Result = (LONG)DeleteDC(pHTBlt->hDCMem);
  3575. HTUI_ASSERT("DeleteDC(hDCMem)", Result);
  3576. }
  3577. if (pHTBlt->hMemBmp) {
  3578. Result = (LONG)DeleteObject(pHTBlt->hMemBmp);
  3579. HTUI_ASSERT("DeleteObject(hMemBmp)", Result);
  3580. }
  3581. if (pHTBlt->hBmpPal) {
  3582. Result = (LONG)DeleteObject(pHTBlt->hBmpPal);
  3583. HTUI_ASSERT("DeleteObject(hBmpPal)", Result);
  3584. }
  3585. DELETE_PHTBLT(pHTClrAdjParam);
  3586. }
  3587. if (pHTClrAdjParam->hHTPal) {
  3588. Result = (LONG)DeleteObject(pHTClrAdjParam->hHTPal);
  3589. HTUI_ASSERT("DeleteObject(hHTPal)", Result);
  3590. pHTClrAdjParam->hHTPal = NULL;
  3591. }
  3592. if (pHTClrAdjParam->hSrcDIB) {
  3593. pHTClrAdjParam->hSrcDIB = GlobalFree(pHTClrAdjParam->hSrcDIB);
  3594. HTUI_ASSERT("GlobalFree(hSrcDIB)", pHTClrAdjParam->hSrcDIB == NULL);
  3595. }
  3596. for (ScrollIndex = 0; ScrollIndex <= TDI_MAX_INDEX; ScrollIndex++) {
  3597. if (TestDIBInfo[ScrollIndex].hDIB) {
  3598. TestDIBInfo[ScrollIndex].hDIB =
  3599. GlobalFree(TestDIBInfo[ScrollIndex].hDIB);
  3600. HTUI_ASSERT("GlobalFree(TestDIBInfo[].hDIB)",
  3601. TestDIBInfo[ScrollIndex].hDIB == NULL);
  3602. }
  3603. }
  3604. #ifdef HTUIX_STATIC_HALFTONE
  3605. if (HTUI_pDHI) {
  3606. HT_DestroyDeviceHalftoneInfo(HTUI_pDHI);
  3607. HTUI_pDHI = NULL;
  3608. }
  3609. if ((HTUI_hHTPal) && (HTUI_DIBInfo.bi.biBitCount == 8)) {
  3610. DeleteObject(HTUI_hHTPal);
  3611. HTUI_hHTPal = NULL;
  3612. }
  3613. if (HTUI_pHTBits) {
  3614. LocalFree((HLOCAL)HTUI_pHTBits);
  3615. HTUI_pHTBits = NULL;
  3616. }
  3617. #endif
  3618. return(TRUE);
  3619. case WM_SETFOCUS:
  3620. AdjustDlgZorder(pHTClrAdjParam);
  3621. return(0);
  3622. case WM_ACTIVATE:
  3623. if (LOWORD(wParam)) {
  3624. AdjustDlgZorder(pHTClrAdjParam);
  3625. SetFocus(hDlg);
  3626. wParam = (WPARAM)NULL;
  3627. } else {
  3628. return(0);
  3629. }
  3630. //
  3631. // Fall through
  3632. //
  3633. case WM_PALETTECHANGED:
  3634. if (wParam == (WPARAM)hDlg) {
  3635. break;
  3636. }
  3637. case WM_QUERYNEWPALETTE:
  3638. if ((hWndBmp) &&
  3639. (pHTClrAdjParam->BmpFlags & HT_BMP_ENABLE) &&
  3640. (pHTClrAdjParam->hDCDlg) &&
  3641. (pHTClrAdjParam->hHTPal)) {
  3642. SelectPalette(pHTClrAdjParam->hDCDlg,
  3643. pHTClrAdjParam->hHTPal,
  3644. FALSE);
  3645. if (i = RealizePalette(pHTClrAdjParam->hDCDlg)) {
  3646. InvalidateRect(hWndBmp, NULL, FALSE);
  3647. }
  3648. return(i);
  3649. }
  3650. break;
  3651. case WM_HELP:
  3652. wParam = (WPARAM)((LPHELPINFO)lParam)->hItemHandle;
  3653. lParam = (LPARAM)MAKELONG(((LPHELPINFO)lParam)->MousePos.x,
  3654. ((LPHELPINFO)lParam)->MousePos.y);
  3655. case WM_CONTEXTMENU:
  3656. DoHalftoneHelp(hDlg,
  3657. (HWND)wParam,
  3658. HELP_TYPE_HTCLRADJ,
  3659. (Msg == WM_HELP) ? HELP_WM_HELP : HELP_CONTEXTMENU,
  3660. (DWORD)lParam);
  3661. break;
  3662. case WM_COMMAND:
  3663. switch (DlgID = LOWORD(wParam)) {
  3664. case IDD_HT_BMP_TEST:
  3665. if (Changed = (BOOL)IsDlgButtonChecked(hDlg, IDD_HT_BMP_TEST)) {
  3666. if (!hWndBmp) {
  3667. if (!CreateBmpWindow(pHTClrAdjParam)) {
  3668. return(TRUE);
  3669. }
  3670. hWndBmp = pHTClrAdjParam->hWndBmp;
  3671. }
  3672. pHTClrAdjParam->BmpFlags |= HT_BMP_ENABLE;
  3673. } else {
  3674. pHTClrAdjParam->BmpFlags &= (WORD)~HT_BMP_ENABLE;
  3675. }
  3676. if (hWndBmp) {
  3677. ShowWindow(hWndBmp, (Changed) ? SW_SHOW : SW_HIDE);
  3678. EnableWindow(hWndBmp, Changed);
  3679. }
  3680. EnableDlgGroup(hDlg, IDDBmpTestGroup, (BOOL)Changed);
  3681. Changed = TRUE;
  3682. //
  3683. // FALL THROUH if we need to show the bitmap window
  3684. //
  3685. case IDD_HT_BRING_TO_TOP:
  3686. AdjustDlgZorder(pHTClrAdjParam);
  3687. break;
  3688. case IDD_HT_SAVE_AS:
  3689. SaveHalftonedDIB(hDlg, pHTClrAdjParam);
  3690. return(TRUE);
  3691. case IDD_HT_ZOOM:
  3692. if ((hWndBmp) && (pHTClrAdjParam->BmpFlags & HT_BMP_ENABLE)) {
  3693. SendMessage(hWndBmp, WM_LBUTTONDBLCLK, 0, 0);
  3694. }
  3695. return(TRUE);
  3696. case IDD_HT_LOG_FILTER:
  3697. if (IsDlgButtonChecked(hDlg, IDD_HT_LOG_FILTER)) {
  3698. CurHTClrAdj.caFlags |= CLRADJF_LOG_FILTER;
  3699. } else {
  3700. CurHTClrAdj.caFlags &= ~CLRADJF_LOG_FILTER;
  3701. }
  3702. break;
  3703. case IDD_HT_NEGATIVE:
  3704. if (IsDlgButtonChecked(hDlg, IDD_HT_NEGATIVE)) {
  3705. CurHTClrAdj.caFlags |= CLRADJF_NEGATIVE;
  3706. } else {
  3707. CurHTClrAdj.caFlags &= ~CLRADJF_NEGATIVE;
  3708. }
  3709. break;
  3710. case IDD_HT_SYNC_R:
  3711. if (IsDlgButtonChecked(hDlg, IDD_HT_SYNC_R)) {
  3712. pHTClrAdjParam->BmpFlags |= HT_BMP_SYNC_R;
  3713. HTCLRADJSCROLL_R_GAMMA.Flags |= HTCAS_SYNC_RGB;
  3714. } else {
  3715. pHTClrAdjParam->BmpFlags &= ~HT_BMP_SYNC_R;
  3716. HTCLRADJSCROLL_R_GAMMA.Flags &= ~HTCAS_SYNC_RGB;
  3717. }
  3718. return(TRUE);
  3719. case IDD_HT_SYNC_G:
  3720. if (IsDlgButtonChecked(hDlg, IDD_HT_SYNC_G)) {
  3721. pHTClrAdjParam->BmpFlags |= HT_BMP_SYNC_G;
  3722. HTCLRADJSCROLL_G_GAMMA.Flags |= HTCAS_SYNC_RGB;
  3723. } else {
  3724. pHTClrAdjParam->BmpFlags &= ~HT_BMP_SYNC_G;
  3725. HTCLRADJSCROLL_G_GAMMA.Flags &= ~HTCAS_SYNC_RGB;
  3726. }
  3727. return(TRUE);
  3728. case IDD_HT_SYNC_B:
  3729. if (IsDlgButtonChecked(hDlg, IDD_HT_SYNC_B)) {
  3730. pHTClrAdjParam->BmpFlags |= HT_BMP_SYNC_B;
  3731. HTCLRADJSCROLL_B_GAMMA.Flags |= HTCAS_SYNC_RGB;
  3732. } else {
  3733. pHTClrAdjParam->BmpFlags &= ~HT_BMP_SYNC_B;
  3734. HTCLRADJSCROLL_B_GAMMA.Flags &= ~HTCAS_SYNC_RGB;
  3735. }
  3736. return(TRUE);
  3737. case IDD_HT_ASPECT_RATIO:
  3738. case IDD_HT_PALETTE:
  3739. case IDD_HT_MIRROR:
  3740. case IDD_HT_UPSIDEDOWN:
  3741. case IDD_HT_COPY_USE_DIB:
  3742. switch(DlgID) {
  3743. case IDD_HT_ASPECT_RATIO:
  3744. Mask = HT_BMP_SCALE;
  3745. break;
  3746. case IDD_HT_PALETTE:
  3747. Mask = HT_BMP_PALETTE;
  3748. break;
  3749. case IDD_HT_UPSIDEDOWN:
  3750. Mask = HT_BMP_UPSIDEDOWN;
  3751. break;
  3752. case IDD_HT_MIRROR:
  3753. Mask = HT_BMP_MIRROR;
  3754. break;
  3755. }
  3756. if (Enabled = (BOOL)IsDlgButtonChecked(hDlg, DlgID)) {
  3757. pHTClrAdjParam->BmpFlags |= Mask;
  3758. } else {
  3759. pHTClrAdjParam->BmpFlags &= (WORD)~Mask;
  3760. }
  3761. if (DlgID == IDD_HT_ASPECT_RATIO) {
  3762. if (!ReSizeBmpWindow(pHTClrAdjParam)) {
  3763. return(TRUE);
  3764. }
  3765. }
  3766. Changed = TRUE;
  3767. break;
  3768. case IDD_HT_SHOW_COMBO:
  3769. if (HIWORD(wParam) == CBN_SELCHANGE) {
  3770. if (hWndBmp) {
  3771. InvalidateRect(hWndBmp, NULL, FALSE);
  3772. }
  3773. Mask = (WORD)SendDlgItemMessage(hDlg,
  3774. IDD_HT_SHOW_COMBO,
  3775. CB_GETCURSEL,
  3776. (WPARAM)NULL,
  3777. (LPARAM)NULL);
  3778. if (ChangeViewSource(hDlg,
  3779. pHTClrAdjParam,
  3780. (WORD)SendDlgItemMessage(hDlg,
  3781. IDD_HT_SHOW_COMBO,
  3782. CB_GETITEMDATA,
  3783. (WPARAM)Mask,
  3784. (LPARAM)NULL))) {
  3785. Changed = TRUE;
  3786. }
  3787. break;
  3788. }
  3789. return(TRUE);
  3790. case IDD_HT_OPEN:
  3791. if (GetNewDIBFromFile(pHTClrAdjParam, FALSE)) {
  3792. Changed = TRUE;
  3793. break;
  3794. }
  3795. return(TRUE);
  3796. case IDD_HT_LINEAR_GAMMA:
  3797. if (Enabled = (BOOL)IsDlgButtonChecked(hDlg, IDD_HT_LINEAR_GAMMA)) {
  3798. pHTClrAdjParam->RedGamma = CurHTClrAdj.caRedGamma;
  3799. pHTClrAdjParam->GreenGamma = CurHTClrAdj.caGreenGamma;
  3800. pHTClrAdjParam->BlueGamma = CurHTClrAdj.caBlueGamma;
  3801. CurHTClrAdj.caRedGamma =
  3802. CurHTClrAdj.caGreenGamma =
  3803. CurHTClrAdj.caBlueGamma = 10000;
  3804. } else {
  3805. CurHTClrAdj.caRedGamma = pHTClrAdjParam->RedGamma;
  3806. CurHTClrAdj.caGreenGamma = pHTClrAdjParam->GreenGamma;
  3807. CurHTClrAdj.caBlueGamma = pHTClrAdjParam->BlueGamma;
  3808. }
  3809. EnableDlgGroup(hDlg, IDDGammaGroup, !Enabled);
  3810. IDScroll = (INT)IDD_HT_R_GAMMA_SCROLL;
  3811. IDScrollEnd = (INT)IDD_HT_B_GAMMA_SCROLL;
  3812. Changed = TRUE;
  3813. break;
  3814. case IDD_HT_RESET: // Reset to original setting before this dialog
  3815. case IDD_HT_DEFAULT:
  3816. if (DlgID == IDD_HT_RESET) {
  3817. CurHTClrAdj = pHTClrAdjParam->LastHTClrAdj;
  3818. } else {
  3819. CurHTClrAdj = DefaultCA;
  3820. }
  3821. if (IsDlgButtonChecked(hDlg, IDD_HT_LINEAR_GAMMA)) {
  3822. CheckDlgButton(hDlg, IDD_HT_LINEAR_GAMMA, 0);
  3823. EnableDlgGroup(hDlg, IDDGammaGroup, TRUE);
  3824. }
  3825. if (!(pHTClrAdjParam->Flags & HTCAPF_SHOW_MONO)) {
  3826. EnableDlgGroup(hDlg,
  3827. &IDDMonoGroup[3],
  3828. (CurHTClrAdj.caColorfulness != COLOR_ADJ_MIN));
  3829. }
  3830. if (Changed = (BOOL)memcmp(&CurHTClrAdj,
  3831. &(pHTClrAdjParam->CurHTClrAdj),
  3832. sizeof(COLORADJUSTMENT))) {
  3833. IDScroll = (INT)IDD_HT_FIRST_SCROLL;
  3834. IDScrollEnd = (INT)IDD_HT_LAST_SCROLL;
  3835. CheckDlgButton(hDlg, IDD_HT_LOG_FILTER,
  3836. (CurHTClrAdj.caFlags & CLRADJF_LOG_FILTER) ? 1 :
  3837. 0);
  3838. CheckDlgButton(hDlg, IDD_HT_NEGATIVE,
  3839. (CurHTClrAdj.caFlags & CLRADJF_NEGATIVE) ? 1 :
  3840. 0);
  3841. }
  3842. break;
  3843. case IDCANCEL:
  3844. if (!(pHTClrAdjParam->Flags & HTCAPF_FORCE_OK)) {
  3845. UpdateHTCLRADJPARAMToWININI(hDlg, pHTClrAdjParam);
  3846. if ((pHTClrAdjParam->pCallerHTClrAdj) &&
  3847. (memcmp(&CurHTClrAdj,
  3848. &(pHTClrAdjParam->CallerHTClrAdj),
  3849. sizeof(COLORADJUSTMENT)))) {
  3850. *(pHTClrAdjParam->pCallerHTClrAdj) =
  3851. pHTClrAdjParam->CallerHTClrAdj;
  3852. Changed = TRUE;
  3853. } else {
  3854. Changed = FALSE;
  3855. }
  3856. EndDialog(hDlg, (Changed) ? 1 : 0);
  3857. return(TRUE);
  3858. }
  3859. #if DBG
  3860. DbgPrint("\nHAS INVALID DATA: Simulate a OK");
  3861. #endif
  3862. //
  3863. // We have invalid data, simulate a OK
  3864. //
  3865. case IDOK:
  3866. if ((pHTClrAdjParam->Flags & HTCAPF_CAN_UPDATE) &&
  3867. (pHTClrAdjParam->pCallerHTClrAdj)) {
  3868. if (Changed = (BOOL)memcmp(&CurHTClrAdj,
  3869. &(pHTClrAdjParam->CallerHTClrAdj),
  3870. sizeof(COLORADJUSTMENT))) {
  3871. *(pHTClrAdjParam->pCallerHTClrAdj) = CurHTClrAdj;
  3872. }
  3873. }
  3874. UpdateHTCLRADJPARAMToWININI(hDlg, pHTClrAdjParam);
  3875. EndDialog(hDlg, (Changed) ? 1 : 0);
  3876. return(TRUE);
  3877. case IDD_HT_ILLUMINANT_COMBO:
  3878. if (HIWORD(wParam) == CBN_SELCHANGE) {
  3879. ScrollCur = (LONG)SendDlgItemMessage(hDlg,
  3880. DlgID,
  3881. CB_GETCURSEL,
  3882. (WPARAM)NULL,
  3883. (LPARAM)NULL);
  3884. DoComboBox = 0x02;
  3885. CurHTClrAdj.caIlluminantIndex = (BYTE)ScrollCur;
  3886. break;
  3887. } else {
  3888. return(FALSE);
  3889. }
  3890. default:
  3891. return(FALSE);
  3892. }
  3893. break;
  3894. case WM_HSCROLL:
  3895. IDScroll =
  3896. IDScrollEnd = (INT)GetDlgCtrlID((HWND)lParam);
  3897. ScrollIndex = IDScroll - IDD_HT_FIRST_SCROLL;
  3898. ScrollControl = HTClrAdjScroll[ScrollIndex];
  3899. pCurScroll = (LPBYTE)&CurHTClrAdj + (UINT)ScrollControl.Offset;
  3900. ScrollOld =
  3901. ScrollCur = (LONG)((ScrollControl.Flags & HTCAS_SHORT) ?
  3902. *(LPSHORT)pCurScroll : *(LPWORD)pCurScroll);
  3903. if (ScrollControl.Mul != 1) {
  3904. ScrollCur /= (LONG)ScrollControl.Mul;
  3905. }
  3906. switch (LOWORD(wParam)) {
  3907. case SB_TOP:
  3908. ScrollCur = (LONG)ScrollControl.Min;
  3909. break;
  3910. case SB_BOTTOM:
  3911. ScrollCur = (LONG)ScrollControl.Max;
  3912. break;
  3913. case SB_PAGEUP:
  3914. ScrollCur -= (LONG)ScrollControl.Step;
  3915. break;
  3916. case SB_PAGEDOWN:
  3917. ScrollCur += (LONG)ScrollControl.Step;
  3918. break;
  3919. case SB_LINEUP:
  3920. --ScrollCur;
  3921. break;
  3922. case SB_LINEDOWN:
  3923. ++ScrollCur;
  3924. break;
  3925. case SB_THUMBPOSITION:
  3926. case SB_THUMBTRACK:
  3927. ScrollCur = (LONG)HIWORD(wParam) + (LONG)ScrollControl.Min;
  3928. break;
  3929. default:
  3930. return(FALSE);
  3931. }
  3932. if (ScrollCur < (LONG)ScrollControl.Min) {
  3933. ScrollCur = (LONG)ScrollControl.Min;
  3934. } else if (ScrollCur > (LONG)ScrollControl.Max) {
  3935. ScrollCur = (LONG)ScrollControl.Max;
  3936. }
  3937. if (ScrollControl.Mul != 1) {
  3938. ScrollCur *= (LONG)ScrollControl.Mul;
  3939. }
  3940. if (ScrollControl.Flags & HTCAS_SHORT) {
  3941. *(LPSHORT)pCurScroll = (SHORT)ScrollCur;
  3942. } else {
  3943. *(LPWORD)pCurScroll = (WORD)ScrollCur;
  3944. }
  3945. switch(IDScroll) {
  3946. case IDD_HT_COLORFULNESS_SCROLL:
  3947. i = -1;
  3948. if (ScrollOld == ScrollControl.Min) {
  3949. if (ScrollCur > ScrollControl.Min) {
  3950. i = 1;
  3951. }
  3952. } else {
  3953. if (ScrollCur == ScrollControl.Min) {
  3954. i = 0;
  3955. }
  3956. }
  3957. if (i >= 0) {
  3958. EnableDlgGroup(hDlg, &IDDMonoGroup[3], (BOOL)i);
  3959. }
  3960. break;
  3961. case IDD_HT_R_GAMMA_SCROLL:
  3962. case IDD_HT_G_GAMMA_SCROLL:
  3963. case IDD_HT_B_GAMMA_SCROLL:
  3964. if (ScrollControl.Flags & HTCAS_SYNC_RGB) {
  3965. if (HTCLRADJSCROLL_R_GAMMA.Flags &= HTCAS_SYNC_RGB) {
  3966. CurHTClrAdj.caRedGamma = (WORD)ScrollCur;
  3967. }
  3968. if (HTCLRADJSCROLL_G_GAMMA.Flags &= HTCAS_SYNC_RGB) {
  3969. CurHTClrAdj.caGreenGamma = (WORD)ScrollCur;
  3970. }
  3971. if (HTCLRADJSCROLL_B_GAMMA.Flags &= HTCAS_SYNC_RGB) {
  3972. CurHTClrAdj.caBlueGamma = (WORD)ScrollCur;
  3973. }
  3974. IDScroll = IDD_HT_R_GAMMA_SCROLL;
  3975. IDScrollEnd = IDD_HT_B_GAMMA_SCROLL;
  3976. }
  3977. break;
  3978. }
  3979. break;
  3980. default:
  3981. return(FALSE);
  3982. }
  3983. //
  3984. // Update the dialog box control if any of them got changed
  3985. //
  3986. if ((DoComboBox & 0x02) ||
  3987. (CurHTClrAdj.caIlluminantIndex !=
  3988. pHTClrAdjParam->CurHTClrAdj.caIlluminantIndex)) {
  3989. SendDlgItemMessage(hDlg,
  3990. IDD_HT_ILLUMINANT_COMBO,
  3991. CB_SETCURSEL,
  3992. (WPARAM)(CurHTClrAdj.caIlluminantIndex),
  3993. (LPARAM)NULL);
  3994. }
  3995. while (IDScroll <= IDScrollEnd) {
  3996. if (hCtrl = GetDlgItem(hDlg, IDScroll)) {
  3997. ScrollIndex = IDScroll - IDD_HT_FIRST_SCROLL;
  3998. ScrollControl = HTClrAdjScroll[ScrollIndex];
  3999. pCurScroll = (LPBYTE)&CurHTClrAdj + (UINT)ScrollControl.Offset;
  4000. ScrollCur = (LONG)((ScrollControl.Flags & HTCAS_SHORT) ?
  4001. *(LPSHORT)pCurScroll : *(LPWORD)pCurScroll);
  4002. if (ScrollControl.Mul != 1) {
  4003. ScrollCur /= (LONG)ScrollControl.Mul;
  4004. }
  4005. if (IsWindowEnabled(hCtrl)) {
  4006. SetScrollPos(hCtrl,
  4007. SB_CTL,
  4008. (INT)(ScrollCur - (LONG)ScrollControl.Min),
  4009. TRUE);
  4010. }
  4011. pwBuf = Buf;
  4012. if (ScrollControl.Min < 0) {
  4013. if (ScrollCur < 0) {
  4014. *pwBuf++ = L'-';
  4015. ScrollCur = -ScrollCur;
  4016. } else if (ScrollCur > 0) {
  4017. *pwBuf++ = L'+';
  4018. } else {
  4019. *pwBuf++ = L' ';
  4020. }
  4021. }
  4022. if (ScrollControl.Flags & HTCAS_SHORT) {
  4023. wsprintf(pwBuf, L"%d", (INT)ScrollCur);
  4024. } else {
  4025. wsprintf(pwBuf, L"%d%ls%03d", (INT)(ScrollCur / 1000),
  4026. pHTClrAdjParam->pwDecimal,
  4027. (INT)(ScrollCur % 1000));
  4028. }
  4029. SetDlgItemText(hDlg, IDScroll + IDD_HT_SCROLL_INT_ADD, Buf);
  4030. }
  4031. ++IDScroll;
  4032. }
  4033. if ((Changed) ||
  4034. (memcmp(&CurHTClrAdj,
  4035. &(pHTClrAdjParam->CurHTClrAdj),
  4036. sizeof(HTCOLORADJUSTMENT)))) {
  4037. pHTClrAdjParam->CurHTClrAdj = CurHTClrAdj;
  4038. pHTClrAdjParam->BmpNeedUpdate = 1;
  4039. if ((hWndBmp) &&
  4040. (pHTClrAdjParam->BmpFlags & (WORD)HT_BMP_ENABLE)) {
  4041. InvalidateRect(hWndBmp, NULL, FALSE);
  4042. } else {
  4043. UpdateAppHTBitmap(pHTClrAdjParam);
  4044. }
  4045. }
  4046. if (Msg == WM_INITDIALOG) {
  4047. if (pHTClrAdjParam->BmpFlags & HT_BMP_ENABLE) {
  4048. PostMessage(hDlg,
  4049. WM_COMMAND,
  4050. (WPARAM)IDD_HT_BMP_TEST,
  4051. (LPARAM)NULL);
  4052. }
  4053. if (!(pHTClrAdjParam->Flags & HTCAPF_CAN_UPDATE)) {
  4054. EnumChildWindows(hDlg, DisableDlgUpdate, 0);
  4055. SetFocus(GetDlgItem(hDlg, IDCANCEL));
  4056. } else {
  4057. SetFocus(GetDlgItem(hDlg, IDD_HT_BRIGHTNESS_SCROLL));
  4058. SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)TRUE, (LPARAM)FALSE);
  4059. }
  4060. return(0);
  4061. } else {
  4062. return(1);
  4063. }
  4064. }
  4065. DWORD
  4066. PickDefaultHTPatSize(
  4067. DWORD xDPI,
  4068. DWORD yDPI,
  4069. BOOL Is8bppHalftone
  4070. )
  4071. {
  4072. DWORD HTPatSize;
  4073. //
  4074. // use the smaller resolution as the pattern guide
  4075. //
  4076. if (xDPI >= 2400) {
  4077. HTPatSize = HTPAT_SIZE_16x16_M;
  4078. } else if (xDPI >= 1800) {
  4079. HTPatSize = HTPAT_SIZE_14x14_M;
  4080. } else if (xDPI >= 1200) {
  4081. HTPatSize = HTPAT_SIZE_12x12_M;
  4082. } else if (xDPI >= 900) {
  4083. HTPatSize = HTPAT_SIZE_10x10_M;
  4084. } else if (xDPI >= 400) {
  4085. HTPatSize = HTPAT_SIZE_8x8_M;
  4086. } else if (xDPI >= 180) {
  4087. HTPatSize = HTPAT_SIZE_6x6_M;
  4088. } else {
  4089. HTPatSize = HTPAT_SIZE_4x4_M;
  4090. }
  4091. if (Is8bppHalftone) {
  4092. HTPatSize -= 2;
  4093. }
  4094. return(HTPatSize);
  4095. }
  4096. VOID
  4097. ValidateDevHTInfo(
  4098. PHTDEVADJPARAM pHTDevAdjParam
  4099. )
  4100. {
  4101. DEVHTADJDATA DevHTAdjData;
  4102. DWORD HTFlags;
  4103. INT DevLoop;
  4104. INT Loop;
  4105. DevHTAdjData = pHTDevAdjParam->DevHTAdjData;
  4106. if (DevHTAdjData.DeviceFlags & DEVHTADJF_ADDITIVE_DEVICE) {
  4107. HTFlags = (HIF_SQUARE_DEVICE_PEL | HIF_ADDITIVE_PRIMS);
  4108. } else {
  4109. HTFlags = (HIF_HAS_BLACK_DYE);
  4110. }
  4111. DevLoop = 2;
  4112. while (DevLoop--) {
  4113. PDEVHTINFO pDevHTInfo;
  4114. PCOLORINFO pColorInfo;
  4115. PUDECI4 pUDECI4;
  4116. LDECI4 FAR *pLDECI4;
  4117. pDevHTInfo = (DevLoop) ? DevHTAdjData.pDefHTInfo :
  4118. DevHTAdjData.pAdjHTInfo;
  4119. pColorInfo = &(pDevHTInfo->ColorInfo);
  4120. pDevHTInfo->HTFlags &= ~(HIF_SQUARE_DEVICE_PEL |
  4121. HIF_HAS_BLACK_DYE |
  4122. HIF_ADDITIVE_PRIMS);
  4123. pDevHTInfo->HTFlags |= HTFlags;
  4124. //
  4125. // We want to check to see if this is a old data, if yes then update
  4126. // the caller to NT3.51 default
  4127. //
  4128. if (pColorInfo->Cyan.Y != (LDECI4)VALID_YC) {
  4129. pDevHTInfo->HTPatternSize = HTPAT_SIZE_MAX_INDEX + 1;
  4130. pDevHTInfo->DevPelsDPI = 0;
  4131. pColorInfo->AlignmentWhite.Y = (LDECI4)0;
  4132. pColorInfo->MagentaInCyanDye = (LDECI4)10000;
  4133. pColorInfo->RedGamma = 0;
  4134. pColorInfo->Cyan.Y = (LDECI4)VALID_YC;
  4135. }
  4136. //
  4137. // Validate pattern size
  4138. //
  4139. if (pDevHTInfo->HTPatternSize > HTPAT_SIZE_MAX_INDEX) {
  4140. pDevHTInfo->HTPatternSize = HTPAT_SIZE_DEFAULT;
  4141. }
  4142. //
  4143. // Check the CIE color infomation
  4144. //
  4145. if ((pColorInfo->Red.x < (LDECI4)CIE_x_MIN) ||
  4146. (pColorInfo->Red.x > (LDECI4)CIE_x_MAX) ||
  4147. (pColorInfo->Red.y < (LDECI4)CIE_y_MIN) ||
  4148. (pColorInfo->Red.y > (LDECI4)CIE_y_MAX) ||
  4149. (pColorInfo->Green.x < (LDECI4)CIE_x_MIN) ||
  4150. (pColorInfo->Green.x > (LDECI4)CIE_x_MAX) ||
  4151. (pColorInfo->Green.y < (LDECI4)CIE_y_MIN) ||
  4152. (pColorInfo->Green.y > (LDECI4)CIE_y_MAX) ||
  4153. (pColorInfo->Blue.x < (LDECI4)CIE_x_MIN) ||
  4154. (pColorInfo->Blue.x > (LDECI4)CIE_x_MAX) ||
  4155. (pColorInfo->Blue.y < (LDECI4)CIE_y_MIN) ||
  4156. (pColorInfo->Blue.y > (LDECI4)CIE_y_MAX) ||
  4157. (pColorInfo->AlignmentWhite.x < (LDECI4)CIE_x_MIN) ||
  4158. (pColorInfo->AlignmentWhite.x > (LDECI4)CIE_x_MAX) ||
  4159. (pColorInfo->AlignmentWhite.y < (LDECI4)CIE_y_MIN) ||
  4160. (pColorInfo->AlignmentWhite.y > (LDECI4)CIE_y_MAX) ||
  4161. (pColorInfo->AlignmentWhite.Y < (LDECI4)MIN_ALIGNMENT_WHITE) ||
  4162. (pColorInfo->AlignmentWhite.Y > (LDECI4)MAX_ALIGNMENT_WHITE)) {
  4163. pLDECI4 = (LDECI4 FAR *)&(pColorInfo->Red.x);
  4164. pUDECI4 = (UDECI4 *)&(HT_CIE_SRGB.Red.x);
  4165. Loop = 21;
  4166. while (Loop--) {
  4167. *pLDECI4++ = (LDECI4)*pUDECI4++;
  4168. }
  4169. }
  4170. //
  4171. // Checking Gamma Information
  4172. //
  4173. if ((pColorInfo->RedGamma < (LDECI4)MIN_RGB_GAMMA) ||
  4174. (pColorInfo->RedGamma > (LDECI4)MAX_RGB_GAMMA) ||
  4175. (pColorInfo->GreenGamma < (LDECI4)MIN_RGB_GAMMA) ||
  4176. (pColorInfo->GreenGamma > (LDECI4)MAX_RGB_GAMMA) ||
  4177. (pColorInfo->BlueGamma < (LDECI4)MIN_RGB_GAMMA) ||
  4178. (pColorInfo->BlueGamma > (LDECI4)MAX_RGB_GAMMA)) {
  4179. pColorInfo->RedGamma = (LDECI4)
  4180. pColorInfo->GreenGamma = (LDECI4)
  4181. pColorInfo->BlueGamma = (LDECI4)10000;
  4182. }
  4183. //
  4184. // Validate Dye Mix
  4185. //
  4186. if ((pColorInfo->MagentaInCyanDye > (LDECI4)9000) ||
  4187. (pColorInfo->YellowInCyanDye > (LDECI4)9000) ||
  4188. (pColorInfo->CyanInMagentaDye > (LDECI4)9000) ||
  4189. (pColorInfo->YellowInMagentaDye > (LDECI4)9000) ||
  4190. (pColorInfo->CyanInYellowDye > (LDECI4)9000) ||
  4191. (pColorInfo->MagentaInYellowDye > (LDECI4)9000)) {
  4192. pLDECI4 = &(pColorInfo->MagentaInCyanDye);
  4193. pUDECI4 = (UDECI4 *)&(DefaultSolidDyesInfo.MagentaInCyanDye);
  4194. Loop = 6;
  4195. while (Loop--) {
  4196. *pLDECI4++ = (LDECI4)*pUDECI4++;
  4197. }
  4198. }
  4199. }
  4200. }
  4201. VOID
  4202. SetPelSizeRange(
  4203. HWND hDlg,
  4204. PHTDEVADJPARAM pHTDAP,
  4205. BOOL ResetFirst
  4206. )
  4207. /*++
  4208. Routine Description:
  4209. This function set the current scroll range for the pixel diameter
  4210. Arguments:
  4211. hDlg - Handle to the dialog box
  4212. pHTDAP - pointer to HTDEVADJPARAM
  4213. ResetFirst - TRUE if the DevPelsDPI is not in scroll bar format
  4214. Return Value:
  4215. NONE
  4216. Author:
  4217. 30-Mar-1995 Thu 19:29:01 created -by- Daniel Chou (danielc)
  4218. Revision History:
  4219. --*/
  4220. {
  4221. HWND hScroll;
  4222. DWORD MaxPercent;
  4223. DWORD MinPel;
  4224. DWORD MaxPel;
  4225. DWORD DeviceXDPI;
  4226. LONG DevPelsDPI;
  4227. BOOL UsePercent;
  4228. extern BYTE IntHTPatSize[];
  4229. //
  4230. // pHTDAP->MinDevPels Minimum pel size
  4231. // pHTDAP->PelScrollMin Pixel Diameter scroll MAX
  4232. // pHTDAP->PelScrollMax Pixel Diameter scroll MAX
  4233. //
  4234. hScroll = GetDlgItem(hDlg, HTDevAdjScroll[0].IDDScroll);
  4235. DevPelsDPI = (LONG)pHTDAP->CurHTInfo.DevPelsDPI;
  4236. //
  4237. // Convert it back from scroll format
  4238. //
  4239. #if 0
  4240. DbgPrint("\n*CUR* DevPelsDPI=%ld (%04lx), Scroll(%ld, %ld), MinDevPels=%ld",
  4241. DevPelsDPI, DevPelsDPI,
  4242. pHTDAP->PelScrollMin, pHTDAP->PelScrollMax,
  4243. pHTDAP->MinDevPels);
  4244. #endif
  4245. if ((ResetFirst) ||
  4246. (!pHTDAP->MinDevPels) ||
  4247. (!pHTDAP->PelScrollMin) && (!pHTDAP->PelScrollMax)) {
  4248. //
  4249. // If this is the first time call then we already has the number
  4250. //
  4251. UsePercent = (BOOL)(DevPelsDPI & 0x8000);
  4252. (DWORD)DevPelsDPI &= 0x7fff;
  4253. #if 0
  4254. DbgPrint("\n*** FIRST TIME, UsePercent=%ld, DevPelsDPI=%ld",
  4255. UsePercent, DevPelsDPI);
  4256. #endif
  4257. } else if (UsePercent = (DevPelsDPI < 0)) {
  4258. DevPelsDPI = PERCENT_FROM_SCROLL(DevPelsDPI);
  4259. } else if (DevPelsDPI > 0) {
  4260. PEL_FROM_SCROLL(DevPelsDPI, pHTDAP->MinDevPels);
  4261. }
  4262. //
  4263. // Compute the min/max PEL and PERCENTAGE for this device
  4264. //
  4265. if (DeviceXDPI = (DWORD)pHTDAP->DevHTAdjData.DeviceXDPI) {
  4266. //
  4267. // Has device resolution
  4268. //
  4269. #if 0
  4270. MinPel = (LONG)((DeviceXDPI * 1675) / (1600 *
  4271. (DWORD)IntHTPatSize[pHTDAP->CurHTInfo.HTPatternSize]));
  4272. #endif
  4273. MinPel = DeviceXDPI / 6;
  4274. MaxPel = DeviceXDPI * 3;
  4275. MaxPercent = (DeviceXDPI * 1000) / MinPel;
  4276. } else {
  4277. //
  4278. // We do not allowed the DPI scroll
  4279. //
  4280. MinPel = 0;
  4281. MaxPel = 0;
  4282. MaxPercent = MAX_RES_PERCENT;
  4283. //
  4284. // Make the Resolution in percentage
  4285. //
  4286. #if 0
  4287. DbgPrint("HTUI: Warning: DevPelsDPI- Only allowed percentage changes");
  4288. #endif
  4289. UsePercent = TRUE;
  4290. }
  4291. #if 0
  4292. DbgPrint("\n*Pel=%ld to %ld [%ld%%], UsePercent=%ld, DevPelsDPI=%ld",
  4293. MinPel, MaxPel, MaxPercent, UsePercent, DevPelsDPI);
  4294. #endif
  4295. pHTDAP->MinDevPels = MinPel;
  4296. pHTDAP->PelScrollMin = MaxPercent;
  4297. pHTDAP->PelScrollMax = MaxPel;
  4298. PERCENT_TO_SCROLL(pHTDAP->PelScrollMin);
  4299. PEL_TO_SCROLL(pHTDAP->PelScrollMax, MinPel);
  4300. if (DevPelsDPI) {
  4301. if (UsePercent) {
  4302. //
  4303. // It specified percentage
  4304. //
  4305. if (DevPelsDPI < MIN_RES_PERCENT) {
  4306. DevPelsDPI = MIN_RES_PERCENT;
  4307. } else if (DevPelsDPI > (LONG)MaxPercent) {
  4308. DevPelsDPI = (LONG)MaxPercent;
  4309. }
  4310. //
  4311. // Convert to scroll range,
  4312. //
  4313. #if 0
  4314. DbgPrint("\n*DevPelsDPI=%ld PERCENT", DevPelsDPI);
  4315. #endif
  4316. PERCENT_TO_SCROLL(DevPelsDPI);
  4317. #if 0
  4318. DbgPrint("\n*Convert to SCROLL = DevPelsDPI=%ld PERCENT", DevPelsDPI);
  4319. #endif
  4320. } else {
  4321. //
  4322. // If specified the resolution
  4323. //
  4324. if (DevPelsDPI < (LONG)MinPel) {
  4325. DevPelsDPI = (LONG)MinPel;
  4326. } else if (DevPelsDPI > (LONG)MaxPel) {
  4327. DevPelsDPI = (LONG)MaxPel;
  4328. }
  4329. //
  4330. // Convert to scroll range
  4331. //
  4332. #if 0
  4333. DbgPrint("\n*DevPelsDPI=%ld PEL", DevPelsDPI);
  4334. #endif
  4335. PEL_TO_SCROLL(DevPelsDPI, MinPel);
  4336. #if 0
  4337. DbgPrint("\n*Convert to SCROLL = DevPelsDPI=%ld PEL", DevPelsDPI);
  4338. #endif
  4339. }
  4340. }
  4341. //
  4342. // Save it back
  4343. pHTDAP->CurHTInfo.DevPelsDPI = (DWORD)DevPelsDPI;
  4344. //
  4345. // Set the scroll range and position
  4346. //
  4347. #if 0
  4348. DbgPrint("\n*NEW* DevPelsDPI=%ld, Scroll(%ld, %ld), MinDevPels=%ld",
  4349. DevPelsDPI, pHTDAP->PelScrollMin, pHTDAP->PelScrollMax,
  4350. pHTDAP->MinDevPels);
  4351. #endif
  4352. SetScrollRange(hScroll,
  4353. SB_CTL,
  4354. pHTDAP->PelScrollMin,
  4355. pHTDAP->PelScrollMax,
  4356. TRUE);
  4357. SetScrollPos(hScroll, SB_CTL, (INT)DevPelsDPI, TRUE);
  4358. }
  4359. LONG
  4360. InitHTDevAdjDlg(
  4361. HWND hDlg,
  4362. PHTDEVADJPARAM pHTDevAdjParam
  4363. )
  4364. /*++
  4365. Routine Description:
  4366. This function will intialized the pop up halftone color adjustment dialog
  4367. box, it also tempopary create a display device halftone info for halftone
  4368. incoming DIB, it will also allocate the memory for necessary halftoned
  4369. result to be displayed.
  4370. Arguments:
  4371. hDlg - The handle to the owner dialog box
  4372. pHTDevAdjParam - Pointer to the HTDEVRADJPARAM
  4373. Return Value:
  4374. VOID
  4375. Author:
  4376. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  4377. Revision History:
  4378. --*/
  4379. {
  4380. HWND hScroll;
  4381. PHTDEVADJSCROLL pHTDevAdjScroll;
  4382. INT Loop;
  4383. WCHAR Buf[132];
  4384. //
  4385. // House keeping: Disable unused buttons, set to extended UI for combobox
  4386. // and set the device name in the right place
  4387. //
  4388. SendDlgItemMessage(hDlg,
  4389. IDD_HTDEV_HTPAT_COMBO,
  4390. CB_SETEXTENDEDUI,
  4391. (WPARAM)TRUE,
  4392. (LPARAM)NULL);
  4393. if (!(pHTDevAdjParam->pDeviceName)) {
  4394. LoadString(hHTUIModule, IDS_UNKNOWN, Buf, COUNT_ARRAY(Buf));
  4395. SetDlgItemText(hDlg, IDD_HTDEV_DEVICE_NAME, Buf);
  4396. } else {
  4397. SetDlgItemText(hDlg,
  4398. IDD_HTDEV_DEVICE_NAME,
  4399. pHTDevAdjParam->pDeviceName);
  4400. }
  4401. LoadString(hHTUIModule,
  4402. IDS_PEL_SIZE_AS_DEVICE,
  4403. PelAsDevice,
  4404. COUNT_ARRAY(PelAsDevice));
  4405. //
  4406. // Validate the DEVHTINFO
  4407. //
  4408. ValidateDevHTInfo(pHTDevAdjParam);
  4409. //
  4410. // Copy current adjustment set over for user to adjust, remember we must
  4411. // conver the PelsSize to MM now
  4412. //
  4413. pHTDevAdjParam->CurHTInfo = *(pHTDevAdjParam->DevHTAdjData.pAdjHTInfo);
  4414. //
  4415. // Fill the pattern size combo list box with all the selections
  4416. //
  4417. Loop = IDS_HTPAT_SIZE_MIN;
  4418. while (Loop <= IDS_HTPAT_SIZE_MAX) {
  4419. LoadString(hHTUIModule, Loop, Buf, COUNT_ARRAY(Buf));
  4420. SendDlgItemMessage(hDlg,
  4421. IDD_HTDEV_HTPAT_COMBO,
  4422. CB_ADDSTRING,
  4423. (WPARAM)NULL,
  4424. (LPARAM)Buf);
  4425. ++Loop;
  4426. }
  4427. //
  4428. // Set scroll ranges, do not include the first one, the first one is the
  4429. // Pixel size scroll which already been set ealier
  4430. //
  4431. for (Loop = 0, pHTDevAdjScroll = &(HTDevAdjScroll[0]);
  4432. Loop < COUNT_HTDEVADJSCROLL;
  4433. Loop++, pHTDevAdjScroll++ ) {
  4434. if (hScroll = GetDlgItem(hDlg, pHTDevAdjScroll->IDDScroll)) {
  4435. if (!Loop) {
  4436. SetPelSizeRange(hDlg, pHTDevAdjParam, TRUE);
  4437. } else {
  4438. SetScrollRange(hScroll,
  4439. SB_CTL,
  4440. pHTDevAdjScroll->Min,
  4441. pHTDevAdjScroll->Max,
  4442. FALSE);
  4443. }
  4444. SetWindowLongPtr(hScroll, GWLP_USERDATA, Loop);
  4445. }
  4446. }
  4447. return(1);
  4448. }
  4449. INT_PTR
  4450. CALLBACK
  4451. HTDevAdjDlgProc(
  4452. HWND hDlg,
  4453. UINT Msg,
  4454. WPARAM wParam,
  4455. LPARAM lParam
  4456. )
  4457. /*++
  4458. Routine Description:
  4459. This is the halftone color adjustments main DlgProc().
  4460. Arguments:
  4461. hDlg - The handle to the owner dialog box
  4462. Msg - message from window
  4463. wParam - First parameter
  4464. lParam - Second parameter.
  4465. Return Value:
  4466. a non-zero if process message, 0 otherwise.
  4467. This function assume is called from a DialogBoxParam() call, and expected
  4468. the WM_INITDIALOG message will have lParam equ to initialized
  4469. pHTDevAdjParam
  4470. Author:
  4471. 02-Apr-1992 Thu 18:13:58 created -by- Daniel Chou (danielc)
  4472. 06-Dec-1993 Mon 20:58:58 updated -by- Daniel Chou (danielc)
  4473. Allowed F1=Help even permission flag is not set
  4474. 30-Mar-1995 Thu 10:12:24 updated -by- Daniel Chou (danielc)
  4475. Dynamically change the Min/Max DevPel allowance, it also that
  4476. if DeviceXDPI = 0 then the DevPel is in Percentage.
  4477. Revision History:
  4478. --*/
  4479. {
  4480. HWND hScroll;
  4481. LPDWORD pCurScroll;
  4482. PHTDEVADJPARAM pHTDevAdjParam;
  4483. PDEVHTINFO pCurHTInfo;
  4484. PHTDEVADJSCROLL pHTDevAdjScroll;
  4485. LONG ScrollMin;
  4486. LONG ScrollMax;
  4487. LONG ScrollCur;
  4488. LONG Result;
  4489. INT IdxScroll;
  4490. INT IdxScrollEnd;
  4491. UINT DeciMode;
  4492. WORD DlgID;
  4493. BOOL UpdateAll;
  4494. WCHAR Buf[32];
  4495. if (Msg == WM_INITDIALOG) {
  4496. pHTDevAdjParam = (PHTDEVADJPARAM)lParam;
  4497. SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
  4498. //
  4499. // Setup halftone UI extended help style
  4500. //
  4501. SetWindowLong(hDlg,
  4502. GWL_EXSTYLE,
  4503. GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
  4504. } else if (!(pHTDevAdjParam =
  4505. (PHTDEVADJPARAM)GetWindowLongPtr(hDlg, GWLP_USERDATA))) {
  4506. return(FALSE);
  4507. }
  4508. IdxScroll = 1;
  4509. IdxScrollEnd = 0;
  4510. UpdateAll = FALSE;
  4511. pCurHTInfo = &(pHTDevAdjParam->CurHTInfo);
  4512. switch(Msg) {
  4513. case WM_INITDIALOG: // set the previouse one equal to current setting
  4514. IdxScroll = 0;
  4515. IdxScrollEnd = (UINT)(COUNT_HTDEVADJSCROLL - 1);
  4516. UpdateAll = TRUE;
  4517. if ((Result = InitHTDevAdjDlg(hDlg, pHTDevAdjParam)) < 0) {
  4518. EndDialog(hDlg, Result);
  4519. return(TRUE);
  4520. }
  4521. break;
  4522. case WM_DESTROY:
  4523. return(TRUE);
  4524. case WM_HELP:
  4525. wParam = (WPARAM)((LPHELPINFO)lParam)->hItemHandle;
  4526. lParam = (LPARAM)MAKELONG(((LPHELPINFO)lParam)->MousePos.x,
  4527. ((LPHELPINFO)lParam)->MousePos.y);
  4528. case WM_CONTEXTMENU:
  4529. DoHalftoneHelp(hDlg,
  4530. (HWND)wParam,
  4531. HELP_TYPE_HTSETUP,
  4532. (Msg == WM_HELP) ? HELP_WM_HELP : HELP_CONTEXTMENU,
  4533. (DWORD)lParam);
  4534. break;
  4535. case WM_COMMAND:
  4536. switch (DlgID = LOWORD(wParam)) {
  4537. case IDD_HTDEV_HTPAT_COMBO:
  4538. if (HIWORD(wParam) == CBN_SELCHANGE) {
  4539. pCurHTInfo->HTPatternSize =
  4540. (DWORD)SendDlgItemMessage(hDlg,
  4541. DlgID,
  4542. CB_GETCURSEL,
  4543. (WPARAM)NULL,
  4544. (LPARAM)NULL);
  4545. SetPelSizeRange(hDlg, pHTDevAdjParam, FALSE);
  4546. IdxScroll = 0;
  4547. IdxScrollEnd = 1;
  4548. } else {
  4549. return(TRUE);
  4550. }
  4551. break;
  4552. case IDOK:
  4553. //
  4554. // Convert the DevPelsDPI back to the halftone required format
  4555. //
  4556. if (!(LONG)pCurHTInfo->DevPelsDPI) {
  4557. //
  4558. // User want to use device standard, which compute
  4559. // automatically by halftone
  4560. //
  4561. NULL;
  4562. } else if ((LONG)pCurHTInfo->DevPelsDPI > 0) {
  4563. //
  4564. // User specified the pel size resolution directly
  4565. //
  4566. PEL_FROM_SCROLL(pCurHTInfo->DevPelsDPI,
  4567. pHTDevAdjParam->MinDevPels);
  4568. } else {
  4569. //
  4570. // User specified the percentage
  4571. //
  4572. PERCENT_FROM_SCROLL(pCurHTInfo->DevPelsDPI);
  4573. pCurHTInfo->DevPelsDPI |= 0x8000;
  4574. }
  4575. #if 0
  4576. DbgPrint("\nFinal DevPelsDPI=%08lx", pCurHTInfo->DevPelsDPI);
  4577. #endif
  4578. if ((pHTDevAdjParam->UpdatePermission) &&
  4579. (memcmp(pCurHTInfo,
  4580. &(pHTDevAdjParam->DevHTAdjData.pAdjHTInfo),
  4581. sizeof(DEVHTINFO)))) {
  4582. if (!(pHTDevAdjParam->DevHTAdjData.DeviceFlags &
  4583. DEVHTADJF_COLOR_DEVICE)) {
  4584. pCurHTInfo->ColorInfo.GreenGamma =
  4585. pCurHTInfo->ColorInfo.BlueGamma =
  4586. pCurHTInfo->ColorInfo.RedGamma;
  4587. }
  4588. *(pHTDevAdjParam->DevHTAdjData.pAdjHTInfo) = *pCurHTInfo;
  4589. EndDialog(hDlg, 1);
  4590. return(TRUE);
  4591. }
  4592. //
  4593. // Fall through to cancel it
  4594. //
  4595. case IDCANCEL:
  4596. EndDialog(hDlg, 0);
  4597. return(TRUE);
  4598. case IDD_HTDEV_REVERT:
  4599. case IDD_HTDEV_DEFAULT:
  4600. *pCurHTInfo = (DlgID == IDD_HTDEV_DEFAULT) ?
  4601. *(pHTDevAdjParam->DevHTAdjData.pDefHTInfo) :
  4602. *(pHTDevAdjParam->DevHTAdjData.pAdjHTInfo);
  4603. SetPelSizeRange(hDlg, pHTDevAdjParam, TRUE);
  4604. IdxScroll = 0;
  4605. IdxScrollEnd = (INT)(COUNT_HTDEVADJSCROLL - 1);
  4606. UpdateAll = TRUE;
  4607. break;
  4608. default:
  4609. return(FALSE);
  4610. }
  4611. break;
  4612. case WM_HSCROLL:
  4613. IdxScroll =
  4614. IdxScrollEnd = (INT)GetWindowLongPtr((HWND)lParam, GWLP_USERDATA);
  4615. pHTDevAdjScroll = &HTDevAdjScroll[IdxScroll];
  4616. if (IdxScroll) {
  4617. ScrollMin = (LONG)pHTDevAdjScroll->Min;
  4618. ScrollMax = (LONG)pHTDevAdjScroll->Max;
  4619. } else {
  4620. ScrollMin = pHTDevAdjParam->PelScrollMin;
  4621. ScrollMax = pHTDevAdjParam->PelScrollMax;
  4622. }
  4623. pCurScroll = (LPDWORD)((LPBYTE)pCurHTInfo + pHTDevAdjScroll->Offset);
  4624. ScrollCur = (LONG)*pCurScroll;
  4625. switch (LOWORD(wParam)) {
  4626. case SB_TOP:
  4627. ScrollCur = ScrollMin;
  4628. break;
  4629. case SB_BOTTOM:
  4630. ScrollCur = ScrollMax;
  4631. break;
  4632. case SB_PAGEUP:
  4633. ScrollCur -= (LONG)pHTDevAdjScroll->Step;
  4634. break;
  4635. case SB_PAGEDOWN:
  4636. ScrollCur += (LONG)pHTDevAdjScroll->Step;
  4637. break;
  4638. case SB_LINEUP:
  4639. --ScrollCur;
  4640. break;
  4641. case SB_LINEDOWN:
  4642. ++ScrollCur;
  4643. break;
  4644. case SB_THUMBPOSITION:
  4645. case SB_THUMBTRACK:
  4646. //
  4647. // Only for the device pixel diameter will use the negative values
  4648. //
  4649. ScrollCur = (LONG)((IdxScroll) ? (WORD)HIWORD(wParam) :
  4650. (SHORT)HIWORD(wParam));
  4651. break;
  4652. default:
  4653. return(FALSE);
  4654. }
  4655. if (ScrollCur < ScrollMin) {
  4656. ScrollCur = ScrollMin;
  4657. } else if (ScrollCur > ScrollMax) {
  4658. ScrollCur = ScrollMax;
  4659. }
  4660. *pCurScroll = (DWORD)ScrollCur;
  4661. break;
  4662. default:
  4663. return(FALSE);
  4664. }
  4665. if (UpdateAll) {
  4666. SendDlgItemMessage(hDlg,
  4667. IDD_HTDEV_HTPAT_COMBO,
  4668. CB_SETCURSEL,
  4669. (WPARAM)pCurHTInfo->HTPatternSize,
  4670. (LPARAM)NULL);
  4671. }
  4672. while (IdxScroll <= IdxScrollEnd) {
  4673. pHTDevAdjScroll = &HTDevAdjScroll[IdxScroll];
  4674. if (hScroll = GetDlgItem(hDlg, pHTDevAdjScroll->IDDScroll)) {
  4675. pCurScroll = (LPDWORD)((LPBYTE)pCurHTInfo +
  4676. pHTDevAdjScroll->Offset);
  4677. SetScrollPos(hScroll,
  4678. SB_CTL,
  4679. (INT)(ScrollCur = (LONG)*pCurScroll),
  4680. TRUE);
  4681. if (IdxScroll) {
  4682. DeciMode = (UINT)pHTDevAdjScroll->DeciSize;
  4683. wsprintf(Buf, DeciConvert[DeciMode].FormatStr,
  4684. (UINT)(ScrollCur / DeciConvert[DeciMode].Divider),
  4685. pHTDevAdjParam->pwDecimal,
  4686. (UINT)(ScrollCur % DeciConvert[DeciMode].Divider));
  4687. SetDlgItemText(hDlg, pHTDevAdjScroll->IDDText, Buf);
  4688. } else {
  4689. if (ScrollCur == 0) {
  4690. SetDlgItemText(hDlg, IDD_HTDEV_PIXEL_TEXT, PelAsDevice);
  4691. } else {
  4692. if (ScrollCur > 0) {
  4693. //
  4694. // Pel resolution, Cur-Max+Min-1 (0 base)
  4695. //
  4696. PEL_FROM_SCROLL(ScrollCur, pHTDevAdjParam->MinDevPels);
  4697. wsprintf(Buf, L"1/%ld\"", ScrollCur);
  4698. } else {
  4699. //
  4700. // Percentage
  4701. //
  4702. PERCENT_FROM_SCROLL(ScrollCur);
  4703. wsprintf(Buf, L"%ld.%ld%%", (LONG)(ScrollCur / 10),
  4704. (LONG)(ScrollCur % 10));
  4705. }
  4706. SetDlgItemText(hDlg, IDD_HTDEV_PIXEL_TEXT, Buf);
  4707. }
  4708. }
  4709. }
  4710. ++IdxScroll;
  4711. }
  4712. if (Msg == WM_INITDIALOG) {
  4713. if (!pHTDevAdjParam->UpdatePermission) {
  4714. EnumChildWindows(hDlg, DisableDlgUpdate, 0);
  4715. DlgID = IDCANCEL;
  4716. } else {
  4717. DlgID = IDD_HTDEV_HTPAT_COMBO;
  4718. }
  4719. SetFocus(GetDlgItem(hDlg, DlgID));
  4720. return(FALSE);
  4721. } else {
  4722. return(TRUE);
  4723. }
  4724. }