Tizen 2.1 base
[platform/upstream/epson-inkjet-printer-escpr.git] / lib / epson-escpage.c
1 /*__________________________________  epson-escpage.c   ________________________________*/\r
2 \r
3 /*       1         2         3         4         5         6         7         8        */\r
4 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
5 /*******************************************|********************************************/\r
6 /*\r
7  *   Copyright (c) 2010  Seiko Epson Corporation                 All rights reserved.\r
8  *\r
9  *   Copyright protection claimed includes all forms and matters of\r
10  *   copyrightable material and information now allowed by statutory or judicial\r
11  *   law or hereinafter granted, including without limitation, material generated\r
12  *   from the software programs which are displayed on the screen such as icons,\r
13  *   screen display looks, etc.\r
14  *\r
15  */\r
16 \r
17 /*------------------------------------  Includes   -------------------------------------*/\r
18 /*******************************************|********************************************/\r
19 #include "epson-escpr-err.h"\r
20 #include "epson-escpr-mem.h"\r
21 #include "epson-escpage-color.h"\r
22 #include "epson-escpage-mono.h"\r
23 #ifdef GCOMSW_CMD_ESCPAGE_S\r
24 #include "epson-escpage-s.h"\r
25 #endif\r
26 #include "epson-escpage.h"\r
27 \r
28 /*-----------------------------  Local Macro Definitions -------------------------------*/\r
29 /*******************************************|********************************************/\r
30 #ifdef EPS_LOG_MODULE_PAGE\r
31 #define EPS_LOG_MODULE  EPS_LOG_MODULE_PAGE\r
32 #else\r
33 #define EPS_LOG_MODULE  0\r
34 #endif\r
35 \r
36 /*-----------------------------------  EJL Commands ------------------------------------*/\r
37 /*******************************************|********************************************/\r
38 const static EPS_UINT8 sbEJL_ESC_SOH[] = "\x1B\x01";                                    /* Escape and start of heading <ESC><SOH> */\r
39 const static EPS_UINT8 sbEJL[]          = "@EJL";                                                       /* EJL command */\r
40 const static EPS_UINT8 sbEJL_SP[]       = "\x20";                                                       /* Space <SP> */\r
41 const static EPS_UINT8 sbEJL_LF[]       = "\x0A";                                                       /* Line Feed <LF> */\r
42 const static EPS_UINT8 sbEJL_EN[]       = "@EJL""\x20""EN""\x20""LA=ESC/PAGE";          /* EJL ENTER command */\r
43 const static EPS_UINT8 sbEJL_EN_C[]     = "@EJL""\x20""EN""\x20""LA=ESC/PAGE-COLOR";/* EJL ENTER command */\r
44 const static EPS_UINT8 sbEJL_SE[]       = "@EJL""\x20""SE""\x20""LA=ESC/PAGE";          /* EJL SELECT command */\r
45 const static EPS_UINT8 sbEJL_SET[]      = "SET";                                                        /* SET command */\r
46 \r
47 /*---------------------------------  ESC/Page Commands ---------------------------------*/\r
48 /*******************************************|********************************************/\r
49 const static EPS_INT8 sbLOS[]           = "\x1D%d;%dloE";                                       /* Logical Origin setting for 300 dpi(0.2 inch) */\r
50 const static EPS_UINT8 sbCHPAS[]    = {0x1D, '0', 'X'};                                 /* Reset the current absolute X position */\r
51 const static EPS_UINT8 sbCVPAS[]        = {0x1D, '0', 'Y'};                                     /* Reset the current absolute Y position */\r
52 const static EPS_INT8 sbCA[]            = "\x1D""0;0;%d;%dcaE";                         /* Set Clip Area */\r
53 \r
54 \r
55 /*---------------------------  Data Structure Declarations   ---------------------------*/\r
56 /*******************************************|********************************************/\r
57 typedef struct _tagEPS_PAGE_MEDIA_NAME_ {\r
58     EPS_INT32 id;\r
59     const EPS_INT8 *name;\r
60 } EPS_PAGE_MEDIA_NAME;\r
61 \r
62 /*---------------------------  ESC/Page Media Declarations   ---------------------------*/\r
63 /*******************************************|********************************************/\r
64 /* Type */\r
65 const EPS_PAGE_MEDIA_NAME pageMediaType[]  = {\r
66         { EPS_MTID_PLAIN,                       "NM" }\r
67 };\r
68 \r
69 /* Paper Source */\r
70 const EPS_PAGE_MEDIA_NAME pagePaperSource[]  = {\r
71         { EPS_MPID_AUTO,                "AU" },\r
72         { EPS_MPID_MPTRAY,              "MP" },\r
73         { EPS_MPID_FRONT1,              "LC1" },\r
74         { EPS_MPID_FRONT2,              "LC2" },\r
75         { EPS_MPID_FRONT3,              "LC3" },\r
76         { EPS_MPID_FRONT4,              "LC4" }\r
77 };\r
78 \r
79 \r
80 /*----------------------------  ESC/P-R Lib Global Variables  --------------------------*/\r
81 /*******************************************|********************************************/\r
82 extern EPS_CMN_FUNC             epsCmnFnc;\r
83 extern EPS_PRINT_JOB    printJob;\r
84 \r
85 #if 0\r
86 #include "epsmp-make-img.h"     \r
87 static FILE *fp = NULL;\r
88 #endif\r
89 \r
90 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
91 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
92 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
93 /*--------------------              Public Functions               ---------------------*/\r
94 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
95 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
96 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
97 \r
98 /*******************************************|********************************************/\r
99 /*                                                                                      */\r
100 /* Function name:   pageInitJob()                                                                       */\r
101 /*                                                                                      */\r
102 /* Arguments                                                                            */\r
103 /* ---------                                                                            */\r
104 /* Name:                Type:                                   Description:                                    */\r
105 /* jobAttr      const EPS_JOB_ATTRIB*   I: Print Job Attribute                          */\r
106 /*                                                                                      */\r
107 /* Return value:                                                                        */\r
108 /*      << Normal >>                                                                    */\r
109 /*      EPS_ERR_NONE                            - Success                               */\r
110 /*      << Error >>                                                                     */\r
111 /*      EPS_ERR_INVALID_VERSION                 - Invalid structure version             */\r
112 /*      EPS_ERR_INV_COLOR_PLANE                 - Invalid Color Plane                   */\r
113 /*      EPS_ERR_INV_PALETTE_SIZE                - Invalid Palette Size                  */\r
114 /*      EPS_ERR_INV_PALETTE_DATA                - Invalid Palette Data                  */\r
115 /*      EPS_ERR_INV_MEDIA_SIZE                  - Invalid Media Size                    */\r
116 /*      EPS_ERR_INV_MEDIA_TYPE                  - Invalid Media Type                    */\r
117 /*      EPS_ERR_INV_BORDER_MODE                 - Invalid Border Mode                   */\r
118 /*      EPS_ERR_INV_PAPER_SOURCE                - Invalid Paper source                  */\r
119 /*      EPS_ERR_INV_COLOR_MODE                  - Invalid Color Mode                    */\r
120 /*      EPS_ERR_INV_INPUT_RESOLUTION            - Invalid Input Resolution              */\r
121 /*      EPS_ERR_INV_DUPLEX                      - Invalid duplex                        */\r
122 /*      EPS_ERR_INV_FEED_DIRECTION              - Invalid feed direction                */\r
123 /*                                                                                      */\r
124 /* Description:                                                                         */\r
125 /*      Called form epsStartJob. Confirm ESC/Page Job Attribute.                        */\r
126 /*                                                                                      */\r
127 /*******************************************|********************************************/\r
128 EPS_ERR_CODE pageInitJob(\r
129 \r
130                 const EPS_JOB_ATTRIB *jobAttr\r
131                 \r
132 ){\r
133         EPS_INT32 i;\r
134         const EPS_PAGE_MEDIASIZE *mediaSizeEnt = NULL;\r
135 \r
136         EPS_LOG_FUNCIN\r
137 \r
138 /*** Validate input parameters                                                          */\r
139         /*** Structure version                                                              */\r
140         if(EPS_JOB_ATTRIB_VER_3 > jobAttr->version){\r
141                 EPS_RETURN( EPS_ERR_INVALID_VERSION )\r
142         }\r
143 \r
144         /*** Color Plane                                                                    */\r
145         if (! (   (jobAttr->colorPlane         == EPS_CP_FULLCOLOR         ) ||\r
146                           (jobAttr->colorPlane         == EPS_CP_256COLOR          ) ) ){\r
147                 EPS_RETURN( EPS_ERR_INV_COLOR_PLANE )\r
148         }\r
149 \r
150         /*** Media Type                                                                     */\r
151         for( i=0; i < dim(pageMediaType); i++ ) {\r
152                 if( jobAttr->mediaTypeIdx == pageMediaType[i].id ) {\r
153                         break;\r
154                 }\r
155         }\r
156         if(i >= dim(pageMediaType)){\r
157                 EPS_RETURN( EPS_ERR_INV_MEDIA_TYPE )\r
158         }\r
159 \r
160 #if 0\r
161         /*** Print Quality                                                                  */\r
162         if (! (   (jobAttr->printQuality       == EPS_MQID_NORMAL          ) ||\r
163                           (jobAttr->printQuality       == EPS_MQID_HIGH            )    ) ){\r
164                 EPS_RETURN( EPS_ERR_INV_PRINT_QUALITY )\r
165         }\r
166 #endif\r
167         /*** Input Image Resolution                                                         */\r
168     if (! ( (jobAttr->inputResolution    == EPS_IR_150X150 ) ||\r
169                         (jobAttr->inputResolution    == EPS_IR_300X300 ) \r
170 #if !EPS_PAGE_LOWRES_MODE\r
171                         || (jobAttr->inputResolution    == EPS_IR_600X600 )\r
172 #endif\r
173         ) ){\r
174         EPS_RETURN( EPS_ERR_INV_INPUT_RESOLUTION )\r
175         }\r
176 \r
177         /*** Paper Source                                                                   */\r
178         for( i=0; i < dim(pagePaperSource); i++ ) {\r
179                 if( jobAttr->paperSource == pagePaperSource[i].id ) {\r
180                         break;\r
181                 }\r
182         }\r
183         if(i >= dim(pagePaperSource)){\r
184                 EPS_RETURN( EPS_ERR_INV_PAPER_SOURCE )\r
185         }\r
186 \r
187         /*** Border Mode                                                                    */\r
188         if( jobAttr->printLayout != EPS_MLID_BORDERS ){\r
189         EPS_RETURN( EPS_ERR_INV_BORDER_MODE )\r
190         }\r
191 \r
192         /*** Color Mode                                                                     */\r
193     if( !( (jobAttr->colorMode          == EPS_CM_COLOR             ) ||\r
194            (jobAttr->colorMode          == EPS_CM_MONOCHROME        ) ) ){\r
195                 EPS_RETURN( EPS_ERR_INV_COLOR_MODE )\r
196         }\r
197         if( jobAttr->colorMode == EPS_CM_COLOR && \r
198                 printJob.printer->language == EPS_LANG_ESCPAGE){\r
199                 EPS_RETURN( EPS_ERR_INV_COLOR_MODE )\r
200         }\r
201 \r
202         /*** Pallette Data                                                                                                                                      */\r
203         if (jobAttr->colorPlane == EPS_CP_256COLOR) {\r
204                 if (! ((jobAttr->paletteSize       >= 3                        ) &&\r
205                            (jobAttr->paletteSize       <= 768/*765*/               )    ) ){\r
206                         EPS_RETURN( EPS_ERR_INV_PALETTE_SIZE )\r
207                 }\r
208 \r
209                 if (    jobAttr->paletteData       == NULL                     ){\r
210                         EPS_RETURN( EPS_ERR_INV_PALETTE_DATA )\r
211                 }\r
212         }\r
213 \r
214         /*** duplex                                                                         */\r
215         if( !( (jobAttr->duplex             == EPS_DUPLEX_NONE             ) ||\r
216                    (jobAttr->duplex             == EPS_DUPLEX_LONG             ) ||\r
217            (jobAttr->duplex                     == EPS_DUPLEX_SHORT            ) ) ){\r
218                 EPS_RETURN( EPS_ERR_INV_DUPLEX )\r
219         }\r
220 \r
221         /*** Color Mode                                                                     */\r
222         if( !( (jobAttr->feedDirection     == EPS_FEEDDIR_PORTRAIT         ) ||\r
223            (jobAttr->feedDirection     == EPS_FEEDDIR_LANDSCAPE        ) ) ){\r
224                 EPS_RETURN( EPS_ERR_INV_FEED_DIRECTION )\r
225         }\r
226         \r
227 \r
228         memcpy(&printJob.attr, jobAttr, sizeof(printJob.attr));\r
229         if(jobAttr->copies < 0){\r
230                 printJob.attr.copies = 1;\r
231         }\r
232 \r
233         /*** Find the Media by ID                                                           */\r
234         for(i = 0; i < dim(pageMediaSize); i++){\r
235                 if( jobAttr->mediaSizeIdx == pageMediaSize[i].id ){\r
236                         mediaSizeEnt = &pageMediaSize[i];\r
237                         break;\r
238                 }\r
239         }\r
240         if( NULL != mediaSizeEnt){\r
241                 printJob.printableAreaWidth             = mediaSizeEnt->print_area_x_border;\r
242                 printJob.printableAreaHeight    = mediaSizeEnt->print_area_y_border;\r
243                 printJob.topMargin                              = 120;\r
244         printJob.leftMargin                             = 120;\r
245         } else{\r
246                 EPS_RETURN( EPS_ERR_INV_MEDIA_SIZE )\r
247         }\r
248 \r
249         if(EPS_IR_300X300 == jobAttr->inputResolution){\r
250                 printJob.printableAreaWidth             /= 2;\r
251                 printJob.printableAreaHeight    /= 2;\r
252                 printJob.topMargin                              /= 2;\r
253                 printJob.leftMargin                             /= 2;\r
254         } else if(EPS_IR_150X150 == jobAttr->inputResolution){\r
255                 printJob.printableAreaWidth             /= 4;\r
256                 printJob.printableAreaHeight    /= 4;\r
257                 printJob.topMargin                              /= 4;\r
258                 printJob.leftMargin                             /= 4;\r
259         }\r
260 \r
261         printJob.bpp = (printJob.attr.colorPlane == EPS_CP_256COLOR)?1:3;\r
262         printJob.whiteColorValue = memSearchWhiteColorVal(printJob.attr.colorPlane, \r
263                                                                                                         printJob.attr.paletteData,\r
264                                                                                                         printJob.attr.paletteSize);\r
265 \r
266         EPS_RETURN( EPS_ERR_NONE )\r
267 }\r
268 \r
269 \r
270 /*******************************************|********************************************/\r
271 /*                                                                                      */\r
272 /* Function name:   pageAllocBuffer()                                                           */\r
273 /*                                                                                      */\r
274 /* Arguments                                                                            */\r
275 /* ---------                                                                            */\r
276 /* Name:                Type:                                   Description:                                    */\r
277 /* N/A                                                                                                                                                                  */\r
278 /*                                                                                      */\r
279 /* Return value:                                                                        */\r
280 /*      EPS_ERR_NONE                    - Success                                                                               */\r
281 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
282 /*                                                                                      */\r
283 /* Description:                                                                         */\r
284 /*      Allocate buffer for ESC/Page Job.                                                                                               */\r
285 /*                                                                                      */\r
286 /*******************************************|********************************************/\r
287 EPS_ERR_CODE pageAllocBuffer(void)\r
288 {\r
289         EPS_ERR_CODE    ret = EPS_ERR_NONE;\r
290 \r
291         EPS_LOG_FUNCIN\r
292 \r
293 #ifdef GCOMSW_CMD_ESCPAGE_S\r
294         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
295                 ret = pageS_AllocBuffer();\r
296         } else\r
297 #endif\r
298         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
299                 /** ESC/Page-Color **/\r
300                 ret = pageAllocBuffer_C();\r
301         } else{\r
302                 /** ESC/Page **/\r
303                 ret = pageAllocBuffer_M();\r
304         }\r
305 \r
306         EPS_RETURN( ret )\r
307 }\r
308 \r
309 \r
310 /*******************************************|********************************************/\r
311 /*                                                                                      */\r
312 /* Function name:   pageRelaseBuffer()                                                          */\r
313 /*                                                                                      */\r
314 /* Arguments                                                                            */\r
315 /* ---------                                                                            */\r
316 /* Name:                Type:                                   Description:                                    */\r
317 /* N/A                                                                                                                                                                  */\r
318 /*                                                                                      */\r
319 /* Return value:                                                                        */\r
320 /*      N/A                                                                             */\r
321 /*                                                                                      */\r
322 /* Description:                                                                         */\r
323 /*      Free buffer for ESC/Page Job.                                                           */\r
324 /*                                                                                      */\r
325 /*******************************************|********************************************/\r
326 void pageRelaseBuffer(void)\r
327 {\r
328         EPS_LOG_FUNCIN\r
329 \r
330 #ifdef GCOMSW_CMD_ESCPAGE_S\r
331         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
332                 pageS_RelaseBuffer();\r
333         } else\r
334 #endif\r
335         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
336                 /** ESC/Page-Color **/\r
337                 pageRelaseBuffer_C();\r
338         } else{\r
339                 /** ESC/Page **/\r
340                 pageRelaseBuffer_M();\r
341         }\r
342 \r
343         EPS_RETURN_VOID\r
344 }\r
345 \r
346 \r
347 /*******************************************|********************************************/\r
348 /*                                                                                      */\r
349 /* Function name:   pageStartJob()                                                                                                              */\r
350 /*                                                                                      */\r
351 /* Arguments                                                                            */\r
352 /* ---------                                                                            */\r
353 /* Name:                Type:                                   Description:                                    */\r
354 /* N/A                                                                                                                                                                  */\r
355 /*                                                                                      */\r
356 /* Return value:                                                                        */\r
357 /*      EPS_ERR_NONE                    - Success                                                                               */\r
358 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
359 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
360 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
361 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
362 /*                                                                                      */\r
363 /* Description:                                                                         */\r
364 /*      Send ESC/Page start job commands.                                                               */\r
365 /*                                                                                      */\r
366 /*******************************************|********************************************/\r
367 EPS_ERR_CODE pageStartJob(void)\r
368 {\r
369         EPS_ERR_CODE    ret = EPS_ERR_NONE;\r
370 \r
371         EPS_LOG_FUNCIN\r
372 \r
373 #ifdef GCOMSW_CMD_ESCPAGE_S\r
374         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
375                 ret = pageS_StartJob();\r
376         } else\r
377 #endif\r
378         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
379                 /** ESC/Page-Color **/\r
380                 ret = pageStartJob_C();\r
381         } else{\r
382                 /** ESC/Page **/\r
383                 ret = pageStartJob_M();\r
384         }\r
385 \r
386         EPS_RETURN( ret )\r
387 }\r
388 \r
389 \r
390 /*******************************************|********************************************/\r
391 /*                                                                                      */\r
392 /* Function name:   pageEndJob()                                                                                                                */\r
393 /*                                                                                      */\r
394 /* Arguments                                                                            */\r
395 /* ---------                                                                            */\r
396 /* Name:                Type:                                   Description:                                    */\r
397 /* N/A                                                                                                                                                                  */\r
398 /*                                                                                      */\r
399 /* Return value:                                                                        */\r
400 /*      EPS_ERR_NONE                    - Success                                                                               */\r
401 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
402 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
403 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
404 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
405 /*                                                                                      */\r
406 /* Description:                                                                         */\r
407 /*      Send ESC/Page end job commands.                                                                 */\r
408 /*                                                                                      */\r
409 /*******************************************|********************************************/\r
410 EPS_ERR_CODE pageEndJob()\r
411 {\r
412         EPS_ERR_CODE    ret = EPS_ERR_NONE;           /* Return status of internal calls  */\r
413 \r
414         EPS_LOG_FUNCIN\r
415 \r
416 #ifdef GCOMSW_CMD_ESCPAGE_S\r
417         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
418                 ret = pageS_EndJob();\r
419         } else\r
420 #endif  \r
421         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
422                 /** ESC/Page-Color **/\r
423                 ret = pageEndJob_C();\r
424         } else{\r
425                 /** ESC/Page **/\r
426                 ret = pageEndJob_M();\r
427         }\r
428 \r
429         EPS_RETURN( ret )\r
430 }\r
431 \r
432 \r
433 /*******************************************|********************************************/\r
434 /*                                                                                      */\r
435 /* Function name:   pageStartPage()                                                                                                             */\r
436 /*                                                                                      */\r
437 /* Arguments                                                                            */\r
438 /* ---------                                                                            */\r
439 /* Name:                Type:                                   Description:                                    */\r
440 /* N/A                                                                                                                                                                  */\r
441 /*                                                                                      */\r
442 /* Return value:                                                                        */\r
443 /*      EPS_ERR_NONE                    - Success                                                                               */\r
444 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
445 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
446 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
447 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
448 /*                                                                                      */\r
449 /* Description:                                                                         */\r
450 /*      Send ESC/Page start page commands.                                                                  */\r
451 /*                                                                                      */\r
452 /*******************************************|********************************************/\r
453 EPS_ERR_CODE pageStartPage()\r
454 {\r
455         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
456 \r
457         EPS_LOG_FUNCIN\r
458 \r
459 #ifdef GCOMSW_CMD_ESCPAGE_S\r
460         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
461                 ret = pageS_StartPage();\r
462         } else\r
463 #endif\r
464         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
465                 /** ESC/Page-Color **/\r
466                 ret = pageStartPage_C();\r
467         } else{\r
468                 /** ESC/Page **/\r
469                 ret = pageStartPage_M();\r
470         }\r
471 \r
472         EPS_RETURN( ret )\r
473 }\r
474 \r
475 \r
476 /*******************************************|********************************************/\r
477 /*                                                                                      */\r
478 /* Function name:   pageEndPage()                                                                                                               */\r
479 /*                                                                                      */\r
480 /* Arguments                                                                            */\r
481 /* ---------                                                                            */\r
482 /* Name:                Type:                                   Description:                                    */\r
483 /* N/A                                                                                                                                                                  */\r
484 /*                                                                                      */\r
485 /* Return value:                                                                        */\r
486 /*      EPS_ERR_NONE                    - Success                                                                               */\r
487 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
488 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
489 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
490 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
491 /*                                                                                      */\r
492 /* Description:                                                                         */\r
493 /*      Send ESC/Page end page commands.                                                                    */\r
494 /*                                                                                      */\r
495 /*******************************************|********************************************/\r
496 EPS_ERR_CODE pageEndPage()\r
497 {\r
498         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
499 \r
500         EPS_LOG_FUNCIN\r
501 \r
502 #ifdef GCOMSW_CMD_ESCPAGE_S\r
503         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
504                 ret = pageS_EndPage();\r
505         } else\r
506 #endif\r
507         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
508                 /** ESC/Page-Color **/\r
509                 ret = pageEndPage_C();\r
510         }\r
511 \r
512         EPS_RETURN( ret )\r
513 }\r
514 \r
515 \r
516 /*******************************************|********************************************/\r
517 /*                                                                                      */\r
518 /* Function name:   pageColorRow()                                                                                                              */\r
519 /*                                                                                      */\r
520 /* Arguments                                                                            */\r
521 /* ---------                                                                            */\r
522 /* Name:                Type:                                   Description:                                    */\r
523 /* N/A                                                                                                                                                                  */\r
524 /*                                                                                      */\r
525 /* Return value:                                                                        */\r
526 /*      EPS_ERR_NONE                    - Success                                                                               */\r
527 /*      EPS_ERR_MEMORY_ALLOCATION       - Fail to memory allocation                     */\r
528 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
529 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
530 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
531 /*                                                                                      */\r
532 /* Description:                                                                         */\r
533 /*      Send ESC/Page raster commands.                                                                      */\r
534 /*                                                                                      */\r
535 /*******************************************|********************************************/\r
536 EPS_ERR_CODE pageColorRow(        \r
537                                                   \r
538                 const EPS_BANDBMP*  pInBmp,\r
539         EPS_RECT*           pBandRec\r
540 \r
541 ){\r
542         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
543 \r
544         EPS_LOG_FUNCIN\r
545 \r
546 #ifdef GCOMSW_CMD_ESCPAGE_S\r
547         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
548                 ret = pageS_ColorRow(pInBmp, pBandRec);\r
549         } else\r
550 #endif\r
551         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
552                 /** ESC/Page-Color **/\r
553                 ret = pageColorRow_C(pInBmp, pBandRec);\r
554         } else{\r
555                 /** ESC/Page **/\r
556                 ret = pageColorRow_M(pInBmp, pBandRec);\r
557         }\r
558 \r
559         EPS_RETURN( ret )\r
560 }\r
561 \r
562 \r
563 /*******************************************|********************************************/\r
564 /*                                                                                      */\r
565 /* Function name:   pageSendLeftovers()                                                                                                 */\r
566 /*                                                                                      */\r
567 /* Arguments                                                                            */\r
568 /* ---------                                                                            */\r
569 /* Name:                Type:                                   Description:                                    */\r
570 /* N/A                                                                                                                                                                  */\r
571 /*                                                                                      */\r
572 /* Return value:                                                                        */\r
573 /*      EPS_ERR_NONE                    - Success                                                                               */\r
574 /*      EPS_ERR_INVALID_CALL            - This call was unnecessary                     */\r
575 /*      EPS_ERR_OPR_FAIL                - Internal Error                                */\r
576 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
577 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
578 /*                                                                                      */\r
579 /* Description:                                                                         */\r
580 /*      send leftovers data.                                                            */\r
581 /*                                                                                      */\r
582 /*******************************************|********************************************/\r
583 EPS_ERR_CODE pageSendLeftovers(\r
584                                                            \r
585                    void\r
586                                                            \r
587 ){\r
588         EPS_ERR_CODE    ret = EPS_ERR_NONE;\r
589 \r
590         EPS_LOG_FUNCIN\r
591 \r
592 #ifdef GCOMSW_CMD_ESCPAGE_S\r
593         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
594                 ret = pageS_SendLeftovers();\r
595         } else\r
596 #endif\r
597         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
598                 /** ESC/Page-Color **/\r
599                 ret = pageSendLeftovers_C();\r
600         } else{\r
601                 /** ESC/Page **/\r
602                 ret = pageSendLeftovers_M();\r
603         }\r
604         \r
605         EPS_RETURN( ret )\r
606 }\r
607 \r
608 \r
609 EPS_ERR_CODE pageCreateMediaInfo (\r
610 \r
611                 EPS_PRINTER_INN*        printer,\r
612                 EPS_UINT8*                      pmString,\r
613                 EPS_INT32                       pmSize\r
614 \r
615 ){\r
616         EPS_INT32               num_mSize = dim(pageMediaSize);\r
617     EPS_INT32       num_mType = dim(pageMediaType);\r
618         EPS_INT32               i, j, n;\r
619     EPS_MEDIA_SIZE*     sizeList = NULL;\r
620         EPS_MEDIA_TYPE* typeList = NULL;\r
621         EPS_UINT32 paperSource = EPS_MPID_ALL_ESCPAGE;\r
622 \r
623         EPS_LOG_FUNCIN\r
624 \r
625         memset(&printer->supportedMedia, 0, sizeof(EPS_SUPPORTED_MEDIA));\r
626 \r
627     /* Allocate memory for the media size list. */\r
628     sizeList = (EPS_MEDIA_SIZE*)EPS_ALLOC( sizeof(EPS_MEDIA_SIZE) * num_mSize );   \r
629     if( sizeList == NULL ){\r
630         EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )\r
631     }\r
632 \r
633     /* Allocate memory for the media type array. */\r
634     typeList = (EPS_MEDIA_TYPE*)EPS_ALLOC( sizeof(EPS_MEDIA_TYPE) * num_mSize * num_mType );\r
635     if (typeList == NULL) {\r
636         EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )\r
637     }\r
638 \r
639         if( sizeof(EPS_UINT32) == pmSize ){\r
640                 memcpy(&paperSource, pmString, sizeof(EPS_UINT32));\r
641         }\r
642 \r
643     /* set media size property. */\r
644         for(i = 0; i < num_mSize; i++){\r
645                 /* set media type property. */\r
646                 for(j = 0; j < num_mType; j++){\r
647                         n = i * num_mType + j;\r
648                         typeList[n].mediaTypeID = pageMediaType[j].id;\r
649                         typeList[n].paperSource = paperSource;\r
650                         typeList[n].layout              = EPS_MLID_BORDERS;\r
651 #if EPS_PAGE_LOWRES_MODE\r
652                         typeList[n].quality             = EPS_MQID_DRAFT | EPS_MQID_NORMAL;\r
653 #else\r
654                         typeList[n].quality             = EPS_MQID_DRAFT | EPS_MQID_NORMAL | EPS_MQID_HIGH;\r
655 #endif\r
656 \r
657                         if(EPS_MSID_POSTCARD == pageMediaSize[i].id){\r
658                                 typeList[n].duplex = EPS_DUPLEX_DISABLE;\r
659                         } else{\r
660                                 typeList[n].duplex = EPS_DUPLEX_ENABLE;\r
661                         }\r
662                 }\r
663     \r
664                 sizeList[i].mediaSizeID = pageMediaSize[i].id;\r
665                 sizeList[i].numTypes    = num_mType;\r
666                 sizeList[i].typeList    = &typeList[i];\r
667         }\r
668 \r
669         printer->supportedMedia.sizeList = sizeList;\r
670     printer->supportedMedia.numSizes = num_mSize;\r
671 \r
672 #if EPS_PAGE_LOWRES_MODE\r
673         printer->supportedMedia.resolution = EPS_IR_150X150 | EPS_IR_300X300;\r
674 #else\r
675         printer->supportedMedia.resolution = EPS_IR_150X150 | EPS_IR_300X300 | EPS_IR_600X600;\r
676 #endif\r
677 \r
678 #if GCOMSW_CMD_ESCPAGE_S\r
679         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
680                 pageS_UpdateSupportedMedia( &printer->supportedMedia );\r
681         }\r
682 #endif\r
683 \r
684         EPS_RETURN( EPS_ERR_NONE )\r
685 }\r
686 \r
687 \r
688 void pageClearSupportedMedia    (\r
689                                                                  \r
690                 EPS_PRINTER_INN* printer                                \r
691                 \r
692 ){\r
693         EPS_LOG_FUNCIN\r
694 \r
695         if( NULL != printer->supportedMedia.sizeList ){\r
696                 EPS_SAFE_RELEASE(printer->supportedMedia.sizeList[0].typeList);\r
697                 EPS_SAFE_RELEASE(printer->supportedMedia.sizeList);\r
698         }\r
699 \r
700         EPS_RETURN_VOID\r
701 }\r
702 \r
703 \r
704 EPS_ERR_CODE    pageGetPrintableArea (\r
705 \r
706         EPS_JOB_ATTRIB*     jobAttr,\r
707         EPS_UINT32*         printableWidth,\r
708         EPS_UINT32*         printableHeight\r
709 \r
710 ){\r
711         EPS_ERR_CODE    ret = EPS_ERR_NONE;\r
712         EPS_INT32               num_mSize = dim(pageMediaSize);\r
713         EPS_INT32               sizeIdx = 0;\r
714 \r
715         EPS_LOG_FUNCIN\r
716 \r
717 /*** Validate/Confirm Page Attribute Data                                               */\r
718     /*** Media Size                                                                     */\r
719         for(sizeIdx = 0; sizeIdx < num_mSize; sizeIdx++){\r
720                 if(pageMediaSize[sizeIdx].id == jobAttr->mediaSizeIdx){\r
721                         break;\r
722                 }\r
723         }\r
724         if(sizeIdx >= num_mSize){\r
725         EPS_RETURN( EPS_ERR_INV_MEDIA_SIZE )\r
726         }\r
727 \r
728     /*** Border Mode                                                                    */\r
729         if( jobAttr->printLayout != EPS_MLID_BORDERS ){\r
730         EPS_RETURN( EPS_ERR_INV_BORDER_MODE )\r
731         }\r
732 \r
733     /*** Input Image Resolution                                                         */\r
734     if (! ( (jobAttr->inputResolution    == EPS_IR_150X150 ) ||\r
735                         (jobAttr->inputResolution    == EPS_IR_300X300 ) ||\r
736                         (jobAttr->inputResolution    == EPS_IR_600X600 ) ) ){\r
737         EPS_RETURN( EPS_ERR_INV_INPUT_RESOLUTION )\r
738         }\r
739 \r
740         *printableWidth         = pageMediaSize[sizeIdx].print_area_x_border;\r
741         *printableHeight        = pageMediaSize[sizeIdx].print_area_y_border;\r
742 #ifdef GCOMSW_CMD_ESCPAGE_S\r
743         if(printJob.printer && EPS_LANG_ESCPAGE_S == printJob.printer->language){\r
744                 pageS_FeedExchange(jobAttr, printableWidth, printableHeight);\r
745         }\r
746 #endif\r
747 \r
748         if(EPS_IR_300X300 == jobAttr->inputResolution){\r
749                 *printableWidth  /= 2;\r
750                 *printableHeight /= 2;\r
751         } else if(EPS_IR_150X150 == jobAttr->inputResolution){\r
752                 *printableWidth  /= 4;\r
753                 *printableHeight /= 4;\r
754                 *printableHeight -= 2;\r
755         }\r
756 \r
757         EPS_RETURN( ret )\r
758 }\r
759 \r
760 \r
761 EPS_ERR_CODE ejlStart   (\r
762                                                          \r
763                 EPS_COMMAND_BUFFER *pCmdBuff, \r
764                 PAGE_CmdBuffGrow pfncGrow\r
765                 \r
766 ){\r
767         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
768         EPS_INT32       i;\r
769         EPS_INT8        *p;\r
770 \r
771         EPS_LOG_FUNCIN\r
772 \r
773 #define EJLStart_ADDSTR(b, p, v)        \\r
774         {                                                               \\r
775                 sprintf(b, " %s=%s", p, v);     \\r
776                 b += strlen(b);                         \\r
777         }\r
778 #define EJLStart_ADDINT(b, p, v)        \\r
779         {                                                               \\r
780                 sprintf(b, " %s=%d", p, v);     \\r
781                 b += strlen(b);                         \\r
782         }\r
783 \r
784 #ifdef GCOMSW_DEBUG\r
785         if(pCmdBuff->len+EPS_EJL_LINEMAX > pCmdBuff->size){EPS_DBGPRINT(("Command buffer not enough!\r\n"))}\r
786 #endif\r
787 \r
788         p = pCmdBuff->p + pCmdBuff->len;\r
789 \r
790         /*** EJL commands ***/\r
791         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
792                 /** ESC/Page-Color **/\r
793                 sprintf(p, "%s%s \x0A%s\x0A%s %s",\r
794                         sbEJL_ESC_SOH,  /* <ESC><SOH>                   */\r
795                         sbEJL,                  /* @EJL                                 */\r
796                         sbEJL_SE,               /* EJL SELECT command   */\r
797                         sbEJL,                  /* @EJL                                 */\r
798                         sbEJL_SET);             /* SET command                  */\r
799         } else{\r
800                 /** ESC/Page **/\r
801                 sprintf(p, "%s%s \x0A%s\x0A%s%s \x0A%s\x0A%s %s",\r
802                         sbEJL_ESC_SOH,  /* <ESC><SOH>                   */\r
803                         sbEJL,                  /* @EJL                                 */\r
804                         sbEJL_EN,               /* EJL ENTER command    */\r
805                         sbEJL_ESC_SOH,  /* <ESC><SOH>                   */\r
806                         sbEJL,                  /* @EJL                                 */\r
807                         sbEJL_SE,               /* EJL SELECT command   */\r
808                         sbEJL,                  /* @EJL                                 */\r
809                         sbEJL_SET);             /* SET command                  */\r
810         }\r
811         p += strlen(p);\r
812 \r
813         /* RS */\r
814         EJLStart_ADDSTR(p, "RS", \r
815                         (EPS_IR_600X600 == printJob.attr.inputResolution)?"FN":"QK" );\r
816 \r
817         /* PS */\r
818         for( i=0; i < dim(pageMediaSize); i++ ) {\r
819                 if( printJob.attr.mediaSizeIdx == pageMediaSize[i].id ) {\r
820                         break;\r
821                 }\r
822         }\r
823         EJLStart_ADDSTR(p, "PS", pageMediaSize[i].name);\r
824 \r
825         /* PK */\r
826         for( i=0; i < dim(pageMediaType); i++ ) {\r
827                 if( printJob.attr.mediaTypeIdx == pageMediaType[i].id ) {\r
828                         break;\r
829                 }\r
830         }\r
831         EJLStart_ADDSTR(p, "PK", pageMediaType[i].name);\r
832 \r
833         /* PU */\r
834         for( i=0; i < dim(pagePaperSource); i++ ) {\r
835                 if( printJob.attr.paperSource == pagePaperSource[i].id ) {\r
836                         break;\r
837                 }\r
838         }\r
839         EJLStart_ADDSTR(p, "PU", pagePaperSource[i].name);\r
840 \r
841         /* OU */\r
842 #if EPS_PAGE_OUTUNIT_FACEDOWN\r
843         EJLStart_ADDSTR(p, "OU", "FD");\r
844 #else\r
845         EJLStart_ADDSTR(p, "OU", "FU");\r
846 #endif\r
847 \r
848         /* DX */\r
849         EJLStart_ADDSTR(p, "DX", ( printJob.attr.duplex != EPS_DUPLEX_NONE )?"ON":"OFF");\r
850 \r
851         if( printJob.attr.duplex != EPS_DUPLEX_NONE ) {\r
852                 /* BD */\r
853                 EJLStart_ADDSTR(p, "BD", ( printJob.attr.duplex == EPS_DUPLEX_LONG )?"LE":"SE");\r
854 \r
855                 /* TB/LB */\r
856                 EJLStart_ADDSTR(p, "TB", "0");\r
857                 EJLStart_ADDSTR(p, "LB", "0");\r
858         } \r
859 \r
860         /* ZO */\r
861         EJLStart_ADDSTR(p, "ZO", "OFF");\r
862 \r
863         /* EC */\r
864         EJLStart_ADDSTR(p, "EC", "ON" );\r
865 \r
866         /* RI */\r
867 #if EPS_PAGE_RIT\r
868         EJLStart_ADDSTR(p, "RI", "ON");\r
869 #else\r
870         EJLStart_ADDSTR(p, "RI", "OFF");\r
871 #endif\r
872 \r
873         /* SN */\r
874 #if EPS_PAGE_TONER_SAVE\r
875         EJLStart_ADDSTR(p, "SN", "ON");\r
876 #else\r
877         EJLStart_ADDSTR(p, "SN", "OFF");\r
878 #endif\r
879 \r
880         /* Collate */\r
881 #if 0\r
882         if( printJob.attr.collate ) {\r
883                 /* CO */\r
884                 EJLStart_ADDINT(p, "CO", 1);\r
885                 /* QT */\r
886                 EJLStart_ADDINT(p, "QT", printJob.attr.copies);\r
887         } else {\r
888 #endif\r
889                 /* CO */\r
890                 EJLStart_ADDINT(p, "CO", printJob.attr.copies);\r
891                 /* QT */\r
892                 EJLStart_ADDINT(p, "QT", 1);\r
893 /*      }*/\r
894 \r
895         /* Feed direction */\r
896         if( EPS_FEEDDIR_LANDSCAPE == printJob.attr.feedDirection ){\r
897                 EJLStart_ADDSTR(p, "FE", "SE");\r
898         } \r
899 \r
900         if( EPS_CM_COLOR == printJob.attr.colorMode ){\r
901                 /** ESC/Page-Color **/\r
902                 /* SZ */\r
903                 EJLStart_ADDSTR(p, "SZ", "OFF");\r
904 \r
905                 /* GAMMAMODE */\r
906                 EJLStart_ADDSTR(p, "GAMMAMODE", "NORMAL");\r
907 \r
908                 /* SL */\r
909                 EJLStart_ADDSTR(p, "SL", "YES");\r
910 \r
911                 /* TO */\r
912                 EJLStart_ADDSTR(p, "TO", "0");\r
913 \r
914                 /* LO */\r
915                 EJLStart_ADDSTR(p, "LO", "0");\r
916 \r
917                 /* OR  */\r
918                 EJLStart_ADDSTR(p, "OR", "PO");\r
919 \r
920                 /* EJL ENTER command */\r
921                 sprintf(p, " %s%s%s", sbEJL_LF, sbEJL_EN_C, sbEJL_LF);\r
922         } else{\r
923                 /* FO */\r
924                 EJLStart_ADDSTR(p, "FO", "OFF");\r
925 \r
926                 /* EJL ENTER command */\r
927                 sprintf(p, " %s%s%s", sbEJL_LF, sbEJL_EN, sbEJL_LF);\r
928         }\r
929 \r
930         p += strlen(p);\r
931         pCmdBuff->len += (EPS_INT32)(p - pCmdBuff->p);\r
932 \r
933         EPS_RETURN( ret )\r
934 }\r
935 \r
936 \r
937 EPS_ERR_CODE ejlEnd (\r
938                                                    \r
939                 EPS_COMMAND_BUFFER *pCmdBuff, \r
940                 PAGE_CmdBuffGrow        pfncGrow,\r
941                 EPS_INT32                       pageCount\r
942                 \r
943 ){\r
944         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
945         EPS_UINT32      dwPaperNum = pageCount;\r
946         EPS_INT8        *p;\r
947 \r
948         EPS_LOG_FUNCIN\r
949 \r
950 #ifdef GCOMSW_DEBUG\r
951         if(pCmdBuff->len+EPS_EJL_LINEMAX > pCmdBuff->size){EPS_DBGPRINT(("Command buffer not enough!\r\n"))}\r
952 #endif\r
953 \r
954         p = pCmdBuff->p + pCmdBuff->len;\r
955 \r
956         /* EJL commands -------- */\r
957         sprintf(p, "%s%s ",\r
958                         sbEJL_ESC_SOH,  /* <ESC><SOH>    */\r
959                         sbEJL);                 /* @EJL                  */\r
960         p += strlen(p);\r
961 \r
962         /* Page */\r
963         if( printJob.attr.duplex != EPS_DUPLEX_NONE ){\r
964                 dwPaperNum = (pageCount+1)/2;\r
965         } \r
966         sprintf(p, "JI PAGES=\"%d\"", dwPaperNum);\r
967         p += strlen(p);\r
968 \r
969         /* @EJL */\r
970         sprintf(p, " %s%s %s", sbEJL_LF, sbEJL, sbEJL_LF);\r
971         p += strlen(p);\r
972 \r
973         pCmdBuff->len = (EPS_INT32)(p - pCmdBuff->p);\r
974 \r
975 #ifdef GCOMSW_DEBUG\r
976         if(pCmdBuff->len > pCmdBuff->size){EPS_DBGPRINT(("Command buffer over flow!!\r\n"))}\r
977 #endif\r
978 \r
979         EPS_RETURN( ret )\r
980 }\r
981 \r
982 \r
983 EPS_ERR_CODE ejlPageEsc (\r
984 \r
985                 EPS_COMMAND_BUFFER *pCmdBuff, \r
986                 PAGE_CmdBuffGrow        pfncGrow\r
987                                                            \r
988 ){\r
989         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
990         EPS_INT8        *p;\r
991 \r
992         EPS_LOG_FUNCIN\r
993 \r
994 #define PageEscCommand_ADDCMD(b, CMD) {         \\r
995                 memcpy(b, CMD, sizeof(CMD));            \\r
996                 b += sizeof(CMD);                                       \\r
997         }\r
998 \r
999         p = pCmdBuff->p + pCmdBuff->len;\r
1000 \r
1001         /* Set Logical Origin Setting */\r
1002         sprintf(p, sbLOS, printJob.leftMargin, printJob.topMargin);\r
1003         p += strlen(p);\r
1004 \r
1005         /* Reset the current absolute position */\r
1006         PageEscCommand_ADDCMD(p, sbCHPAS);\r
1007         PageEscCommand_ADDCMD(p, sbCVPAS);\r
1008 \r
1009         /* Set Clip Area */\r
1010         sprintf(p, sbCA, printJob.printableAreaWidth, printJob.printableAreaHeight);\r
1011         p += strlen(p);\r
1012 \r
1013         pCmdBuff->len = (EPS_INT32)(p - pCmdBuff->p);\r
1014 \r
1015         EPS_RETURN( ret )\r
1016 }\r
1017 \r
1018 /*__________________________________  epson-escpage.c   ________________________________*/\r
1019 \r
1020 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
1021 /*       1         2         3         4         5         6         7         8        */\r
1022 /*******************************************|********************************************/\r
1023 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
1024 /***** End of File *** End of File *** End of File *** End of File *** End of File ******/\r
1025 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r