Skip to content

Commit 4be4577

Browse files
committed
[GDI FONT DRIVER]
- Implement initial "ClearType" support. Currently only bitmap characters are correctly copied and they can have a color distortion. But its at least readable. svn path=/branches/GSoC_2011/GdiFontDriver/; revision=53278
1 parent a97ec22 commit 4be4577

File tree

2 files changed

+137
-6
lines changed

2 files changed

+137
-6
lines changed

win32ss/drivers/font/ftfd/copybits.c

Lines changed: 125 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,68 @@ FtfdCopyBits_S1D4(
9999
}
100100
}
101101

102+
#define CT_OPAQUE 0x2a
103+
104+
static
105+
VOID
106+
FtfdCopyBits_S1D8(
107+
GLYPHBITS *pgb,
108+
FT_Bitmap *ftbitmap)
109+
{
110+
ULONG ulRows, ulSrcDelta;
111+
PBYTE pjDstLine, pjSrcLine;
112+
113+
pjDstLine = pgb->aj;
114+
115+
pjSrcLine = ftbitmap->buffer;
116+
ulSrcDelta = abs(ftbitmap->pitch);
117+
118+
ulRows = pgb->sizlBitmap.cy;
119+
while (ulRows--)
120+
{
121+
ULONG ulWidth = pgb->sizlBitmap.cx;
122+
BYTE j, *pjSrc;
123+
pjSrc = pjSrcLine;
124+
125+
/* Get 8 pixels */
126+
j = (*pjSrc++);
127+
128+
while (ulWidth >= 8)
129+
{
130+
/* Set 8 pixels */
131+
*pjDstLine++ = (j & 128) ? CT_OPAQUE : 0;
132+
*pjDstLine++ = (j & 64) ? CT_OPAQUE : 0;
133+
*pjDstLine++ = (j & 32) ? CT_OPAQUE : 0;
134+
*pjDstLine++ = (j & 16) ? CT_OPAQUE : 0;
135+
*pjDstLine++ = (j & 8) ? CT_OPAQUE : 0;
136+
*pjDstLine++ = (j & 4) ? CT_OPAQUE : 0;
137+
*pjDstLine++ = (j & 2) ? CT_OPAQUE : 0;
138+
*pjDstLine++ = (j & 1) ? CT_OPAQUE : 0;
139+
140+
/* Next 8 pixels */
141+
j = (*pjSrc++);
142+
ulWidth -= 8;
143+
}
144+
145+
/* Set remaining pixels (max 7) */
146+
switch (ulWidth)
147+
{
148+
case 7: pjDstLine[6] = (j & 2) ? CT_OPAQUE : 0;
149+
case 6: pjDstLine[5] = (j & 4) ? CT_OPAQUE : 0;
150+
case 5: pjDstLine[4] = (j & 8) ? CT_OPAQUE : 0;
151+
case 4: pjDstLine[3] = (j & 16) ? CT_OPAQUE : 0;
152+
case 3: pjDstLine[2] = (j & 32) ? CT_OPAQUE : 0;
153+
case 2: pjDstLine[1] = (j & 64) ? CT_OPAQUE : 0;
154+
case 1: pjDstLine[0] = (j & 128) ? CT_OPAQUE : 0;
155+
}
156+
157+
pjDstLine += ulWidth;
158+
159+
/* Go to the next source line */
160+
pjSrcLine += ulSrcDelta;
161+
}
162+
}
163+
102164
static
103165
VOID
104166
FtfdCopyBits_S8D4(
@@ -137,6 +199,47 @@ FtfdCopyBits_S8D4(
137199
}
138200
}
139201

202+
static
203+
VOID
204+
FtfdCopyBits_LCD_X(
205+
GLYPHBITS *pgb,
206+
FT_Bitmap *ftbitmap)
207+
{
208+
ULONG ulRows, ulDstDelta, ulSrcDelta;
209+
PBYTE pjDstLine, pjSrcLine;
210+
211+
pjDstLine = pgb->aj;
212+
ulDstDelta = pgb->sizlBitmap.cx;
213+
214+
pjSrcLine = ftbitmap->buffer;
215+
ulSrcDelta = abs(ftbitmap->pitch);
216+
217+
ulRows = pgb->sizlBitmap.cy;
218+
while (ulRows--)
219+
{
220+
ULONG ulWidth = ulDstDelta;
221+
BYTE *pjSrc;
222+
223+
pjSrc = pjSrcLine;
224+
while (ulWidth--)
225+
{
226+
/* Get the pixel */
227+
*pjDstLine++ = (*pjSrc++);
228+
}
229+
230+
/* Go to the next source line */
231+
pjSrcLine += ulSrcDelta;
232+
}
233+
}
234+
235+
static
236+
VOID
237+
FtfdCopyBits_LCD_Y(
238+
GLYPHBITS *pgb,
239+
FT_Bitmap *ftbitmap)
240+
{
241+
}
242+
140243
VOID
141244
NTAPI
142245
FtfdCopyBits(
@@ -157,8 +260,8 @@ FtfdCopyBits(
157260
{
158261
FtfdCopyBits_S1D1(pgb, ftbitmap);
159262
}
160-
else if (ftbitmap->pixel_mode == FT_PIXEL_MODE_GRAY &&
161-
ftbitmap->num_grays == 256)
263+
else if ((ftbitmap->pixel_mode == FT_PIXEL_MODE_GRAY) &&
264+
(ftbitmap->num_grays == 256))
162265
{
163266
FtfdCopyBits_S8D1(pgb, ftbitmap);
164267
}
@@ -167,7 +270,6 @@ FtfdCopyBits(
167270
WARN("Unsupported pixel format\n");
168271
__debugbreak();
169272
}
170-
171273
}
172274
else if (jBppDst == 4)
173275
{
@@ -186,6 +288,26 @@ FtfdCopyBits(
186288
__debugbreak();
187289
}
188290
}
291+
else if (jBppDst == 8)
292+
{
293+
if (ftbitmap->pixel_mode == FT_PIXEL_MODE_LCD)
294+
{
295+
FtfdCopyBits_LCD_X(pgb, ftbitmap);
296+
}
297+
else if (ftbitmap->pixel_mode == FT_PIXEL_MODE_LCD_V)
298+
{
299+
FtfdCopyBits_LCD_Y(pgb, ftbitmap);
300+
}
301+
else if (ftbitmap->pixel_mode == FT_PIXEL_MODE_MONO)
302+
{
303+
FtfdCopyBits_S1D8(pgb, ftbitmap);
304+
}
305+
else
306+
{
307+
WARN("Unsupported pixel format\n");
308+
__debugbreak();
309+
}
310+
}
189311
else
190312
{
191313
WARN("Bit depth %ld not implemented\n", jBppDst);

win32ss/drivers/font/ftfd/glyph.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,11 @@ FtfdCreateFontInstance(
115115

116116
pfont->ftface = ftface;
117117

118-
/* Set requested number of bits per pixel */
119-
pfont->jBpp = pfo->flFontType & FO_GRAY16 ? 4 : 1;
118+
/* Set requested number of bits per pixel of the target */
119+
if (pfo->flFontType & FO_CLEARTYPE_X) pfont->jBpp = 8;
120+
else if (pfo->flFontType & FO_CLEARTYPE_Y) pfont->jBpp = 8;
121+
else if (pfo->flFontType & FO_GRAY16) pfont->jBpp = 4;
122+
else pfont->jBpp = 1;
120123

121124
/* Get the XFORMOBJ from the font */
122125
pxo = FONTOBJ_pxoGetXform(pfo);
@@ -549,7 +552,13 @@ FtRenderGlyphBitmap(
549552
FT_Error fterror;
550553
FT_Render_Mode mode;
551554

552-
mode = pfont->jBpp == 1 ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_NORMAL;
555+
/* Determine the right render mode */
556+
if (pfont->jBpp == 1) mode = FT_RENDER_MODE_MONO;
557+
else if (pfont->pfo->flFontType & FO_CLEARTYPE_X) mode = FT_RENDER_MODE_LCD;
558+
else if (pfont->pfo->flFontType & FO_CLEARTYPE_Y) mode = FT_RENDER_MODE_LCD_V;
559+
else mode = FT_RENDER_MODE_NORMAL;
560+
561+
/* Render the glyph */
553562
fterror = FT_Render_Glyph(pfont->ftface->glyph, mode);
554563
if (fterror)
555564
{

0 commit comments

Comments
 (0)