DIB Engine: implement most engine functions
[wine/hacks.git] / dlls / winedib.drv / primitives_font.c
blobdd1d64b3fcb7078ac0410abff828ac36b03f9441
1 /*
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
21 #include "config.h"
22 #include "wine/port.h"
24 #include "dibdrv.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, FT_Bitmap *bmp)
32 /* FIXME : MUST BE OPTIMIZED !!! */
34 DIBDRVBITMAP *dib = &physDev->physBitmap;
35 int bmpX, bmpY;
36 BYTE *buf;
37 int dibX, dibY;
38 int DIBX, DIBY;
39 DWORD c;
40 DWORD *ptr;
42 /* gets DIB limits */
43 DIBX = dib->width;
44 DIBY = dib->height;
46 /* loop for every pixel in bitmap */
47 buf = bmp->buffer;
48 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
50 ptr = (DWORD *)((BYTE *)dib->bits + (dibY * dib->stride) + x * 4);
51 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
53 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
55 c = physDev->textColorTable[*buf];
56 *ptr = c;
58 buf++;
59 ptr++;
64 void _DIBDRV_freetype_blit_32_RGB(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
66 /* FIXME : MUST BE OPTIMIZED !!! */
68 DIBDRVBITMAP *dib = &physDev->physBitmap;
69 int bmpX, bmpY;
70 BYTE *buf;
71 int dibX, dibY;
72 int DIBX, DIBY;
73 DWORD c;
75 /* gets DIB limits */
76 DIBX = dib->width;
77 DIBY = dib->height;
79 /* loop for every pixel in bitmap */
80 buf = bmp->buffer;
81 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
83 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
85 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
87 c = physDev->textColorTable[*buf];
88 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
90 buf++;
95 void _DIBDRV_freetype_blit_32_BITFIELDS(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
97 /* FIXME : MUST BE OPTIMIZED !!! */
99 DIBDRVBITMAP *dib = &physDev->physBitmap;
100 int bmpX, bmpY;
101 BYTE *buf;
102 int dibX, dibY;
103 int DIBX, DIBY;
104 DWORD c;
106 /* gets DIB limits */
107 DIBX = dib->width;
108 DIBY = dib->height;
110 /* loop for every pixel in bitmap */
111 buf = bmp->buffer;
112 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
114 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
116 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
118 c = physDev->textColorTable[*buf];
119 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
121 buf++;
126 void _DIBDRV_freetype_blit_24(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
128 /* FIXME : MUST BE OPTIMIZED !!! */
130 DIBDRVBITMAP *dib = &physDev->physBitmap;
131 int bmpX, bmpY;
132 BYTE *buf;
133 int dibX, dibY;
134 int DIBX, DIBY;
135 DWORD c;
137 /* gets DIB limits */
138 DIBX = dib->width;
139 DIBY = dib->height;
141 /* loop for every pixel in bitmap */
142 buf = bmp->buffer;
143 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
145 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
147 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
149 c = physDev->textColorTable[*buf];
150 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
152 buf++;
157 void _DIBDRV_freetype_blit_16_RGB(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
159 /* FIXME : MUST BE OPTIMIZED !!! */
161 DIBDRVBITMAP *dib = &physDev->physBitmap;
162 int bmpX, bmpY;
163 BYTE *buf;
164 int dibX, dibY;
165 int DIBX, DIBY;
166 DWORD c;
168 /* gets DIB limits */
169 DIBX = dib->width;
170 DIBY = dib->height;
172 /* loop for every pixel in bitmap */
173 buf = bmp->buffer;
174 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
176 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
178 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
180 c = physDev->textColorTable[*buf];
181 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
183 buf++;
188 void _DIBDRV_freetype_blit_16_BITFIELDS(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
190 /* FIXME : MUST BE OPTIMIZED !!! */
192 DIBDRVBITMAP *dib = &physDev->physBitmap;
193 int bmpX, bmpY;
194 BYTE *buf;
195 int dibX, dibY;
196 int DIBX, DIBY;
197 DWORD c;
199 /* gets DIB limits */
200 DIBX = dib->width;
201 DIBY = dib->height;
203 /* loop for every pixel in bitmap */
204 buf = bmp->buffer;
205 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
207 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
209 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
211 c = physDev->textColorTable[*buf];
212 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
214 buf++;
219 void _DIBDRV_freetype_blit_8(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
221 /* FIXME : MUST BE OPTIMIZED !!! */
223 DIBDRVBITMAP *dib = &physDev->physBitmap;
224 int bmpX, bmpY;
225 BYTE *buf;
226 int dibX, dibY;
227 int DIBX, DIBY;
228 DWORD c;
230 /* gets DIB limits */
231 DIBX = dib->width;
232 DIBY = dib->height;
234 /* loop for every pixel in bitmap */
235 buf = bmp->buffer;
236 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
238 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
240 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
242 c = physDev->textColorTable[*buf];
243 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
245 buf++;
250 void _DIBDRV_freetype_blit_4(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
252 /* FIXME : MUST BE OPTIMIZED !!! */
254 DIBDRVBITMAP *dib = &physDev->physBitmap;
255 int bmpX, bmpY;
256 BYTE *buf;
257 int dibX, dibY;
258 int DIBX, DIBY;
259 DWORD c;
261 /* gets DIB limits */
262 DIBX = dib->width;
263 DIBY = dib->height;
265 /* loop for every pixel in bitmap */
266 buf = bmp->buffer;
267 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
269 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
271 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
273 c = physDev->textColorTable[*buf];
274 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
276 buf++;
281 void _DIBDRV_freetype_blit_1(DIBDRVPHYSDEV *physDev, int x, int y, FT_Bitmap *bmp)
283 /* FIXME : MUST BE OPTIMIZED !!! */
285 DIBDRVBITMAP *dib = &physDev->physBitmap;
286 int bmpX, bmpY;
287 BYTE *buf;
288 int dibX, dibY;
289 int DIBX, DIBY;
290 DWORD c;
292 /* gets DIB limits */
293 DIBX = dib->width;
294 DIBY = dib->height;
296 /* loop for every pixel in bitmap */
297 buf = bmp->buffer;
298 for(bmpY = 0, dibY = y; bmpY < bmp->rows; bmpY++, dibY++)
300 for(bmpX = 0, dibX = x; bmpX < bmp->width; bmpX++, dibX++)
302 if(dibX < DIBX && dibY < DIBY && dibX > 0 && dibY > 0 && *buf)
304 c = physDev->textColorTable[*buf];
305 dib->funcs->SetPixel(dib, dibX, dibY, 0, c);
307 buf++;