2 * DIB Engine Font Primitives
4 * Copyright 2009 Massimo Del Fedele
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/port.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(dibdrv
);
28 /* ------------------------------------------------------------*/
29 /* FREETYPE FONT BITMAP BLITTING */
30 void _DIBDRV_freetype_blit_8888(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
32 /* FIXME : MUST BE OPTIMIZED !!! */
34 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
38 int xMin
, xMax
, yMin
, yMax
;
40 #ifdef DIBDRV_ANTIALIASED_FONTS
42 BYTE r
, g
, b
, negColor
;
44 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
47 /* gets clip limits */
50 xMax
= clipRec
->right
;
51 yMax
= clipRec
->bottom
;
53 /* loop for every pixel in bitmap */
55 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
57 ptr
= (DWORD
*)((BYTE
*)dib
->bits
+ (dibY
* dib
->stride
) + x
* 4);
58 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
60 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
62 #ifdef DIBDRV_ANTIALIASED_FONTS
63 c
= physDev
->textColorTable
[*buf
];
66 negColor
= 255 - *buf
;
67 r
= (*ptr
>> 16) & 0xff;
68 g
= (*ptr
>> 8) & 0xff;
70 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
71 MulDiv(g
, 255 - *buf
, 255) << 8 |
72 MulDiv(r
, 255 - *buf
, 255);
83 void _DIBDRV_freetype_blit_32_RGB(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
85 /* FIXME : MUST BE OPTIMIZED !!! */
87 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
91 int xMin
, xMax
, yMin
, yMax
;
93 #ifdef DIBDRV_ANTIALIASED_FONTS
95 BYTE r
, g
, b
, negColor
;
97 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
100 /* gets DIB limits */
101 xMin
= clipRec
->left
;
103 xMax
= clipRec
->right
;
104 yMax
= clipRec
->bottom
;
106 /* loop for every pixel in bitmap */
108 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
110 ptr
= (DWORD
*)((BYTE
*)dib
->bits
+ (dibY
* dib
->stride
) + x
* 4);
111 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
113 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
115 #ifdef DIBDRV_ANTIALIASED_FONTS
116 c
= physDev
->textColorTable
[*buf
];
119 negColor
= 255 - *buf
;
120 r
= (*ptr
>> 16) & 0xff;
121 g
= (*ptr
>> 8) & 0xff;
123 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
124 MulDiv(g
, 255 - *buf
, 255) << 8 |
125 MulDiv(r
, 255 - *buf
, 255);
136 void _DIBDRV_freetype_blit_32_BITFIELDS(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
138 /* FIXME : MUST BE OPTIMIZED !!! */
140 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
144 int xMin
, xMax
, yMin
, yMax
;
145 #ifdef DIBDRV_ANTIALIASED_FONTS
148 BYTE r
, g
, b
, negColor
;
150 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
153 /* gets DIB limits */
154 xMin
= clipRec
->left
;
156 xMax
= clipRec
->right
;
157 yMax
= clipRec
->bottom
;
159 /* loop for every pixel in bitmap */
161 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
163 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
165 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
167 #ifdef DIBDRV_ANTIALIASED_FONTS
168 c
= physDev
->textColorTable
[*buf
];
171 negColor
= 255 - *buf
;
172 pix
= dib
->funcs
->GetPixel(dib
, dibX
, dibY
);
174 g
= (pix
>> 8) & 0xff;
175 b
= (pix
>> 16) & 0xff;
176 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
177 MulDiv(g
, 255 - *buf
, 255) << 8 |
178 MulDiv(r
, 255 - *buf
, 255);
181 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
188 void _DIBDRV_freetype_blit_24(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
190 /* FIXME : MUST BE OPTIMIZED !!! */
192 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
196 int xMin
, xMax
, yMin
, yMax
;
197 #ifdef DIBDRV_ANTIALIASED_FONTS
200 BYTE r
, g
, b
, negColor
;
202 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
205 /* gets DIB limits */
206 xMin
= clipRec
->left
;
208 xMax
= clipRec
->right
;
209 yMax
= clipRec
->bottom
;
211 /* loop for every pixel in bitmap */
213 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
215 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
217 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
219 #ifdef DIBDRV_ANTIALIASED_FONTS
220 c
= physDev
->textColorTable
[*buf
];
223 negColor
= 255 - *buf
;
224 pix
= dib
->funcs
->GetPixel(dib
, dibX
, dibY
);
226 g
= (pix
>> 8) & 0xff;
227 b
= (pix
>> 16) & 0xff;
228 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
229 MulDiv(g
, 255 - *buf
, 255) << 8 |
230 MulDiv(r
, 255 - *buf
, 255);
233 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
240 void _DIBDRV_freetype_blit_16_RGB(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
242 /* FIXME : MUST BE OPTIMIZED !!! */
244 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
248 int xMin
, xMax
, yMin
, yMax
;
249 #ifdef DIBDRV_ANTIALIASED_FONTS
252 BYTE r
, g
, b
, negColor
;
254 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
257 /* gets DIB limits */
258 xMin
= clipRec
->left
;
260 xMax
= clipRec
->right
;
261 yMax
= clipRec
->bottom
;
263 /* loop for every pixel in bitmap */
265 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
267 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
269 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
271 #ifdef DIBDRV_ANTIALIASED_FONTS
272 c
= physDev
->textColorTable
[*buf
];
275 negColor
= 255 - *buf
;
276 pix
= dib
->funcs
->GetPixel(dib
, dibX
, dibY
);
278 g
= (pix
>> 8) & 0xff;
279 b
= (pix
>> 16) & 0xff;
280 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
281 MulDiv(g
, 255 - *buf
, 255) << 8 |
282 MulDiv(r
, 255 - *buf
, 255);
285 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
292 void _DIBDRV_freetype_blit_16_BITFIELDS(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
294 /* FIXME : MUST BE OPTIMIZED !!! */
296 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
300 int xMin
, xMax
, yMin
, yMax
;
301 #ifdef DIBDRV_ANTIALIASED_FONTS
304 BYTE r
, g
, b
, negColor
;
306 DWORD c
= dib
->funcs
->ColorToPixel(dib
, physDev
->textColor
);
309 /* gets DIB limits */
310 xMin
= clipRec
->left
;
312 xMax
= clipRec
->right
;
313 yMax
= clipRec
->bottom
;
315 /* loop for every pixel in bitmap */
317 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
319 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
321 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
323 #ifdef DIBDRV_ANTIALIASED_FONTS
324 c
= physDev
->textColorTable
[*buf
];
327 negColor
= 255 - *buf
;
328 pix
= dib
->funcs
->GetPixel(dib
, dibX
, dibY
);
330 g
= (pix
>> 8) & 0xff;
331 b
= (pix
>> 16) & 0xff;
332 c
+= MulDiv(r
, 255 - *buf
, 255) << 16 |
333 MulDiv(g
, 255 - *buf
, 255) << 8 |
334 MulDiv(r
, 255 - *buf
, 255);
337 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
344 void _DIBDRV_freetype_blit_8(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
346 /* FIXME : MUST BE OPTIMIZED !!! */
348 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
352 int xMin
, xMax
, yMin
, yMax
;
353 DWORD c
= physDev
->textColor
;
355 /* gets DIB limits */
356 xMin
= clipRec
->left
;
358 xMax
= clipRec
->right
;
359 yMax
= clipRec
->bottom
;
361 /* loop for every pixel in bitmap */
363 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
365 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
367 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
368 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
374 void _DIBDRV_freetype_blit_4(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
376 /* FIXME : MUST BE OPTIMIZED !!! */
378 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
382 int xMin
, xMax
, yMin
, yMax
;
383 DWORD c
= physDev
->textColor
;
385 /* gets DIB limits */
386 xMin
= clipRec
->left
;
388 xMax
= clipRec
->right
;
389 yMax
= clipRec
->bottom
;
391 /* loop for every pixel in bitmap */
393 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
395 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
397 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
398 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);
404 void _DIBDRV_freetype_blit_1(DIBDRVPHYSDEV
*physDev
, int x
, int y
, RECT
*clipRec
, FT_Bitmap
*bmp
)
406 /* FIXME : MUST BE OPTIMIZED !!! */
408 DIBDRVBITMAP
*dib
= &physDev
->physBitmap
;
412 int xMin
, xMax
, yMin
, yMax
;
413 DWORD c
= physDev
->textColor
;
415 /* gets DIB limits */
416 xMin
= clipRec
->left
;
418 xMax
= clipRec
->right
;
419 yMax
= clipRec
->bottom
;
421 /* loop for every pixel in bitmap */
423 for(bmpY
= 0, dibY
= y
; bmpY
< bmp
->rows
; bmpY
++, dibY
++)
425 for(bmpX
= 0, dibX
= x
; bmpX
< bmp
->width
; bmpX
++, dibX
++)
427 if(dibX
< xMax
&& dibY
< yMax
&& dibX
>= xMin
&& dibY
>= yMin
&& *buf
)
428 dib
->funcs
->SetPixel(dib
, dibX
, dibY
, 0, c
);