Nikolay Sivov : gdi32: Clarify offsets and sizes in vdmx table lookup code.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 30 10:07:58 CDT 2015
Module: wine
Branch: master
Commit: d5c9a8a57adcba58b3418156f267e64bc6ffbc5d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d5c9a8a57adcba58b3418156f267e64bc6ffbc5d
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Jun 29 21:32:07 2015 +0300
gdi32: Clarify offsets and sizes in vdmx table lookup code.
---
dlls/gdi32/freetype.c | 36 ++++++++++++++++++++++++------------
1 file changed, 24 insertions(+), 12 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 07d80a2..73824ea 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -4463,6 +4463,12 @@ static DWORD get_font_data( GdiFont *font, DWORD table, DWORD offset, LPVOID buf
#define MS_VDMX_TAG MS_MAKE_TAG('V', 'D', 'M', 'X')
typedef struct {
+ WORD version;
+ WORD numRecs;
+ WORD numRatios;
+} VDMX_Header;
+
+typedef struct {
BYTE bCharSet;
BYTE xRatio;
BYTE yStartRatio;
@@ -4475,9 +4481,15 @@ typedef struct {
BYTE endsz;
} VDMX_group;
+typedef struct {
+ WORD yPelHeight;
+ WORD yMax;
+ WORD yMin;
+} VDMX_vTable;
+
static LONG load_VDMX(GdiFont *font, LONG height)
{
- WORD hdr[3];
+ VDMX_Header hdr;
VDMX_group group;
BYTE devXRatio, devYRatio;
USHORT numRecs, numRatios;
@@ -4485,7 +4497,7 @@ static LONG load_VDMX(GdiFont *font, LONG height)
LONG ppem = 0;
int i;
- result = get_font_data(font, MS_VDMX_TAG, 0, hdr, sizeof(hdr));
+ result = get_font_data(font, MS_VDMX_TAG, 0, &hdr, sizeof(hdr));
if(result == GDI_ERROR) /* no vdmx table present, use linear scaling */
return ppem;
@@ -4494,14 +4506,14 @@ static LONG load_VDMX(GdiFont *font, LONG height)
devXRatio = 1;
devYRatio = 1;
- numRecs = GET_BE_WORD(hdr[1]);
- numRatios = GET_BE_WORD(hdr[2]);
+ numRecs = GET_BE_WORD(hdr.numRecs);
+ numRatios = GET_BE_WORD(hdr.numRatios);
- TRACE("numRecs = %d numRatios = %d\n", numRecs, numRatios);
+ TRACE("version = %d numRecs = %d numRatios = %d\n", GET_BE_WORD(hdr.version), numRecs, numRatios);
for(i = 0; i < numRatios; i++) {
Ratios ratio;
- offset = (3 * 2) + (i * sizeof(Ratios));
+ offset = sizeof(hdr) + (i * sizeof(Ratios));
get_font_data(font, MS_VDMX_TAG, offset, &ratio, sizeof(Ratios));
offset = -1;
@@ -4516,11 +4528,11 @@ static LONG load_VDMX(GdiFont *font, LONG height)
devYRatio >= ratio.yStartRatio &&
devYRatio <= ratio.yEndRatio))
{
- WORD tmp;
+ WORD group_offset;
- offset = (3 * 2) + (numRatios * 4) + (i * 2);
- get_font_data(font, MS_VDMX_TAG, offset, &tmp, sizeof(tmp));
- offset = GET_BE_WORD(tmp);
+ offset = sizeof(hdr) + numRatios * sizeof(ratio) + i * sizeof(group_offset);
+ get_font_data(font, MS_VDMX_TAG, offset, &group_offset, sizeof(group_offset));
+ offset = GET_BE_WORD(group_offset);
break;
}
}
@@ -4538,8 +4550,8 @@ static LONG load_VDMX(GdiFont *font, LONG height)
TRACE("recs=%d startsz=%d endsz=%d\n", recs, startsz, endsz);
- vTable = HeapAlloc(GetProcessHeap(), 0, recs * 6);
- result = get_font_data(font, MS_VDMX_TAG, offset + 4, vTable, recs * 6);
+ vTable = HeapAlloc(GetProcessHeap(), 0, recs * sizeof(VDMX_vTable));
+ result = get_font_data(font, MS_VDMX_TAG, offset + sizeof(group), vTable, recs * sizeof(VDMX_vTable));
if(result == GDI_ERROR) {
FIXME("Failed to retrieve vTable\n");
goto end;
More information about the wine-cvs
mailing list