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
;
83 PGLYPHENTRY pge
= (PGLYPHENTRY
)(pface
->pCharTable
+ hg
);
84 ULONG xSrc
, ySrc
, cxSrc
, cySrc
;
85 ULONG xDst
, yDst
, cxDst
, cyDst
;
87 ULONG ulGlyphOffset
, cjDstRow
, color
;
92 DbgPrint("no glyph handle given!\n");
96 /* Get the bitmap offset depending on file version */
97 if (pface
->ulVersion
>= 0x300)
99 cxSrc
= GETVAL(pge
->ge20
.geWidth
);
100 ulGlyphOffset
= GETVAL(pge
->ge30
.geOffset
);
104 cxSrc
= GETVAL(pge
->ge30
.geWidth
);
105 ulGlyphOffset
= GETVAL(pge
->ge20
.geOffset
);
107 cySrc
= pface
->wPixHeight
;
109 /* Pointer to the bitmap bits */
110 pvSrc0
= (PBYTE
)pface
->pFontInfo
+ ulGlyphOffset
;
113 xScale
= pfont
->xScale
;
114 yScale
= pfont
->yScale
;
116 /* Calculate extents of destination bitmap */
117 if (pfont
->ulAngle
== 90 || pfont
->ulAngle
== 270)
119 cxDst
= cySrc
* xScale
;
120 cyDst
= cxSrc
* yScale
;
124 cxDst
= cxSrc
* yScale
;
125 cyDst
= cySrc
* xScale
;
127 cjDstRow
= (cxDst
+ 7) / 8;
131 /* Fill GLYPHDATA structure */
134 pgd
->fxD
= xScale
* (pface
->wA
+ cxDst
+ pface
->wC
) << 4;
135 pgd
->fxA
= xScale
* pface
->wA
<< 4;
136 pgd
->fxAB
= xScale
* (pface
->wA
+ cxDst
) << 4;
137 pgd
->fxInkTop
= yScale
* pface
->wAscent
<< 4;
138 pgd
->fxInkBottom
= - yScale
* (pface
->wDescent
<< 4);
139 pgd
->rclInk
.top
= - yScale
* pface
->wAscent
;
140 pgd
->rclInk
.bottom
= yScale
* pface
->wDescent
;
141 pgd
->rclInk
.left
= xScale
* pface
->wA
;
142 pgd
->rclInk
.right
= pgd
->rclInk
.left
+ cxDst
;
143 pgd
->ptqD
.x
.LowPart
= 0;
144 pgd
->ptqD
.x
.HighPart
= pgd
->fxD
;
145 pgd
->ptqD
.y
.LowPart
= 0;
146 pgd
->ptqD
.y
.HighPart
= 0;
151 /* Verify that the buffer is big enough */
152 if (cjSize
< FIELD_OFFSET(GLYPHBITS
, aj
) + cyDst
* cjDstRow
)
154 DbgPrint("Buffer too small (%ld), %ld,%ld\n",
155 cjSize
, cxSrc
, cySrc
);
159 /* Fill GLYPHBITS structure */
160 pgb
->ptlOrigin
.x
= yScale
* pface
->wA
;
161 pgb
->ptlOrigin
.y
= - yScale
* pface
->wAscent
;
162 pgb
->sizlBitmap
.cx
= cxDst
;
163 pgb
->sizlBitmap
.cy
= cyDst
;
165 /* Erase destination surface */
166 memset(pvDst0
, 0, cyDst
* cjDstRow
);
168 switch (pfont
->ulAngle
)
172 for (yDst
= 0; yDst
< cyDst
; yDst
++)
174 xSrc
= yDst
/ yScale
;
175 for (xDst
= 0; xDst
< cxDst
; xDst
++)
177 ySrc
= (cxDst
- xDst
) / xScale
;
178 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
179 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
185 for (yDst
= 0; yDst
< cyDst
; yDst
++)
187 ySrc
= (cyDst
- yDst
) / yScale
;
188 for (xDst
= 0; xDst
< cxDst
; xDst
++)
190 xSrc
= (cxDst
- xDst
) / xScale
;
191 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
192 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
198 for (yDst
= 0; yDst
< cyDst
; yDst
++)
200 xSrc
= (cyDst
- yDst
) / yScale
;
201 for (xDst
= 0; xDst
< cxDst
; xDst
++)
203 ySrc
= xDst
/ xScale
;
204 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
205 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
212 for (yDst
= 0; yDst
< cyDst
; yDst
++)
214 ySrc
= yDst
/ yScale
;
215 for (xDst
= 0; xDst
< cxDst
; xDst
++)
217 xSrc
= xDst
/ xScale
;
218 color
= _ReadPixel(pvSrc0
, xSrc
, ySrc
, cySrc
);
219 _WritePixel(pvDst0
, xDst
, yDst
, cjDstRow
, color
);
225 /* Return the size of the GLYPHBITS structure */
226 return FIELD_OFFSET(GLYPHBITS
, aj
) + cyDst
* cjDstRow
;
232 PFD_DEVICEMETRICS pfddm
,
235 ULONG cjMaxWidth
, cjMaxBitmapSize
;
236 PFONTINFO16 pFontInfo
;
237 ULONG xScale
, yScale
;
241 if (cjSize
< sizeof(FD_DEVICEMETRICS
))
243 /* Not enough space, fail */
247 pFontInfo
= pfont
->pface
->pFontInfo
;
249 xScale
= pfont
->xScale
;
250 yScale
= pfont
->yScale
;
252 /* Fill FD_DEVICEMETRICS */
253 pfddm
->flRealizedType
= FDM_MASK
;
254 pfddm
->pteBase
.x
= FLOATL_1
;
255 pfddm
->pteBase
.y
= 0;
256 pfddm
->pteSide
.x
= 0;
257 pfddm
->pteSide
.y
= FLOATL_1
;
258 pfddm
->ptlUnderline1
.x
= 0;
259 pfddm
->ptlUnderline1
.y
= 1;
260 pfddm
->ptlStrikeout
.x
= 0;
261 pfddm
->ptlStrikeout
.y
= -4;
262 pfddm
->ptlULThickness
.x
= 0;
263 pfddm
->ptlULThickness
.y
= 1;
264 pfddm
->ptlSOThickness
.x
= 0;
265 pfddm
->ptlSOThickness
.y
= 1;
270 if (pfont
->ulAngle
== 90 || pfont
->ulAngle
== 270)
272 pfddm
->cxMax
= xScale
* GETVAL(pFontInfo
->dfPixHeight
);
273 pfddm
->cyMax
= yScale
* GETVAL(pFontInfo
->dfMaxWidth
);
274 pfddm
->fxMaxAscender
= yScale
* GETVAL(pFontInfo
->dfAscent
) << 4;
275 pfddm
->fxMaxDescender
= (pfddm
->cyMax
<< 4) - pfddm
->fxMaxAscender
;
279 pfddm
->cxMax
= xScale
* GETVAL(pFontInfo
->dfMaxWidth
);
280 pfddm
->cyMax
= yScale
* GETVAL(pFontInfo
->dfPixHeight
);
281 pfddm
->fxMaxAscender
= yScale
* GETVAL(pFontInfo
->dfAscent
) << 4;
282 pfddm
->fxMaxDescender
= (pfddm
->cyMax
<< 4) - pfddm
->fxMaxAscender
;
285 pfddm
->lD
= pfddm
->cxMax
;
287 /* Calculate Width in bytes */
288 cjMaxWidth
= ((pfddm
->cxMax
+ 7) >> 3);
290 /* Calculate size of the bitmap, rounded to DWORDs */
291 cjMaxBitmapSize
= ((cjMaxWidth
* pfddm
->cyMax
) + 3) & ~3;
293 /* cjGlyphMax is the full size of the GLYPHBITS structure */
294 pfddm
->cjGlyphMax
= FIELD_OFFSET(GLYPHBITS
, aj
) + cjMaxBitmapSize
;
296 /* NOTE: fdxQuantized and NonLinear... stay unchanged */
299 /* Return the size of the structure */
300 return sizeof(FD_DEVICEMETRICS
);
304 /** Public Interface **********************************************************/
312 DbgPrint("BmfdQueryGlyphAttrs()\n");
313 /* We don't support FO_ATTR_MODE_ROTATE */
328 PBMFD_FILE pfile
= (PBMFD_FILE
)pfo
->iFile
;
329 PBMFD_FACE pface
= &pfile
->aface
[pfo
->iFace
- 1];
330 PBMFD_FONT pfont
= BmfdGetFontInstance(pfo
, pface
);
332 DbgPrint("BmfdQueryFontData(pfo=%p, iMode=%ld, hg=%p, pgd=%p, pv=%p, cjSize=%ld)\n",
333 pfo
, iMode
, hg
, pgd
, pv
, cjSize
);
338 case QFD_GLYPHANDBITMAP
: /* 1 */
339 return BmfdQueryGlyphAndBitmap(pfont
, hg
, pgd
, pv
, cjSize
);
341 case QFD_MAXEXTENTS
: /* 3 */
342 return BmfdQueryMaxExtents(pfont
, pv
, cjSize
);
344 /* we support nothing else */