Tizen 2.0 Release
[external/epson-laser-printer-escpage.git] / lib / epson-layout.c
1 /*_________________________________   epson-layout.c   _________________________________*/\r
2 \r
3 /*       1         2         3         4         5         6         7         8        */\r
4 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
5 /*******************************************|********************************************/\r
6 /*\r
7  *   Copyright (c) 2009  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 /*                                                                                      */\r
18 /*                                Extent Layout Module                                  */\r
19 /*                                                                                      */\r
20 /*                                Public Function Calls                                 */\r
21 /*                              --------------------------                              */\r
22 /*      EPS_ERR_CODE elAppendQRCode             (qrcode                                 );      */\r
23 /*              EPS_ERR_CODE elComposeQrcode    (pSrc, pDst, bpp, pRec                  );      */\r
24 /*      EPS_ERR_CODE elCDClipping           (pSrc, pDst, bpp, pRec                  );      */\r
25 /*                                                                                      */\r
26 /*******************************************|********************************************/\r
27 \r
28 /*------------------------------------  Includes   -------------------------------------*/\r
29 /*******************************************|********************************************/\r
30 #include "epson-escpr-def.h"\r
31 #include "epson-escpr-err.h"\r
32 #include "epson-escpr-media.h"\r
33 #include "epson-escpr-mem.h"\r
34 #include "epson-layout.h"\r
35 \r
36 /*-----------------------------  Local Macro Definitions -------------------------------*/\r
37 /*******************************************|********************************************/\r
38 #ifdef EPS_LOG_MODULE_ELT\r
39 #define EPS_LOG_MODULE EPS_LOG_MODULE_ELT\r
40 #else\r
41 #define EPS_LOG_MODULE 0\r
42 #endif\r
43 \r
44 /*----------------------------  ESC/P-R Lib Global Variables  --------------------------*/\r
45 /*******************************************|********************************************/\r
46 \r
47         /*** Extern Function                                                                */\r
48 extern EPS_CMN_FUNC    epsCmnFnc;\r
49 \r
50     /*** Print Job Structure                                                            */\r
51     /*** -------------------------------------------------------------------------------*/\r
52 extern EPS_PRINT_JOB   printJob;\r
53 \r
54 \r
55 /*---------------------------  Data Structure Declarations   ---------------------------*/\r
56 /*******************************************|********************************************/\r
57 \r
58 \r
59 /*--------------------------  Local Functions Declaration   ----------------------------*/\r
60 /*******************************************|********************************************/\r
61 static EPS_UINT32 isqrt(EPS_UINT32 x);\r
62 \r
63 \r
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
65 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
66 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
67 /*--------------------              Public Functions               ---------------------*/\r
68 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
69 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
70 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
71 \r
72 /*******************************************|********************************************/\r
73 /*                                                                                      */\r
74 /* Function name:   elGetDots()                                                             */\r
75 /*                                                                                      */\r
76 /* Arguments                                                                            */\r
77 /* ---------                                                                            */\r
78 /* Name:        Type:               Description:                                        */\r
79 /* resolution   EPS_UINT8                       I: resolution                                       */\r
80 /* length       EPS_INT32           I: length                                                   */\r
81 /*                                                                                      */\r
82 /* Return value:                                                                        */\r
83 /*      Dot num                                                                         */\r
84 /*                                                                                      */\r
85 /* Description:                                                                         */\r
86 /*      calc the number of the dots in the resolution.                                  */\r
87 /*                                                                                      */\r
88 /*******************************************|********************************************/\r
89 EPS_INT32     elGetDots (\r
90 \r
91         EPS_UINT8 resolution, \r
92                 EPS_FLOAT millimeter\r
93 \r
94 ){\r
95         EPS_INT32 dots = 0;\r
96 \r
97         if(resolution == EPS_IR_360X360){       /* EPS_IR_360X360 == 0 */\r
98                 dots = (EPS_INT32)(millimeter * 14.1732);       /* 0.03937 * 360 = 14.1732 */\r
99         } else if( resolution & EPS_IR_720X720 ){\r
100                 dots = (EPS_INT32)(millimeter * 28.3464);       /* 0.03937 * 720 = 28.3464 */\r
101         } else if( resolution & EPS_IR_300X300 ){\r
102                 dots = (EPS_INT32)(millimeter * 11.811);        /* 0.03937 * 300 = 11.811 */\r
103         } else if( resolution & EPS_IR_1200X1200 ){\r
104                 dots = (EPS_INT32)(millimeter * 47.244);        /* 0.03937 * 1200 = 23.622 */\r
105         } else if( resolution & EPS_IR_600X600 ){\r
106                 dots = (EPS_INT32)(millimeter * 23.622);        /* 0.03937 * 600 = 23.622 */\r
107         } else{\r
108                 /* default 360dpi */\r
109                 dots = (EPS_INT32)(millimeter * 14.1732);       /* 0.03937 * 360 = 14.1732 */\r
110         }\r
111 \r
112         return dots;\r
113 }\r
114 \r
115 \r
116 #ifdef GCOMSW_EL_CDLABEL\r
117 /*******************************************|********************************************/\r
118 /*                                                                                      */\r
119 /* Function name:   elCDClipping()                                                      */\r
120 /*                                                                                      */\r
121 /* Arguments                                                                            */\r
122 /* ---------                                                                            */\r
123 /* Name:        Type:               Description:                                        */\r
124 /* pSrc         const EPS_UINT8*    I: source buffer                                    */\r
125 /* pDst         EPS_UINT8*          O: destination buffer                               */\r
126 /* bpp          EPS_UINT8           I: byte per pixel                                   */\r
127 /* pRec         EPS_RECT*           I/O: byte per pixel                                 */\r
128 /*                                                                                      */\r
129 /* Return value:                                                                        */\r
130 /*      None                                                                            */\r
131 /*                                                                                      */\r
132 /* Description:                                                                         */\r
133 /*      clip band line to cd label                                                      */\r
134 /*                                                                                      */\r
135 /*******************************************|********************************************/\r
136 EPS_ERR_CODE     elCDClipping (\r
137 \r
138         const EPS_UINT8* pSrc,\r
139         EPS_UINT8*       pDst,\r
140         EPS_UINT8        bpp,\r
141         EPS_RECT*        pRec\r
142 \r
143 ){\r
144 #define GET_RADIUS(mm)          (EPS_INT32)(elGetDots(printJob.attr.inputResolution, mm)/2)\r
145 #define X_OF_SECANT(r, y)   ((EPS_INT32)isqrt((r-y) * (r+y)))\r
146 \r
147         EPS_LINE_SEGMENT segOut, segIn;\r
148         EPS_INT32 rOut = GET_RADIUS(printJob.attr.cdDimOut);\r
149         EPS_INT32 rIn  = GET_RADIUS(printJob.attr.cdDimIn);\r
150         EPS_INT32 y    = 0;\r
151     EPS_UINT32 wOut = 0;\r
152     EPS_UINT32 wIn = 0;\r
153 \r
154         EPS_LOG_FUNCIN;\r
155 \r
156         /* calc clipping segment */\r
157         y = rOut - pRec->top;\r
158     if(y <= 0) {\r
159         y -= -1;\r
160     }\r
161 \r
162     wOut = X_OF_SECANT(rOut, y);\r
163         segOut.start = rOut - wOut;\r
164         segOut.length = wOut * 2;\r
165 \r
166     if(y <= rIn && y >= -rIn) {\r
167         wIn = X_OF_SECANT(rIn, y);\r
168                 segIn.start = wOut - wIn;\r
169                 segIn.length = wIn * 2;\r
170         } else{\r
171                 segIn.start = \r
172                 segIn.length = 0;\r
173         }\r
174 \r
175 /*      EPS_DBGPRINT((" (%04d - %04d) (%04d - %04d)\n",\r
176                 segOut.start, segOut.length,\r
177                 segIn.start, segIn.length));\r
178 */\r
179         /* outside clip */\r
180         memcpy(pDst, pSrc + segOut.start * bpp, segOut.length * bpp);\r
181 \r
182         /* inside mask  */\r
183         if( 0 < segIn.start){\r
184                 memset(pDst + segIn.start * bpp, 0xFF, segIn.length * bpp);\r
185         }\r
186 \r
187         pRec->left = segOut.start;\r
188         pRec->right = segOut.start + segOut.length;\r
189 \r
190     EPS_RETURN( EPS_ERR_NONE );\r
191 }\r
192 \r
193 static EPS_UINT32 isqrt(EPS_UINT32 x) \r
194\r
195     EPS_INT32   b = 15;         /* this is the next bit we try                                                          */\r
196     EPS_UINT32  r = 0;          /* r will contain the result                                                            */\r
197     EPS_UINT32  r2= 0;          /* here we maintain r squared                                                           */\r
198 \r
199     while(b>=0)  \r
200     { \r
201         EPS_UINT32 sr2=r2; \r
202         EPS_UINT32 sr=r; \r
203                     /* compute (r+(1<<b))**2, we have r**2 already. */\r
204         r2 += (EPS_UINT32)((r<<(1+b))+(1<<(b+b)));       \r
205         r  += (EPS_UINT32)(1<<b); \r
206         if (r2>x)  \r
207         { \r
208             r=sr; \r
209             r2=sr2; \r
210         } \r
211         b--; \r
212     } \r
213     return r; \r
214 }\r
215 #endif /* GCOMSW_EL_CDLABEL */\r
216 \r
217 /*_________________________________   epson-layout.c   _________________________________*/\r
218 \r
219 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
220 /*       1         2         3         4         5         6         7         8        */\r
221 /*******************************************|********************************************/\r
222 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
223 /***** End of File *** End of File *** End of File *** End of File *** End of File ******/\r
224 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
225 \r