2 * PROJECT: ReactOS win32 subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: GDI font driver for bitmap fonts
5 * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
19 j
= pjBits
[(x
/8) * ulHeight
+ y
];
20 return (j
>> (~x
& 0x7)) & 1;
35 *pjBits
|= color
<< (~x
& 0x7);
44 PBMFD_FONT pfont
= pfo
->pvProducer
;
50 /* Allocate realization info */
51 pfont
= EngAllocMem(0, sizeof(BMFD_FONT
), 0);
57 pxo
= FONTOBJ_pxoGetXform(pfo
);
58 XFORMOBJ_iGetFloatObjXform(pxo
, &xfo
);
62 pfont
->xScale
= FLOATOBJ_GetLong(&xfo
.eM11
);
63 pfont
->yScale
= FLOATOBJ_GetLong(&xfo
.eM22
);
66 /* Set the pvProducer member of the fontobj */
67 pfo
->pvProducer
= pfont
;
75 BmfdQueryGlyphAndBitmap(
82 PBMFD_FACE pface
= pfont
->pface
;
84 ULONG xSrc
, ySrc
, cxSrc
, cySrc
;
85 ULONG xDst
, yDst
, cxDst
, cyDst
;
87 ULONG ulGlyphOffset
, cjDstRow
, color
;
90 /* The glyph handle is the byte offset to the glyph in the table */
91 pge
= (PGLYPHENTRY
)(pface
->pCharTable
+ hg
);
93 /* Get the bitmap offset depending on file version */
94 if (pface
->ulVersion
>= 0x300)
96 cxSrc
= GETVAL(pge
->ge20
.geWidth
);
97 ulGlyphOffset
= GETVAL(pge
->ge30
.geOffset
);
101 cxSrc
= GETVAL(pge
->ge30
.geWidth
);
102 ulGlyphOffset
= GETVAL(pge
->ge20
.geOffset
);
104 cySrc
= pface
->wPixHeight
;
106 /* Pointer to the bitmap bits */
107 pvSrc0
= (PBYTE
)pface
->pFontInfo
+ ulGlyphOffset
;
110 xScale
= pfont
->xScale
;
111 yScale
= pfont
->yScale
;
113 /* Calculate extents of destination bitmap */
114 if (pfont
->ulAngle
== 90 || pfont
->ulAngle
== 270)
116 cxDst
= cySrc
* xScale
;
117 cyDst
= cxSrc
* yScale
;
121 cxDst
= cxSrc
* xScale
;
122 cyDst
= cySrc
* yScale
;
124 cjDstRow
= (cxDst
+ 7) / 8;
128 /* Fill GLYPHDATA structure */
131 pgd
->fxD
= xScale
* (pface
->wA
+ cxDst
+ pface
->wC
) << 4;
132 pgd
->fxA
= xScale
* pface
->wA
<< 4;
133 pgd
->fxAB
= xScale
* (pface
->wA
+ cxDst
) << 4;
134 pgd
->fxInkTop
= yScale
* pface
->wAscent
<< 4;
135 pgd
->fxInkBottom
= - yScale
* (pface
->wDescent
<< 4);
136 pgd
->rclInk
.top
= - yScale
* pface
->wAscent
;
137 pgd
->rclInk
.bottom
= yScale
* pface
->wDescent
;
138 pgd
->rclInk
.left
= xScale
* pface
->wA
;
139 pgd
->rclInk
.right
= pgd
->rclInk
.left
+ cxDst
;
140 pgd
->ptqD
.x
.LowPart
= 0;
141 pgd
->ptqD
.x
.HighPart
= pgd
->fxD
;
142 pgd
->ptqD
.y
.LowPart
= 0;
143 pgd
->ptqD
.y
.HighPart
= 0;
148 /* Verify that the buffer is big enough */
149 if (cjSize
< FIELD_OFFSET(GLYPHBITS
, aj
) + cyDst
* cjDstRow
)
151 DbgPrint("Buffer too small (%ld), %ld,%ld\n",
152 cjSize
, cxSrc
, cySrc
);
156 /* Fill GLYPHBITS structure */
157 pgb
->ptlOrigin
.x
= xScale
* pface
->wA
;
158 pgb
->ptlOrigin
.y
= - yScale
* pface
->wAscent
;
159 pgb
->sizlBitmap
.cx
= cxDst
;
160 pgb
->sizlBitmap
.cy
= cyDst
;
162 /* Erase destination surface */
163 memset(pvDst0
, 0, cyDst
* cjDstRow
);
165 switch (pfont
->ulAngle
)
169 for (yDst
= 0; yDst
< cyDst
; yDst
++)
171 xSrc
= yDst
/ yScale
;
172 for (xDst
= 0; xDst
< cxDst
; xDst
++)
174 ySrc
= (cxDst
- xDst
) / xScale
;
175 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
176 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
182 for (yDst
= 0; yDst
< cyDst
; yDst
++)
184 ySrc
= (cyDst
- yDst
) / yScale
;
185 for (xDst
= 0; xDst
< cxDst
; xDst
++)
187 xSrc
= (cxDst
- xDst
) / xScale
;
188 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
189 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
195 for (yDst
= 0; yDst
< cyDst
; yDst
++)
197 xSrc
= (cyDst
- yDst
) / yScale
;
198 for (xDst
= 0; xDst
< cxDst
; xDst
++)
200 ySrc
= xDst
/ xScale
;
201 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
202 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
209 for (yDst
= 0; yDst
< cyDst
; yDst
++)
211 ySrc
= yDst
/ yScale
;
212 for (xDst
= 0; xDst
< cxDst
; xDst
++)
214 xSrc
= xDst
/ xScale
;
215 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
216 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
222 /* Return the size of the GLYPHBITS structure */
223 return FIELD_OFFSET(GLYPHBITS
, aj
) + cyDst
* cjDstRow
;
229 PFD_DEVICEMETRICS pfddm
,
232 ULONG cjMaxWidth
, cjMaxBitmapSize
;
233 PFONTINFO16 pFontInfo
;
234 ULONG xScale
, yScale
;
238 if (cjSize
< sizeof(FD_DEVICEMETRICS
))
240 /* Not enough space, fail */
244 pFontInfo
= pfont
->pface
->pFontInfo
;
246 xScale
= pfont
->xScale
;
247 yScale
= pfont
->yScale
;
249 /* Fill FD_DEVICEMETRICS */
250 pfddm
->flRealizedType
= FDM_MASK
;
251 pfddm
->pteBase
.x
= FLOATL_1
;
252 pfddm
->pteBase
.y
= 0;
253 pfddm
->pteSide
.x
= 0;
254 pfddm
->pteSide
.y
= FLOATL_1
;
255 pfddm
->ptlUnderline1
.x
= 0;
256 pfddm
->ptlUnderline1
.y
= 1;
257 pfddm
->ptlStrikeout
.x
= 0;
258 pfddm
->ptlStrikeout
.y
= -4;
259 pfddm
->ptlULThickness
.x
= 0;
260 pfddm
->ptlULThickness
.y
= 1;
261 pfddm
->ptlSOThickness
.x
= 0;
262 pfddm
->ptlSOThickness
.y
= 1;
267 if (pfont
->ulAngle
== 90 || pfont
->ulAngle
== 270)
269 pfddm
->cxMax
= xScale
* GETVAL(pFontInfo
->dfPixHeight
);
270 pfddm
->cyMax
= yScale
* GETVAL(pFontInfo
->dfMaxWidth
);
271 pfddm
->fxMaxAscender
= yScale
* GETVAL(pFontInfo
->dfAscent
) << 4;
272 pfddm
->fxMaxDescender
= (pfddm
->cyMax
<< 4) - pfddm
->fxMaxAscender
;
276 pfddm
->cxMax
= xScale
* GETVAL(pFontInfo
->dfMaxWidth
);
277 pfddm
->cyMax
= yScale
* GETVAL(pFontInfo
->dfPixHeight
);
278 pfddm
->fxMaxAscender
= yScale
* GETVAL(pFontInfo
->dfAscent
) << 4;
279 pfddm
->fxMaxDescender
= (pfddm
->cyMax
<< 4) - pfddm
->fxMaxAscender
;
282 pfddm
->lD
= pfddm
->cxMax
;
284 /* Calculate Width in bytes */
285 cjMaxWidth
= ((pfddm
->cxMax
+ 7) >> 3);
287 /* Calculate size of the bitmap, rounded to DWORDs */
288 cjMaxBitmapSize
= ((cjMaxWidth
* pfddm
->cyMax
) + 3) & ~3;
290 /* cjGlyphMax is the full size of the GLYPHBITS structure */
291 pfddm
->cjGlyphMax
= FIELD_OFFSET(GLYPHBITS
, aj
) + cjMaxBitmapSize
;
293 /* NOTE: fdxQuantized and NonLinear... stay unchanged */
296 /* Return the size of the structure */
297 return sizeof(FD_DEVICEMETRICS
);
301 /** Public Interface **********************************************************/
309 DbgPrint("BmfdQueryGlyphAttrs()\n");
310 /* We don't support FO_ATTR_MODE_ROTATE */
325 PBMFD_FILE pfile
= (PBMFD_FILE
)pfo
->iFile
;
326 PBMFD_FACE pface
= &pfile
->aface
[pfo
->iFace
- 1];
327 PBMFD_FONT pfont
= BmfdGetFontInstance(pfo
, pface
);
329 DbgPrint("BmfdQueryFontData(pfo=%p, iMode=%ld, hg=%p, pgd=%p, pv=%p, cjSize=%ld)\n",
330 pfo
, iMode
, hg
, pgd
, pv
, cjSize
);
335 case QFD_GLYPHANDBITMAP
: /* 1 */
336 return BmfdQueryGlyphAndBitmap(pfont
, hg
, pgd
, pv
, cjSize
);
338 case QFD_MAXEXTENTS
: /* 3 */
339 return BmfdQueryMaxExtents(pfont
, pv
, cjSize
);
341 /* we support nothing else */