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.

1134 lines
64 KiB

  1. //***************************************************************************************************
  2. // N5DIZMK.C
  3. //
  4. // Functions dithering (For N5 printer)
  5. //---------------------------------------------------------------------------------------------------
  6. // copyright(C) 1997-2000 CASIO COMPUTER CO.,LTD. / CASIO ELECTRONICS MANUFACTURING CO.,LTD.
  7. //***************************************************************************************************
  8. #include <WINDOWS.H>
  9. #include <WINBASE.H>
  10. #include "COLDEF.H"
  11. #include "COMDIZ.H"
  12. #include "N5COLMH.H"
  13. #include "N5COLSB.H"
  14. #include "N5DIZMK.H"
  15. #include "strsafe.h" // Security-Code 2002.3.6
  16. //===================================================================================================
  17. // Definition of the random number dithering pattern distinction bit
  18. //===================================================================================================
  19. #define NEWSTO 0x80000000 /* MSB ON */
  20. //===================================================================================================
  21. // LUT data ID correspondence table
  22. //===================================================================================================
  23. #if !defined(CP80W9X) // CP-E8000 is invalid
  24. //static DWORD ColLutIdtTbl[4] =
  25. // /* Brightness(Direct) tincture(Direct) Brightness(linear) tincture(linear) */
  26. // { 0x20000000, 0x20000002, 0x20000001, 0x20000003 };
  27. static DWORD ColLutIdtTbl[2] =
  28. /* Brightness(Direct) tincture(Direct) */
  29. { 0x20000000, 0x20000002 };
  30. #endif
  31. //===================================================================================================
  32. // Dithering pattern data ID correspondence table
  33. //===================================================================================================
  34. #if !defined(CP80W9X) // CP-E8000 is invalid
  35. //static DWORD ColDizDizIdtTbl[2][5][4][5] = {
  36. static DWORD ColDizDizIdtTbl621[2][5][4][5] = {
  37. /* C M Y K Monochrome */
  38. /****** For Char, Graphic (8x8 size) **********************************************/
  39. {
  40. /*===== 300dpi 2value ==========================================================*/
  41. { { 0x20000000, 0x20000001, 0x20000002, 0x20000003, 0x20000038 }, /* fime */
  42. { 0x20000000, 0x20000001, 0x20000002, 0x20000003, 0x20000038 }, /* middle */
  43. { 0x20000000, 0x20000001, 0x20000002, 0x20000003, 0x20000038 }, /* rough */
  44. { 0x20000000, 0x20000001, 0x20000002, 0x20000003, 0x20000038 } }, /* random */
  45. /*===== 300dpi 16value =========================================================*/
  46. { { 0x20000004, 0x20000005, 0x20000006, 0x20000007, 0x20000039 }, /* fime */
  47. { 0x20000004, 0x20000005, 0x20000006, 0x20000007, 0x20000039 }, /* middle */
  48. { 0x20000004, 0x20000005, 0x20000006, 0x20000007, 0x20000039 }, /* rough */
  49. { 0x20000004, 0x20000005, 0x20000006, 0x20000007, 0x20000039 } }, /* random */
  50. /*===== 600dpi 2value =========================================================*/
  51. { { 0x20000008, 0x20000009, 0x2000000A, 0x2000000B, 0x2000003A }, /* fime */
  52. { 0x20000008, 0x20000009, 0x2000000A, 0x2000000B, 0x2000003A }, /* middle */
  53. { 0x20000008, 0x20000009, 0x2000000A, 0x2000000B, 0x2000003A }, /* rough */
  54. { 0x20000008, 0x20000009, 0x2000000A, 0x2000000B, 0x2000003A } }, /* random */
  55. /*===== 600dpi 4value =========================================================*/
  56. { { 0x2000000C, 0x2000000D, 0x2000000E, 0x2000000F, 0x2000003B }, /* fime */
  57. { 0x2000000C, 0x2000000D, 0x2000000E, 0x2000000F, 0x2000003B }, /* middle */
  58. { 0x2000000C, 0x2000000D, 0x2000000E, 0x2000000F, 0x2000003B }, /* rough */
  59. { 0x2000000C, 0x2000000D, 0x2000000E, 0x2000000F, 0x2000003B } }, /* random */
  60. /*===== 600dpi 16value =========================================================*/
  61. { { 0x20000010, 0x20000011, 0x20000012, 0x20000013, 0x2000003C }, /* fime */
  62. { 0x20000010, 0x20000011, 0x20000012, 0x20000013, 0x2000003C }, /* middle */
  63. { 0x20000010, 0x20000011, 0x20000012, 0x20000013, 0x2000003C }, /* rough */
  64. { 0x20000010, 0x20000011, 0x20000012, 0x20000013, 0x2000003C } } /* random */
  65. },
  66. /****** For Image (Optional size) *************************************************/
  67. {
  68. /*===== 300dpi 2value =========================================================*/
  69. { { 0x20000014, 0x20000015, 0x20000016, 0x20000017, 0x2000003D }, /* fime */
  70. { 0x20000014, 0x20000015, 0x20000016, 0x20000017, 0x2000003D }, /* middle */
  71. { 0x20000014, 0x20000015, 0x20000016, 0x20000017, 0x2000003D }, /* rough */
  72. { (NEWSTO+0), (NEWSTO+1), (NEWSTO+2), (NEWSTO+3), (NEWSTO+3) } }, /* random */
  73. /*===== 300dpi 16value =========================================================*/
  74. { { 0x20000018, 0x20000019, 0x2000001A, 0x2000001B, 0x2000003E }, /* fime */
  75. { 0x20000018, 0x20000019, 0x2000001A, 0x2000001B, 0x2000003E }, /* middle */
  76. { 0x20000018, 0x20000019, 0x2000001A, 0x2000001B, 0x2000003E }, /* rough */
  77. { (NEWSTO+4), (NEWSTO+5), (NEWSTO+6), (NEWSTO+7), (NEWSTO+7) } }, /* random */
  78. /*===== 600dpi 2value =========================================================*/
  79. { { 0x2000001C, 0x2000001D, 0x2000001E, 0x20000051, 0x2000003F }, /* fime */
  80. { 0x2000001C, 0x2000001D, 0x2000001E, 0x20000051, 0x2000001F }, /* middle */
  81. { 0x2000001C, 0x2000001D, 0x2000001E, 0x20000051, 0x20000040 }, /* rough */
  82. { (NEWSTO+8), (NEWSTO+9), (NEWSTO+10),(NEWSTO+11),(NEWSTO+11)} }, /* random */
  83. /*===== 600dpi 4value =========================================================*/
  84. { { 0x20000020, 0x20000021, 0x20000022, 0x20000023, 0x20000023 }, /* fime */
  85. { 0x20000024, 0x20000025, 0x20000026, 0x20000052, 0x20000027 }, /* middle */
  86. { 0x20000047, 0x20000048, 0x2000002A, 0x2000002B, 0x2000002A }, /* rough */
  87. { (NEWSTO+12),(NEWSTO+13),(NEWSTO+14),(NEWSTO+15),(NEWSTO+15)} }, /* random */
  88. /*===== 600dpi 16value =========================================================*/
  89. { { 0x2000002C, 0x2000002D, 0x2000002E, 0x2000002F, 0x2000002F }, /* fime */
  90. { 0x20000030, 0x20000031, 0x20000032, 0x20000053, 0x20000033 }, /* middle */
  91. { 0x20000049, 0x2000004A, 0x20000036, 0x20000037, 0x20000036 }, /* rough */
  92. { (NEWSTO+16),(NEWSTO+17),(NEWSTO+18),(NEWSTO+19),(NEWSTO+19)} } /* random */
  93. }
  94. };
  95. #endif
  96. static DWORD ColDizDizIdtTbl516[2][3][4] = {
  97. /* fime middle rough random */
  98. /****** Characte or Graphic (8 x 8 size) ******************************************/
  99. { { 0x20000038, 0x20000038, 0x20000038, 0x20000038 }, /* 300dpi 2value */
  100. { 0x2000003A, 0x2000003A, 0x2000003A, 0x2000003A }, /* 600dpi 2value */
  101. { 0x30000000, 0x30000000, 0x30000000, 0x30000000 } }, /* 1200dpi 2value */
  102. /****** Image (optional size) *****************************************************/
  103. { { 0x2000003D, 0x2000003D, 0x20000040, (NEWSTO+3) }, /* 300dpi 2value */
  104. { 0x2000003F, 0x2000001F, 0x20000040, (NEWSTO+11) }, /* 600dpi 2value */
  105. { 0x30000001, 0x30000002, 0x30000003, (NEWSTO+11) } } /* 1200dpi 2value */
  106. };
  107. //===================================================================================================
  108. // Revision value table data ID correspondence table
  109. //===================================================================================================
  110. #if !defined(CP80W9X) // CP-E8000 is invalid
  111. //static DWORD ColDizAdjIdtTbl[2][5][4][5] = {
  112. static DWORD ColDizAdjIdtTbl621[2][5][4][5] = {
  113. /* C M Y K Monochrome */
  114. /****** For Char, Graphic (8x8 size) **********************************************/
  115. {
  116. /*===== 300dpi 2value =========================================================*/
  117. { { 0x20000000, 0x20000000, 0x20000001, 0x20000001, 0x20000001 }, /* fime */
  118. { 0x20000000, 0x20000000, 0x20000001, 0x20000001, 0x20000001 }, /* middle */
  119. { 0x20000000, 0x20000000, 0x20000001, 0x20000001, 0x20000001 }, /* rough */
  120. { 0x20000000, 0x20000000, 0x20000001, 0x20000001, 0x20000001 } }, /* random */
  121. /*===== 300dpi 16value =========================================================*/
  122. { { 0x20000002, 0x20000002, 0x20000003, 0x20000004, 0x20000004 }, /* fime */
  123. { 0x20000002, 0x20000002, 0x20000003, 0x20000004, 0x20000004 }, /* middle */
  124. { 0x20000002, 0x20000002, 0x20000003, 0x20000004, 0x20000004 }, /* rough */
  125. { 0x20000002, 0x20000002, 0x20000003, 0x20000004, 0x20000004 } }, /* random */
  126. /*===== 600dpi 2value =========================================================*/
  127. { { 0x20000005, 0x20000005, 0x20000006, 0x20000006, 0x20000006 }, /* fime */
  128. { 0x20000005, 0x20000005, 0x20000006, 0x20000006, 0x20000006 }, /* middle */
  129. { 0x20000005, 0x20000005, 0x20000006, 0x20000006, 0x20000006 }, /* rough */
  130. { 0x20000005, 0x20000005, 0x20000006, 0x20000006, 0x20000006 } }, /* random */
  131. /*===== 600dpi 4value =========================================================*/
  132. { { 0x20000007, 0x20000007, 0x20000008, 0x20000008, 0x20000008 }, /* fime */
  133. { 0x20000007, 0x20000007, 0x20000008, 0x20000008, 0x20000008 }, /* middle */
  134. { 0x20000007, 0x20000007, 0x20000008, 0x20000008, 0x20000008 }, /* rough */
  135. { 0x20000007, 0x20000007, 0x20000008, 0x20000008, 0x20000008 } }, /* random */
  136. /*===== 600dpi 16value =========================================================*/
  137. { { 0x20000009, 0x20000009, 0x2000000A, 0x2000000A, 0x2000000A }, /* fime */
  138. { 0x20000009, 0x20000009, 0x2000000A, 0x2000000A, 0x2000000A }, /* middle */
  139. { 0x20000009, 0x20000009, 0x2000000A, 0x2000000A, 0x2000000A }, /* rough */
  140. { 0x20000009, 0x20000009, 0x2000000A, 0x2000000A, 0x2000000A } } /* random */
  141. },
  142. /****** For Image (Optional size) *************************************************/
  143. {
  144. /*===== 300dpi 2value =========================================================*/
  145. { { 0x2000000B, 0x2000000B, 0x20000001, 0x20000001, 0x20000001 }, /* fime */
  146. { 0x2000000B, 0x2000000B, 0x20000001, 0x20000001, 0x20000001 }, /* middle */
  147. { 0x2000000B, 0x2000000B, 0x20000001, 0x20000001, 0x20000001 }, /* rough */
  148. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, /* random */
  149. /*===== 300dpi 16value =========================================================*/
  150. { { 0x2000000C, 0x2000000C, 0x20000003, 0x20000004, 0x20000003 }, /* fime */
  151. { 0x2000000C, 0x2000000C, 0x20000003, 0x20000004, 0x20000003 }, /* middle */
  152. { 0x2000000C, 0x2000000C, 0x20000003, 0x20000004, 0x20000003 }, /* rough */
  153. { 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001 } }, /* random */
  154. /*===== 600dpi 2value =========================================================*/
  155. { { 0x2000000D, 0x2000000D, 0x20000006, 0x20000023, 0x2000001F }, /* fime */
  156. { 0x2000000D, 0x2000000D, 0x20000006, 0x20000023, 0x2000000E }, /* middle */
  157. { 0x2000000D, 0x2000000D, 0x20000006, 0x20000023, 0x20000020 }, /* rough */
  158. { 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002 } }, /* random */
  159. /*===== 600dpi 4value =========================================================*/
  160. { { 0x2000000F, 0x2000000F, 0x20000010, 0x20000011, 0x20000011 }, /* fime */
  161. { 0x20000012, 0x20000012, 0x20000008, 0x20000024, 0x20000013 }, /* middle */
  162. { 0x20000021, 0x20000021, 0x20000015, 0x20000016, 0x20000015 }, /* rough */
  163. { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } }, /* random */
  164. /*===== 600dpi 16value =========================================================*/
  165. { { 0x20000017, 0x20000017, 0x20000018, 0x20000019, 0x20000019 }, /* fime */
  166. { 0x2000001A, 0x2000001A, 0x2000000A, 0x20000025, 0x2000001B }, /* middle */
  167. { 0x20000022, 0x20000022, 0x2000001D, 0x2000001E, 0x2000001D }, /* rough */
  168. { 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 } } /* random */
  169. }
  170. };
  171. #endif
  172. static DWORD ColDizAdjIdtTbl516[2][3][4] = {
  173. /* fime middle rough random */
  174. /****** Characte or Graphic (8 x 8 size) ******************************************/
  175. { { 0x30000000, 0x30000000, 0x30000000, 0x30000000 }, /* 300dpi 2value */
  176. { 0x30000001, 0x30000001, 0x30000001, 0x30000001 }, /* 600dpi 2value */
  177. { 0x30000002, 0x30000002, 0x30000002, 0x30000002 } }, /* 1200dpi 2value */
  178. /****** Image (optional size) *****************************************************/
  179. { { 0x30000000, 0x30000000, 0x30000003, 0x30000004 }, /* 300dpi 2value */
  180. { 0x30000005, 0x30000006, 0x30000007, 0x30000008 }, /* 600dpi 2value */
  181. { 0x30000009, 0x3000000A, 0x3000000B, 0x3000000C } } /* 1200dpi 2value */
  182. };
  183. //===================================================================================================
  184. // Random number dithering pattern inside ID correspondence table
  185. //===================================================================================================
  186. static struct {
  187. DWORD Idt; /* Dithering pattern ID */
  188. DWORD IdtTbl; /* Many value mask table ID */
  189. DWORD Sls; /* Threshold */
  190. DWORD OfsXax; /* Offset X (base pattern shift) */
  191. DWORD OfsYax; /* Offset Y (base pattern shift) */
  192. } ColDizIdtTblSto[20] = {
  193. /* inside ID Idt TblIdt Sls OfsX OfsY */
  194. /* (NEWSTO+0) */ { 0x00000000, 0xFFFFFFFF, 1, 181, 33 }, /* 302 C */
  195. /* (NEWSTO+1) */ { 0x00000000, 0xFFFFFFFF, 1, 53, 118 }, /* 302 M */
  196. /* (NEWSTO+2) */ { 0x00000000, 0xFFFFFFFF, 1, 138, 161 }, /* 302 Y */
  197. /* (NEWSTO+3) */ { 0x00000000, 0xFFFFFFFF, 1, 0, 0 }, /* 302 K */
  198. /* (NEWSTO+4) */ { 0x00000001, 0x00000005, 15, 181, 33 }, /* 316 C */
  199. /* (NEWSTO+5) */ { 0x00000001, 0x00000005, 15, 53, 118 }, /* 316 M */
  200. /* (NEWSTO+6) */ { 0x00000001, 0x00000005, 15, 138, 161 }, /* 316 Y */
  201. /* (NEWSTO+7) */ { 0x00000001, 0x00000005, 15, 0, 0 }, /* 316 K */
  202. /* (NEWSTO+8) */ { 0x00000000, 0xFFFFFFFF, 1, 181, 33 }, /* 602 C */
  203. /* (NEWSTO+9) */ { 0x00000000, 0xFFFFFFFF, 1, 53, 118 }, /* 602 M */
  204. /* (NEWSTO+10) */ { 0x00000000, 0xFFFFFFFF, 1, 138, 161 }, /* 602 Y */
  205. /* (NEWSTO+11) */ { 0x00000000, 0xFFFFFFFF, 1, 0, 0 }, /* 602 K */
  206. /* (NEWSTO+12) */ { 0x00000001, 0x00000006, 3, 181, 33 }, /* 604 C */
  207. /* (NEWSTO+13) */ { 0x00000001, 0x00000006, 3, 53, 118 }, /* 604 M */
  208. /* (NEWSTO+14) */ { 0x00000001, 0x00000006, 3, 138, 161 }, /* 604 Y */
  209. /* (NEWSTO+15) */ { 0x00000001, 0x00000006, 3, 0, 0 }, /* 604 K */
  210. /* (NEWSTO+16) */ { 0x00000001, 0x00000007, 15, 181, 33 }, /* 616 C */
  211. /* (NEWSTO+17) */ { 0x00000001, 0x00000007, 15, 53, 118 }, /* 616 M */
  212. /* (NEWSTO+18) */ { 0x00000001, 0x00000007, 15, 138, 161 }, /* 616 Y */
  213. /* (NEWSTO+19) */ { 0x00000001, 0x00000007, 15, 0, 0 } /* 616 K */
  214. };
  215. //===================================================================================================
  216. // Dot gain revision table
  217. //===================================================================================================
  218. static BYTE GinTblP10[256] = {
  219. /* 00 */ 0x00,0x01,0x02,0x04,0x05,0x06,0x07,0x09,
  220. /* 08 */ 0x0a,0x0b,0x0c,0x0d,0x0f,0x10,0x11,0x12,
  221. /* 10 */ 0x13,0x15,0x16,0x17,0x18,0x1a,0x1b,0x1c,
  222. /* 18 */ 0x1d,0x1e,0x20,0x21,0x22,0x23,0x24,0x26,
  223. /* 20 */ 0x27,0x28,0x29,0x2b,0x2c,0x2d,0x2e,0x2f,
  224. /* 28 */ 0x31,0x32,0x33,0x34,0x35,0x37,0x38,0x39,
  225. /* 30 */ 0x3a,0x3b,0x3d,0x3e,0x3f,0x40,0x41,0x43,
  226. /* 38 */ 0x44,0x45,0x46,0x47,0x48,0x4a,0x4b,0x4c,
  227. /* 40 */ 0x4d,0x4e,0x50,0x51,0x52,0x53,0x54,0x55,
  228. /* 48 */ 0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5e,0x5f,
  229. /* 50 */ 0x60,0x61,0x62,0x63,0x65,0x66,0x67,0x68,
  230. /* 58 */ 0x69,0x6a,0x6b,0x6d,0x6e,0x6f,0x70,0x71,
  231. /* 60 */ 0x72,0x73,0x74,0x76,0x77,0x78,0x79,0x7a,
  232. /* 68 */ 0x7b,0x7c,0x7d,0x7e,0x7f,0x81,0x82,0x83,
  233. /* 70 */ 0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,
  234. /* 78 */ 0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,
  235. /* 80 */ 0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,
  236. /* 88 */ 0x9b,0x9c,0x9d,0x9e,0x9f,0xa0,0xa1,0xa2,
  237. /* 90 */ 0xa3,0xa4,0xa5,0xa5,0xa6,0xa7,0xa8,0xa9,
  238. /* 98 */ 0xaa,0xab,0xac,0xac,0xad,0xae,0xaf,0xb0,
  239. /* a0 */ 0xb1,0xb2,0xb3,0xb3,0xb4,0xb5,0xb6,0xb7,
  240. /* a8 */ 0xb8,0xb9,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,
  241. /* b0 */ 0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,0xc4,
  242. /* b8 */ 0xc5,0xc6,0xc7,0xc8,0xc9,0xc9,0xca,0xcb,
  243. /* c0 */ 0xcc,0xcd,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,
  244. /* c8 */ 0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,
  245. /* d0 */ 0xd9,0xda,0xdb,0xdb,0xdc,0xdd,0xde,0xdf,
  246. /* d8 */ 0xdf,0xe0,0xe1,0xe2,0xe3,0xe4,0xe4,0xe5,
  247. /* e0 */ 0xe6,0xe7,0xe8,0xe8,0xe9,0xea,0xeb,0xec,
  248. /* e8 */ 0xec,0xed,0xee,0xef,0xf0,0xf0,0xf1,0xf2,
  249. /* f0 */ 0xf3,0xf4,0xf5,0xf5,0xf6,0xf7,0xf8,0xf9,
  250. /* f8 */ 0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff
  251. };
  252. //===================================================================================================
  253. // Gamma revision table for sRGB (1.2)
  254. //===================================================================================================
  255. static BYTE GamTbl[256] =
  256. /*---- 1.2 ----*/
  257. { 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03,
  258. 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08,
  259. 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e,
  260. 0x0e, 0x0f, 0x10, 0x11, 0x11, 0x12, 0x13, 0x14,
  261. 0x15, 0x15, 0x16, 0x17, 0x18, 0x19, 0x19, 0x1a,
  262. 0x1b, 0x1c, 0x1d, 0x1e, 0x1e, 0x1f, 0x20, 0x21,
  263. 0x22, 0x23, 0x24, 0x24, 0x25, 0x26, 0x27, 0x28,
  264. 0x29, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  265. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36,
  266. 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
  267. 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
  268. 0x47, 0x48, 0x49, 0x49, 0x4a, 0x4b, 0x4c, 0x4d,
  269. 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
  270. 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d,
  271. 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x64, 0x65, 0x66,
  272. 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
  273. 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
  274. 0x77, 0x78, 0x79, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
  275. 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  276. 0x88, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
  277. 0x91, 0x92, 0x93, 0x94, 0x96, 0x97, 0x98, 0x99,
  278. 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xa0, 0xa1, 0xa2,
  279. 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xaa, 0xab,
  280. 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb3, 0xb4,
  281. 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xbb, 0xbc, 0xbd,
  282. 0xbe, 0xbf, 0xc0, 0xc1, 0xc3, 0xc4, 0xc5, 0xc6,
  283. 0xc7, 0xc8, 0xc9, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
  284. 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd9,
  285. 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2,
  286. 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
  287. 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf3, 0xf4, 0xf5,
  288. 0xf6, 0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xff };
  289. //===================================================================================================
  290. // Gamma revision table for sRGB MONO (1.4)
  291. //===================================================================================================
  292. static BYTE GamTblMon[256] =
  293. /*---- 1.4 ----*/
  294. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
  295. 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04,
  296. 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08,
  297. 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d,
  298. 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x11, 0x12,
  299. 0x13, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17, 0x17,
  300. 0x18, 0x19, 0x1a, 0x1a, 0x1b, 0x1c, 0x1c, 0x1d,
  301. 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23, 0x23,
  302. 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a,
  303. 0x2b, 0x2c, 0x2d, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
  304. 0x32, 0x33, 0x34, 0x34, 0x35, 0x36, 0x37, 0x38,
  305. 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3e, 0x3f,
  306. 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  307. 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
  308. 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  309. 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x60,
  310. 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
  311. 0x69, 0x6a, 0x6b, 0x6c, 0x6e, 0x6f, 0x70, 0x71,
  312. 0x72, 0x73, 0x74, 0x75, 0x76, 0x78, 0x79, 0x7a,
  313. 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x83,
  314. 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,
  315. 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x94, 0x95, 0x96,
  316. 0x97, 0x98, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0xa0,
  317. 0xa1, 0xa2, 0xa3, 0xa5, 0xa6, 0xa7, 0xa8, 0xaa,
  318. 0xab, 0xac, 0xad, 0xaf, 0xb0, 0xb1, 0xb2, 0xb4,
  319. 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbd, 0xbe,
  320. 0xbf, 0xc0, 0xc2, 0xc3, 0xc4, 0xc6, 0xc7, 0xc8,
  321. 0xca, 0xcb, 0xcc, 0xce, 0xcf, 0xd0, 0xd1, 0xd3,
  322. 0xd4, 0xd5, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xde,
  323. 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe6, 0xe7, 0xe8,
  324. 0xea, 0xeb, 0xec, 0xee, 0xef, 0xf1, 0xf2, 0xf3,
  325. 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff };
  326. //===================================================================================================
  327. // Static functions
  328. //===================================================================================================
  329. //---------------------------------------------------------------------------------------------------
  330. // Dithering pattern ID , Get adjustment value table ID
  331. //---------------------------------------------------------------------------------------------------
  332. static VOID ColDizIdtGet( // Return value no
  333. LPDIZINF, // Dithering information
  334. DWORD, // Color number 0:C M:1 2:Y 3:K 4:Mono
  335. LPDWORD, // (output) Dithering pattern ID
  336. LPDWORD // (output) Adjustment value table ID
  337. );
  338. //---------------------------------------------------------------------------------------------------
  339. // Dithering pattern file data reading
  340. //---------------------------------------------------------------------------------------------------
  341. static DWORD ColDizDatRdd( // Error status
  342. LPBYTE, // Dithering file data
  343. DWORD, // Dithering pattern ID
  344. DWORD, // Adjustment value table ID
  345. DWORD, // Threshold(For confirmation)
  346. LPDWORD, // Dithering pattern size housing address
  347. LPBYTE, // Dithering pattern data housing address
  348. LPBYTE // Work area
  349. );
  350. //---------------------------------------------------------------------------------------------------
  351. // Dithering pattern block head searching
  352. //---------------------------------------------------------------------------------------------------
  353. static DWORD ColDizDizSch( // The dithering pattern block head
  354. LPBYTE, // Dithering pattern file data
  355. DWORD // Dithering pattern ID
  356. );
  357. //---------------------------------------------------------------------------------------------------
  358. // Adjustment value table block head searching
  359. //---------------------------------------------------------------------------------------------------
  360. static DWORD ColDizAdjSch( // The adjustment value table block head
  361. LPBYTE, // Dithering pattern file data
  362. DWORD // adjustment value table ID
  363. );
  364. //---------------------------------------------------------------------------------------------------
  365. // 4 byte (DWORD:32 bit) data read
  366. //---------------------------------------------------------------------------------------------------
  367. static DWORD FleRddLng( // Reading data(DWORD)
  368. LPBYTE, // Reading file data
  369. DWORD // Reading position
  370. );
  371. //---------------------------------------------------------------------------------------------------
  372. // 2 byte (WORD:16 bit) data read
  373. //---------------------------------------------------------------------------------------------------
  374. static WORD FleRddSht( // Reading data(WORD)
  375. LPBYTE, // Reading file data
  376. DWORD // Reading position
  377. );
  378. //---------------------------------------------------------------------------------------------------
  379. // 4 byte (DWORD:32 bit) data read
  380. //---------------------------------------------------------------------------------------------------
  381. static DWORD FleRddLngLtl( // Reading data(DWORD)
  382. LPBYTE, // Reading file data
  383. DWORD // Reading position
  384. );
  385. //---------------------------------------------------------------------------------------------------
  386. // 2 byte (WORD:16 bit) data read
  387. //---------------------------------------------------------------------------------------------------
  388. static WORD FleRddShtLtl( // Reading data(WORD)
  389. LPBYTE, // Reading file data
  390. DWORD // Reading position
  391. );
  392. //***************************************************************************************************
  393. // Functions
  394. //***************************************************************************************************
  395. //===================================================================================================
  396. // LUT data read
  397. //===================================================================================================
  398. #if !defined(CP80W9X) // CP-E8000 is invalid
  399. DWORD WINAPI N501ColLutDatRdd( // LUT pointer
  400. LPBYTE lutDat, // LUT file data
  401. DWORD lutNum // LUT number
  402. )
  403. {
  404. DWORD n, num;
  405. DWORD pnt, gldNum, qtyTbl, adrTbl;
  406. /*======================================================================*/
  407. /* LUT file format Header information(128byte) */
  408. /*----------------------------------------------------------------------*/
  409. /* 0 - 3 LUT file distinction "LUT_" */
  410. /* 4 - 63 Text information (nonused) */
  411. /* 64 - 67 File format version */
  412. /* 68 - 127 Reservation completion data */
  413. /*======================================================================*/
  414. /*----- LUT file distinction -------------------------------------------*/
  415. if ((lutDat[0] != 'L') || (lutDat[1] != 'U') || (lutDat[2] != 'T') ||
  416. (lutDat[3] != '_')) return 0L;
  417. /*----- LUT Procedure (each version) -----------------------------------*/
  418. switch (FleRddLngLtl(lutDat, 64L)) {
  419. case 101: /* Ver1.01 */
  420. /*==================================================================*/
  421. /* Ver1.01 */
  422. /*------------------------------------------------------------------*/
  423. /* 128 - 131 Housing LUT number(n) */
  424. /* 132 - 135 LUT(0) Grid number */
  425. /* 136 - 139 LUT(0) Data address */
  426. /* . . */
  427. /* . . */
  428. /* xxx - xxx LUT(n-1) Grid number */
  429. /* xxx - xxx LUT(n-1) Data address */
  430. /*==================================================================*/
  431. if (lutNum == (DWORD)0xFFFFFFFF) lutNum = 0L;
  432. /* Custom LUT in the case of, head LUT */
  433. if (lutNum >= FleRddLngLtl(lutDat, 128L)) /* Housing LUT number */
  434. return 0L;
  435. pnt = 132L + lutNum * 8; /* Reading pointer seek */
  436. gldNum = FleRddLngLtl(lutDat, pnt); /* Grid number */
  437. return FleRddLngLtl(lutDat, pnt + 4L); /* Table data address */
  438. case 110: /* Ver1.10 */
  439. /*==================================================================*/
  440. /* Ver1.10 */
  441. /*------------------------------------------------------------------*/
  442. /* 128 - xxx Mask ROM format ("LT95") */
  443. /*==================================================================*/
  444. /*----- Custom LUT -------------------------------------------------*/
  445. if (lutNum == (DWORD)0xFFFFFFFF) {
  446. adrTbl = FleRddLng(lutDat, 44L + 128L); /* LUT information address */
  447. return FleRddLng(lutDat, adrTbl + 16L + 128L) + 128L;
  448. /* LUT pointer */
  449. }
  450. /*----- Uncustom LUT -----------------------------------------------*/
  451. switch (lutNum) {
  452. case LUT_XD: num = 0; break; /* Brightness */
  453. case LUT_YD: num = 1; break; /* Tincture */
  454. // case LUT_XL: num = 2; break; /* Brightness(linear) */
  455. // case LUT_YL: num = 3; break; /* Tincture(linear) */
  456. default: return 0L;
  457. }
  458. qtyTbl = FleRddLng(lutDat, 40L + 128L); /* LUT number */
  459. adrTbl = FleRddLng(lutDat, 44L + 128L); /* LUT information address */
  460. for (n = 0; n < qtyTbl; n++) {
  461. if (ColLutIdtTbl[num] == FleRddLng(lutDat, adrTbl + 128L))
  462. return FleRddLng(lutDat, adrTbl + 16L + 128L) + 128L;
  463. /* LUT pointer */
  464. adrTbl += 20L;
  465. }
  466. return 0L;
  467. default: /* Other versions */
  468. return 0L;
  469. }
  470. }
  471. #endif
  472. //===================================================================================================
  473. // Global LUT make
  474. //===================================================================================================
  475. #if !defined(CP80W9X) // CP-E8000 is invalid
  476. DWORD WINAPI N501ColLutMakGlb( // ERRNON : OK
  477. // ERRILLPRM : Parameter error
  478. LPRGB lutRgb, // Transformation former LUT RGB->RGB
  479. LPCMYK lutCmy, // Transformation former LUT RGB->CMYK
  480. LPRGBINF rgbInf, // RGB information
  481. LPCMYKINF cmyInf, // cmyk information
  482. LPCMYK lutGlb, // Global LUT
  483. LPBYTE wrk // Work
  484. )
  485. {
  486. DWORD n, red, grn, blu, pnt;
  487. LPRGB tmpRgb; // RGB->RGB
  488. COLMCHINF mchInf; // Color matching information
  489. // LPRGB cchRgb; // Color transformation cache table (RGB)
  490. // LPCMYK cchCmy; // Color transformation cache table (CMYK)
  491. tmpRgb = (LPRGB)wrk; /* RGB temporary buffer 12288B */
  492. // cchRgb = (LPRGB)wrk; /* Cache buffer RGB 768B */
  493. // cchCmy = (LPCMYK)(wrk + (sizeof(RGBS) * CCHTBLSIZ));
  494. // /* Cache buffer CMYK 1024B */
  495. // tmpRgb = (LPRGB)(wrk + (sizeof(RGBS) * CCHTBLSIZ + sizeof(CMYK) * CCHTBLSIZ));
  496. // /* RGB temporary buffer 12288B */
  497. if ((lutCmy == NULL) || (rgbInf == NULL) || (cmyInf == NULL) ||
  498. (lutGlb == NULL)) return ERRILLPRM; /* Parameter error */
  499. /*----- Transformation former LUT (RGB->RGB) ---------------------------*/
  500. if (lutRgb != NULL) { /* RGB->RGB LUT use */
  501. // for (n = 0; n < (DWORD)LUTSIZ016; n++) tmpRgb[n] = lutRgb[n];
  502. for (n = 0; n < (DWORD)LUTSIZ016; n++) {
  503. tmpRgb[n].Red = lutRgb[n].Blu;
  504. tmpRgb[n].Grn = lutRgb[n].Grn;
  505. tmpRgb[n].Blu = lutRgb[n].Red;
  506. }
  507. } else { /* RGB->RGB LUT unused */
  508. for (red = 0; red < 16; red++) {
  509. for (grn = 0; grn < 16; grn++) {
  510. for (blu = 0; blu < 16; blu++) {
  511. pnt = red * 16 * 16 + grn * 16 + blu;
  512. tmpRgb[pnt].Red = (BYTE)red * 17;
  513. tmpRgb[pnt].Grn = (BYTE)grn * 17;
  514. tmpRgb[pnt].Blu = (BYTE)blu * 17;
  515. }
  516. }
  517. }
  518. }
  519. /*----- RGB color control ----------------------------------------------*/
  520. if ( (rgbInf->Lgt) || /* Brightness Except for 0 */
  521. (rgbInf->Con) || /* Contrast Except for 0 */
  522. (rgbInf->Crm) || /* Chroma Except for 0 */
  523. (rgbInf->Gmr != 10) || /* Gamma(R) Except for 1.0 */
  524. (rgbInf->Gmg != 10) || /* Gamma(G) Except for 1.0 */
  525. (rgbInf->Gmb != 10) || /* Gamma(B) Except for 1.0 */
  526. (rgbInf->DnsRgb) ) /* RGB density Except for 0 */
  527. N501ColCtrRgb((DWORD)LUTSIZ016, tmpRgb, rgbInf);
  528. /*----- Color matching information set ---------------------------------*/
  529. mchInf.Mch = MCHNML; /* LUT: normal */
  530. mchInf.Bla = KCGNON; /* Black replacement: NO */
  531. mchInf.Ucr = UCRNOO; /* UCR: NO */
  532. mchInf.UcrTbl = NULL; /* UCR table: NO */
  533. mchInf.LutAdr = lutCmy; /* LUT address (Transformation former LUT) */
  534. mchInf.ColQty = 0; /* Color quality: 0 */
  535. mchInf.ColAdr = NULL; /* Color table: NO */
  536. mchInf.CchRgb = NULL; /* RGB cache table: NO */
  537. mchInf.CchCmy = NULL; /* CMYK cache table: NO */
  538. /*----- Color matching (RGB->CMYK) -------------------------------------*/
  539. N501ColCchIni(&mchInf); /* Cache table initialize */
  540. N501ColMchPrc((DWORD)LUTSIZ016, tmpRgb, lutGlb, &mchInf);
  541. /*----- CMYK color contorol --------------------------------------------*/
  542. if ( (cmyInf->Viv) || /* Vivid Except for 0 */
  543. (cmyInf->DnsCyn) || /* Printing density(C) Except for 0 */
  544. (cmyInf->DnsMgt) || /* Printing density(M) Except for 0 */
  545. (cmyInf->DnsYel) || /* Printing density(Y) Except for 0 */
  546. (cmyInf->DnsBla) ) /* Printing density(K) Except for 0 */
  547. N501ColCtrCmy((DWORD)LUTSIZ016, lutGlb, cmyInf);
  548. return ERRNON;
  549. }
  550. #endif
  551. //===================================================================================================
  552. // Global LUT make (monochrome)
  553. //===================================================================================================
  554. DWORD WINAPI N501ColLutMakGlbMon( // ERRNON : OK
  555. // ERRILLPRM : Parameter error
  556. LPRGB lutRgb, // Transformation former LUT RGB->RGB
  557. LPRGBINF rgbInf, // RGB information
  558. LPCMYKINF cmyInf, // cmyk informatio
  559. LPCMYK lutGlb, // Global LUT
  560. LPBYTE wrk // Work
  561. )
  562. {
  563. DWORD n, red, grn, blu, tmp;
  564. LPRGB tmpRgb; // RGB -> RBG
  565. LPCMYK tmpCmy; // CMYK -> CMYK
  566. LPBYTE lut;
  567. tmpRgb = (LPRGB)wrk; /* RGB temporary buffer 768B */
  568. tmpCmy = (LPCMYK)(wrk + (DWORD)768);/* CMYK temporary buffer 1024B */
  569. if ((rgbInf == NULL) || (cmyInf == NULL) || (lutGlb == NULL))
  570. return ERRILLPRM; /* Parameter error */
  571. /*----- Transformation former LUT (RGB -> RGB) -------------------------*/
  572. if (lutRgb != NULL) { /* RGB->RGB LUT use */
  573. for (n = 0; n < (DWORD)256; n++) {
  574. tmpRgb[n].Red = tmpRgb[n].Grn = tmpRgb[n].Blu = GamTbl[n];
  575. }
  576. } else { /* RGB->RGB LUT unused */
  577. for (n = 0; n < (DWORD)256; n++) {
  578. tmpRgb[n].Red = tmpRgb[n].Grn = tmpRgb[n].Blu = (BYTE)n;
  579. }
  580. }
  581. /*----- RGB color control ----------------------------------------------*/
  582. if ( (rgbInf->Lgt) || /* Brightness Except for 0 */
  583. (rgbInf->Con) || /* Contrast Except for 0 */
  584. (rgbInf->Crm) || /* Chroma Except for 0 */
  585. (rgbInf->Gmr != 10) || /* Gamma(R) Except for 1.0 */
  586. (rgbInf->Gmg != 10) || /* Gamma(G) Except for 1.0 */
  587. (rgbInf->Gmb != 10) || /* Gamma(B) Except for 1.0 */
  588. (rgbInf->Dns) ) /* RGB density Except for 0 */
  589. N501ColCtrRgb((DWORD)256, tmpRgb, rgbInf);
  590. /*----- Color matching (RGB->CMYK) -------------------------------------*/
  591. for (n = 0; n < (DWORD)256; n++) {
  592. red = GamTblMon[tmpRgb[n].Red];
  593. grn = GamTblMon[tmpRgb[n].Grn];
  594. blu = GamTblMon[tmpRgb[n].Blu];
  595. tmp = (red * (DWORD)3 + grn * (DWORD)5 + blu * (DWORD)2) / (DWORD)10;
  596. tmpCmy[n].Cyn = tmpCmy[n].Mgt = tmpCmy[n].Yel = (BYTE)0;
  597. tmpCmy[n].Bla = (BYTE)255 - GinTblP10[tmp];
  598. }
  599. /*----- CMYK color contorol --------------------------------------------*/
  600. if ( (cmyInf->Viv) || /* Vivid Except for 0 */
  601. (cmyInf->DnsCyn) || /* Printing density(C) Except for 0 */
  602. (cmyInf->DnsMgt) || /* Printing density(M) Except for 0 */
  603. (cmyInf->DnsYel) || /* Printing density(Y) Except for 0 */
  604. (cmyInf->DnsBla) ) /* Printing density(K) Except for 0 */
  605. N501ColCtrCmy((DWORD)LUTSIZ016, tmpCmy, cmyInf);
  606. /*----- Global LUT set --------------------------------------------------*/
  607. lut = (BYTE *)lutGlb;
  608. for (n = 0; n < (DWORD)256; n++) {
  609. lut[n] = tmpCmy[n].Bla;
  610. }
  611. return ERRNON;
  612. }
  613. //===================================================================================================
  614. // High speed LUT(32grid) make
  615. //===================================================================================================
  616. #if !defined(CP80W9X) // CP-E8000 is invalid
  617. VOID WINAPI N501ColLutMak032( // Return value no
  618. LPCMYK lutBse, // Transformation former LUT (16grid)
  619. LPCMYK lut032, // High speed LUT(32grid)
  620. LPBYTE wrk // Work
  621. )
  622. {
  623. COLMCHINF mchInf; // Color matching information
  624. // LPRGB cchRgb; // Color transformation cash table (RBG)
  625. // LPCMYK cchCmy; // Color transformation cash table (CMYK)
  626. DWORD red, grn, blu;
  627. RGBS rgb;
  628. LPRGB srcRgb;
  629. srcRgb = (LPRGB)wrk; /* RGB temporary buffer 96B */
  630. // cchRgb = (LPRGB)wrk; /* Cache buffer RGB 768B */
  631. // cchCmy = (LPCMYK)(wrk + (sizeof(RGBS) * CCHTBLSIZ));
  632. // /* Cache buffer CMYK 1024B */
  633. // srcRgb = (LPRGB)(wrk + (sizeof(RGBS) * CCHTBLSIZ + sizeof(CMYK) * CCHTBLSIZ));
  634. // /* RGB temporary buffer 96B */
  635. /*----- Color matching information set ---------------------------------*/
  636. mchInf.Mch = MCHNML; /* LUT: normal */
  637. mchInf.Bla = KCGNON; /* Black replacement: NO */
  638. mchInf.Ucr = UCRNOO; /* UCR: NO */
  639. mchInf.UcrTbl = NULL; /* UCR table: NO */
  640. mchInf.LutAdr = lutBse; /* LUT address (Transformation former LUT) */
  641. mchInf.ColQty = 0; /* Color quality: 0 */
  642. mchInf.ColAdr = NULL; /* Color table: NO */
  643. mchInf.CchRgb = NULL; /* RGB cache table: NO */
  644. mchInf.CchCmy = NULL; /* CMYK cache table: NO */
  645. /*----- 32grid LUT make ------------------------------------------------*/
  646. for (red = 0; red < GLDNUM032; red++) {
  647. rgb.Red = (BYTE)(red * 255 / (GLDNUM032 - 1));
  648. for (grn = 0; grn < GLDNUM032; grn++) {
  649. rgb.Grn = (BYTE)(grn * 255 / (GLDNUM032 - 1));
  650. for (blu = 0; blu < GLDNUM032; blu++) {
  651. rgb.Blu = (BYTE)(blu * 255 / (GLDNUM032 - 1));
  652. srcRgb[blu] = rgb;
  653. }
  654. N501ColMchPrc((DWORD)GLDNUM032, srcRgb, lut032, &mchInf);
  655. lut032 += GLDNUM032;
  656. }
  657. }
  658. }
  659. #endif
  660. //===================================================================================================
  661. // Color data read
  662. //===================================================================================================
  663. #if !defined(CP80W9X) // CP-E8000 is invalid
  664. DWORD WINAPI N501ColColDatRdd( // Color data pointer
  665. LPBYTE colDat, // Color data file data
  666. LPDWORD colQty // Color data quality
  667. )
  668. {
  669. /*======================================================================*/
  670. /* Color data file format Header information(128byte) */
  671. /*----------------------------------------------------------------------*/
  672. /* 0 - 3 Color data file distinction "CDF_" */
  673. /* 4 - 63 Text information (nonused) */
  674. /* 64 - 67 File format version */
  675. /* 68 - 127 Reserved */
  676. /*======================================================================*/
  677. /*----- Color data file distinction ------------------------------------*/
  678. if ((colDat[0] != 'C') || (colDat[1] != 'D') || (colDat[2] != 'F') ||
  679. (colDat[3] != '_')) return 0L;
  680. /*----- Color data procedure (each version) ----------------------------*/
  681. switch (FleRddLngLtl(colDat, 64L)) {
  682. case 101: /* Ver1.01 */
  683. /*==================================================================*/
  684. /* Ver1.01 */
  685. /*------------------------------------------------------------------*/
  686. /* 128 - 131 Color data quality (n) */
  687. /* 132 - 138 Color value(RGB-CMYK) #1 */
  688. /* 139 - 145 Color value(RGB-CMYK) #2 */
  689. /* . . */
  690. /* . . */
  691. /* xxx - xxx Color value(RGB-CMYK) #n-1 */
  692. /* xxx - xxx Color value(RGB-CMYK) #n */
  693. /*==================================================================*/
  694. if ((*colQty = (DWORD)FleRddLng(colDat, 128L)) == 0) /* Color data quality */
  695. return 0L; /* Color data quality: 0 */
  696. return 132L; /* Color data pointer */
  697. default: /* Other versions */
  698. return 0L;
  699. }
  700. }
  701. #endif
  702. //===================================================================================================
  703. // Dithering pattern information set
  704. //===================================================================================================
  705. DWORD WINAPI N501ColDizInfSet( // ERRNON : OK
  706. // ERRDIZHED : Header error
  707. // ERRDIZNON : Dithering data no
  708. // ERRDIZSLS : Threshold error
  709. // ERRDIZSIZ : X/Y size error
  710. // ERRDIZADJ : Adjustment value error
  711. LPBYTE dizDat, // Dithering file data
  712. LPDIZINF dizInf, // Dithering information
  713. LPBYTE wrk // Work
  714. )
  715. {
  716. DWORD sts, sls;
  717. DWORD idtDiz, idtAdj;
  718. /*======================================================================*/
  719. /* Dithering file format Header information(128byte) */
  720. /*----------------------------------------------------------------------*/
  721. /* 0 - 3 Dithering file distinction "DIZ_" */
  722. /* 4 - 63 Text information (nonused) */
  723. /* 64 - 67 File format version */
  724. /* 68 - 127 Reserved */
  725. /*======================================================================*/
  726. /*----- Dithering file distinction -------------------------------------*/
  727. if ((dizDat[0] != 'D') || (dizDat[1] != 'I') || (dizDat[2] != 'Z') ||
  728. (dizDat[3] != '_')) return ERRDIZHED;
  729. /*----- Dithering procedure (each version) -----------------------------*/
  730. switch (FleRddLngLtl(dizDat, 64L)) {
  731. case 101: /* Ver1.01 */
  732. /*==================================================================*/
  733. /* Ver1.01 */
  734. /*------------------------------------------------------------------*/
  735. /* 128 - xxx Mask ROM format ("DP95") */
  736. /*==================================================================*/
  737. switch (dizInf->PrnMod) {
  738. case PRM316: case PRM616: sls = 15; break;
  739. case PRM604: sls = 3; break;
  740. default: sls = 1; break;
  741. }
  742. dizInf->DizSls = sls;
  743. dizDat += 128L;
  744. #if !defined(CP80W9X) // CP-E8000 is invalid
  745. if (dizInf->ColMon == CMMCOL) {
  746. /*===== Color mode =============================================*/
  747. /*----- Cyn ----------------------------------------------------*/
  748. ColDizIdtGet(dizInf, 0, &idtDiz, &idtAdj);
  749. if ((sts = ColDizDatRdd(dizDat, idtDiz, idtAdj, sls,
  750. &(dizInf->SizCyn), dizInf->TblCyn, wrk)) != ERRNON)
  751. return sts;
  752. /*----- Mgt ----------------------------------------------------*/
  753. ColDizIdtGet(dizInf, 1, &idtDiz, &idtAdj);
  754. if ((sts = ColDizDatRdd(dizDat, idtDiz, idtAdj, sls,
  755. &(dizInf->SizMgt), dizInf->TblMgt, wrk)) != ERRNON)
  756. return sts;
  757. /*----- Yel ----------------------------------------------------*/
  758. ColDizIdtGet(dizInf, 2, &idtDiz, &idtAdj);
  759. if ((sts = ColDizDatRdd(dizDat, idtDiz, idtAdj, sls,
  760. &(dizInf->SizYel), dizInf->TblYel, wrk)) != ERRNON)
  761. return sts;
  762. /*----- Bla ----------------------------------------------------*/
  763. ColDizIdtGet(dizInf, 3, &idtDiz, &idtAdj);
  764. if ((sts = ColDizDatRdd(dizDat, idtDiz, idtAdj, sls,
  765. &(dizInf->SizBla), dizInf->TblBla, wrk)) != ERRNON)
  766. return sts;
  767. } else {
  768. #endif
  769. /*===== Monochrome mode, Black =================================*/
  770. ColDizIdtGet(dizInf, 4, &idtDiz, &idtAdj);
  771. if ((sts = ColDizDatRdd(dizDat, idtDiz, idtAdj, sls,
  772. &(dizInf->SizBla), dizInf->TblBla, wrk)) != ERRNON)
  773. return sts;
  774. #if !defined(CP80W9X) // CP-E8000 is invalid
  775. }
  776. #endif
  777. return ERRNON;
  778. default: /* Other versions */
  779. return ERRDIZHED;
  780. }
  781. }
  782. //***************************************************************************************************
  783. // Static functions
  784. //***************************************************************************************************
  785. //---------------------------------------------------------------------------------------------------
  786. // Dithering pattern ID , Get adjustment value table ID
  787. //---------------------------------------------------------------------------------------------------
  788. static VOID ColDizIdtGet( // Return value no
  789. LPDIZINF dizInf, // Dithering information
  790. DWORD col, // Color number 0:C M:1 2:Y 3:K 4:Mono
  791. LPDWORD idtDiz, // (output) Dithering pattern ID
  792. LPDWORD idtAdj // (output) Adjustment value table ID
  793. )
  794. {
  795. DWORD knd, mod, diz;
  796. knd = (dizInf->DizKnd == KNDCHR)? 0: 1;
  797. // switch (dizInf->PrnMod) {
  798. // case PRM316: mod = 1; break;
  799. // case PRM602: mod = 2; break;
  800. // case PRM604: mod = 3; break;
  801. // case PRM616: mod = 4; break;
  802. // case PRM122: mod = 2; break; /* 1200dpi 2value */
  803. // default: mod = 0; break;
  804. // }
  805. switch (dizInf->DizPat) {
  806. case DIZSML: diz = 0; break;
  807. case DIZRUG: diz = 2; break;
  808. case DIZSTO: diz = 3; break;
  809. default: diz = 1; break;
  810. }
  811. #if !defined(CP80W9X) // CP-E8000 is invalid
  812. switch (dizInf->PrnEng) {
  813. case ENG516: /* IX-516 MONO 1200dpi/2value */
  814. #endif
  815. switch (dizInf->PrnMod) {
  816. case PRM602: mod = 1; break;
  817. case PRM122: mod = 2; break;
  818. default: mod = 0; break;
  819. }
  820. *idtDiz = ColDizDizIdtTbl516[knd][mod][diz];
  821. *idtAdj = ColDizAdjIdtTbl516[knd][mod][diz];
  822. #if !defined(CP80W9X) // CP-E8000 is invalid
  823. break;
  824. default: /* IX-621 COLOR 600dpi/16value */
  825. switch (dizInf->PrnMod) {
  826. case PRM316: mod = 1; break;
  827. case PRM602: mod = 2; break;
  828. case PRM604: mod = 3; break;
  829. case PRM616: mod = 4; break;
  830. default: mod = 0; break;
  831. }
  832. *idtDiz = ColDizDizIdtTbl621[knd][mod][diz][col];
  833. *idtAdj = ColDizAdjIdtTbl621[knd][mod][diz][col];
  834. break;
  835. }
  836. #endif
  837. // *idtDiz = ColDizDizIdtTbl[knd][mod][diz][col];
  838. // *idtAdj = ColDizAdjIdtTbl[knd][mod][diz][col];
  839. }
  840. //---------------------------------------------------------------------------------------------------
  841. // Dithering pattern file data reading
  842. //---------------------------------------------------------------------------------------------------
  843. static DWORD ColDizDatRdd( // ERRNON : OK
  844. // ERRDIZNON : Dithering data no
  845. // ERRDIZSLS : Threshold error
  846. // ERRDIZSIZ : X/Y size error
  847. // ERRDIZADJ : Adjustment value error
  848. LPBYTE dizDat, // Dithering file data
  849. DWORD idtDiz, // Dithering pattern ID
  850. DWORD idtAdj, // Adjustment value table ID
  851. DWORD chkSls, // Threshold(For confirmation)
  852. LPDWORD siz, // Dithering pattern size housing address
  853. LPBYTE tbl, // Dithering pattern data housing address
  854. LPBYTE wrk // Work area
  855. )
  856. {
  857. DWORD n, dimNum, datSiz, sls, ofsXax, ofsYax, ofsPnt, dst, src;
  858. BYTE dat;
  859. LPBYTE adjTbl, slsTbl;
  860. DWORD idtTbl;
  861. USHORT sizXax, sizYax;
  862. DWORD pnt;
  863. adjTbl = wrk; /* Adjustment value table buffer 256B */
  864. slsTbl = wrk + 256; /* Threshold table buffer 3825B */
  865. if (tbl != NULL) {
  866. if (idtAdj != (DWORD)0xFFFFFFFF) {
  867. if ((pnt = ColDizAdjSch(dizDat, idtAdj)) == 0L)
  868. /* adjustment value table block head */
  869. return ERRDIZNON;
  870. pnt = FleRddLng(dizDat, pnt + 16L);
  871. /* Adjustment value table address */
  872. for (n = 0; n < 256; n++) adjTbl[n] = dizDat[pnt + n];
  873. /* Data copy */
  874. } else {
  875. for (n = 0; n < 256; n++) adjTbl[n] = (BYTE)n;
  876. }
  877. }
  878. /*----- Normal dithering pattern(Unrandom number dithering pattern) ----*/
  879. if (!(idtDiz & NEWSTO)) {
  880. if ((pnt = ColDizDizSch(dizDat, idtDiz)) == 0L)
  881. /* Dithering pattern block head */
  882. return ERRDIZNON; /* Dithering data no */
  883. switch (FleRddSht(dizDat, pnt + 8L)) { /* Data attribute */
  884. case 0x1000: sls = 1; break;
  885. case 0x3000: sls = 3; break;
  886. case 0xF000: sls = 15; break;
  887. default: return ERRDIZSLS; /* Threshold error */
  888. }
  889. if (sls != chkSls) return ERRDIZSLS; /* Threshold error */
  890. sizXax = FleRddSht(dizDat, pnt + 12L); /* X size */
  891. sizYax = FleRddSht(dizDat, pnt + 14L); /* Y size */
  892. if (sizXax != sizYax) return ERRDIZSIZ; /* X/Y size error */
  893. *siz = sizXax; /* Dithering pattern size set */
  894. if (tbl == NULL) return ERRNON;
  895. pnt = FleRddLng(dizDat, pnt + 16L);
  896. /* Dithering pattern data address */
  897. datSiz = sizXax * sizYax * sls;
  898. for (n = 0; n < datSiz; n++) tbl[n] = adjTbl[dizDat[pnt + n]];
  899. /* Dithering pattern data set */
  900. return ERRNON;
  901. }
  902. /*----- Random number dithering pattern (NEW screen) -------------------*/
  903. dimNum = (DWORD)(idtDiz & ~(DWORD)NEWSTO);
  904. idtDiz = ColDizIdtTblSto[dimNum].Idt;
  905. idtTbl = ColDizIdtTblSto[dimNum].IdtTbl;
  906. sls = ColDizIdtTblSto[dimNum].Sls;
  907. ofsXax = ColDizIdtTblSto[dimNum].OfsXax;
  908. ofsYax = ColDizIdtTblSto[dimNum].OfsYax;
  909. if (sls != chkSls) return ERRDIZSLS; /* Threshold error */
  910. if (tbl != NULL) {
  911. /* Many value mask table read */
  912. datSiz = (DWORD)255 * sls;
  913. if (idtTbl != (DWORD)0xFFFFFFFF) {
  914. if ((pnt = ColDizAdjSch(dizDat, idtTbl)) == 0L)
  915. /* The many value mask table block head */
  916. return ERRDIZNON; /* Dithering data no */
  917. pnt = FleRddLng(dizDat, pnt + 16L);
  918. for (n = 0; n < datSiz; n++) slsTbl[n] = dizDat[pnt + n];
  919. /* Data copy */
  920. } else {
  921. for (n = 0; n < datSiz; n++) slsTbl[n] = (BYTE)n;
  922. }
  923. }
  924. if ((pnt = ColDizDizSch(dizDat, idtDiz)) == 0L)
  925. /* The dithering pattern block head */
  926. return ERRDIZNON; /* Dithering data no */
  927. if (FleRddSht(dizDat, pnt + 8L) != (USHORT)0x1000) { /* Data attribute */
  928. /* random number DIZ, Basis mask=1(0x1000) */
  929. return ERRDIZADJ; /* Other is error */
  930. }
  931. sizXax = FleRddSht(dizDat, pnt + 12L); /* X size */
  932. sizYax = FleRddSht(dizDat, pnt + 14L); /* Y size */
  933. // Check of zero divide 2002.3.20 >>>
  934. if ((sizXax == 0) || (sizYax == 0))
  935. return ERRDIZSIZ; /* X/Y size orror */
  936. // Check of zero divide 2002.3.20 <<<
  937. if (sizXax != sizYax) return ERRDIZSIZ; /* X/Y size orror */
  938. *siz = sizXax; /* Dithering pattern size set */
  939. if (tbl == NULL) return ERRNON;
  940. pnt = FleRddLng(dizDat, pnt + 16L); /* Dithering pattern data address */
  941. datSiz = (DWORD)sizXax * sizYax;
  942. ofsXax %= sizXax;
  943. ofsYax %= sizYax;
  944. ofsPnt = ofsYax * sizXax + ofsXax;
  945. /* Shift different color and I do the data copy with 2 stages, to express */
  946. for (dst = (datSiz - ofsPnt), src = 0; src < ofsPnt; dst++, src++) {
  947. dat = dizDat[pnt + src];
  948. for (n = 0; n < sls; n++) {
  949. tbl[dst * sls + n] = adjTbl[slsTbl[dat * sls + n]];
  950. }
  951. }
  952. for (dst = 0; src < datSiz; dst++, src++) {
  953. dat = dizDat[pnt + src];
  954. for (n = 0; n < sls; n++) {
  955. tbl[dst * sls + n] = adjTbl[slsTbl[dat * sls + n]];
  956. }
  957. }
  958. return ERRNON;
  959. }
  960. //===================================================================================================
  961. // Dithering pattern block head searching
  962. //===================================================================================================
  963. static DWORD ColDizDizSch( // The dithering pattern block head
  964. LPBYTE dizDat, // Dithering pattern file data
  965. DWORD idtDiz // Dithering pattern ID
  966. )
  967. {
  968. DWORD n;
  969. DWORD qtyTbl, adrTbl;
  970. qtyTbl = FleRddLng(dizDat, 40L); /* Dithering pattern quality */
  971. adrTbl = FleRddLng(dizDat, 44L); /* Dithering pattern information bureau address */
  972. for (n = 0; n < qtyTbl; n++) {
  973. if (idtDiz == FleRddLng(dizDat, adrTbl)) return adrTbl;
  974. adrTbl += 20L;
  975. }
  976. return 0L;
  977. }
  978. //===================================================================================================
  979. // Adjustment value table block head searching
  980. static DWORD ColDizAdjSch( // The adjustment value table block head
  981. LPBYTE adjDat, // Dithering pattern file data
  982. DWORD idtAdj // adjustment value table ID
  983. )
  984. {
  985. DWORD n;
  986. DWORD qtyTbl, adrTbl;
  987. qtyTbl = FleRddLng(adjDat, 48L); /* Adjustment table quality */
  988. adrTbl = FleRddLng(adjDat, 52L); /* Adjustment table infomatiopn address */
  989. for (n = 0; n < qtyTbl; n++) {
  990. if (idtAdj == FleRddLng(adjDat, adrTbl)) return adrTbl;
  991. adrTbl += 20L;
  992. }
  993. return 0L;
  994. }
  995. //===================================================================================================
  996. // File data read
  997. //===================================================================================================
  998. //---------------------------------------------------------------------------------------------------
  999. // 4 byte (DWORD:32 bit) data read
  1000. //---------------------------------------------------------------------------------------------------
  1001. static DWORD FleRddLng(
  1002. LPBYTE fle,
  1003. DWORD pnt
  1004. )
  1005. {
  1006. return (DWORD)fle[pnt + 3] + (DWORD)fle[pnt + 2] * 0x100 +
  1007. (DWORD)fle[pnt + 1] * 0x10000 + (DWORD)fle[pnt] * 0x1000000;
  1008. }
  1009. //---------------------------------------------------------------------------------------------------
  1010. // 2 byte (WORD:16 bit) data read
  1011. //---------------------------------------------------------------------------------------------------
  1012. static USHORT FleRddSht(
  1013. LPBYTE fle,
  1014. DWORD pnt
  1015. )
  1016. {
  1017. return (USHORT)fle[pnt + 1] + (USHORT)fle[pnt] * 0x100;
  1018. }
  1019. //---------------------------------------------------------------------------------------------------
  1020. // 4 byte (DWORD:32 bit) data read
  1021. //---------------------------------------------------------------------------------------------------
  1022. static DWORD FleRddLngLtl(
  1023. LPBYTE fle,
  1024. DWORD pnt
  1025. )
  1026. {
  1027. return (DWORD)fle[pnt] + (DWORD)fle[pnt + 1] * 0x100 +
  1028. (DWORD)fle[pnt + 2] * 0x10000 + (DWORD)fle[pnt + 3] * 0x1000000;
  1029. }
  1030. //---------------------------------------------------------------------------------------------------
  1031. // 2 byte (WORD:16 bit) data read
  1032. //---------------------------------------------------------------------------------------------------
  1033. static USHORT FleRddShtLtl(
  1034. LPBYTE fle,
  1035. DWORD pnt
  1036. )
  1037. {
  1038. return (USHORT)fle[pnt] + (USHORT)fle[pnt + 1] * 0x100;
  1039. }
  1040. // End of N5DIZMK.C