-/*
- * FreeType font engine interface
- *
- * Copyright 2001 Huw D M Davies for CodeWeavers.
- * Copyright 2006 Dmitry Timoshkov for CodeWeavers.
- *
- * This file contains the WineEng* functions.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-/*
- *
- * Addaped for the use in ReactOS.
- *
- */
/*
* PROJECT: ReactOS win32 kernel mode subsystem
* LICENSE: GPL - See COPYING in the top level directory
* FILE: subsystems/win32/win32k/objects/freetype.c
- * PURPOSE: Freetype library support
- * PROGRAMMER:
+ * PURPOSE: FreeType font engine interface
+ * PROGRAMMER: Copyright 2001 Huw D M Davies for CodeWeavers.
+ * Copyright 2006 Dmitry Timoshkov for CodeWeavers.
*/
/** Includes ******************************************************************/
#include <win32k.h>
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-#include FT_TYPE1_TABLES_H
-#include <freetype/tttables.h>
-#include <freetype/fttrigon.h>
-#include <freetype/ftglyph.h>
-#include <freetype/ftbitmap.h>
-#include <freetype/ftoutln.h>
-#include <freetype/ftwinfnt.h>
-
#define NDEBUG
#include <debug.h>
static LIST_ENTRY FontCacheListHead;
static UINT FontCacheNumEntries;
-static PWCHAR ElfScripts[32] = /* these are in the order of the fsCsb[0] bits */
+static PWCHAR ElfScripts[32] = /* These are in the order of the fsCsb[0] bits */
{
- L"Western", /*00*/
+ L"Western", /* 00 */
L"Central_European",
L"Cyrillic",
L"Greek",
L"Hebrew",
L"Arabic",
L"Baltic",
- L"Vietnamese", /*08*/
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, /*15*/
+ L"Vietnamese", /* 08 */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 15 */
L"Thai",
L"Japanese",
L"CHINESE_GB2312",
L"Hangul",
L"CHINESE_BIG5",
L"Hangul(Johab)",
- NULL, NULL, /*23*/
+ NULL, NULL, /* 23 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- L"Symbol" /*31*/
+ L"Symbol" /* 31 */
};
/*
{ HANGEUL_CHARSET, 949, {{0,0,0,0},{FS_WANSUNG,0}} },
{ CHINESEBIG5_CHARSET, 950, {{0,0,0,0},{FS_CHINESETRAD,0}} },
{ JOHAB_CHARSET, 1361, {{0,0,0,0},{FS_JOHAB,0}} },
- /* reserved for alternate ANSI and OEM */
+ /* Reserved for alternate ANSI and OEM */
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
- /* reserved for system */
+ /* Reserved for system */
{ DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
{ SYMBOL_CHARSET, CP_SYMBOL, {{0,0,0,0},{FS_SYMBOL,0}} }
};
RtlCopyMemory(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW));
if (lf->lfEscapement != lf->lfOrientation)
{
- /* this should really depend on whether GM_ADVANCED is set */
+ /* This should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
}
TM->tmAscent = (FT_MulFix(Ascent, YScale) + 32) >> 6;
TM->tmDescent = (FT_MulFix(Descent, YScale) + 32) >> 6;
#else /* This (ros) code was previously affected by a FreeType bug, but it works now */
- TM->tmAscent = (Face->size->metrics.ascender + 32) >> 6; /* units above baseline */
- TM->tmDescent = (32 - Face->size->metrics.descender) >> 6; /* units below baseline */
+ TM->tmAscent = (Face->size->metrics.ascender + 32) >> 6; /* Units above baseline */
+ TM->tmDescent = (32 - Face->size->metrics.descender) >> 6; /* Units below baseline */
#endif
TM->tmInternalLeading = (FT_MulFix(Ascent + Descent - Face->units_per_EM, YScale) + 32) >> 6;
case PAN_ANY:
case PAN_NO_FIT:
case PAN_FAMILY_TEXT_DISPLAY:
- case PAN_FAMILY_PICTORIAL: /* symbol fonts get treated as if they were text */
- /* which is clearly not what the panose spec says. */
- if (TM->tmPitchAndFamily == 0) /* fixed */
+ case PAN_FAMILY_PICTORIAL: /* Symbol fonts get treated as if they were text */
+ /* Which is clearly not what the panose spec says. */
+ if (TM->tmPitchAndFamily == 0) /* Fixed */
{
TM->tmPitchAndFamily = FF_MODERN;
}
/* These names should be read from the TT name table */
- /* length of otmpFamilyName */
+ /* Length of otmpFamilyName */
Needed += FamilyNameW.Length + sizeof(WCHAR);
RtlInitUnicodeString(&Regular, L"regular");
- /* length of otmpFaceName */
+ /* Length of otmpFaceName */
if (0 == RtlCompareUnicodeString(&StyleNameW, &Regular, TRUE))
{
- Needed += FamilyNameW.Length + sizeof(WCHAR); /* just the family name */
+ Needed += FamilyNameW.Length + sizeof(WCHAR); /* Just the family name */
}
else
{
Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); /* family + " " + style */
}
- /* length of otmpStyleName */
+ /* Length of otmpStyleName */
Needed += StyleNameW.Length + sizeof(WCHAR);
- /* length of otmpFullName */
+ /* Length of otmpFullName */
Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1);
if (Size < Needed)
return 0;
}
- pPost = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_post); /* we can live with this failing */
+ pPost = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_post); /* We can live with this failing */
Error = FT_Get_WinFNT_Header(FontGDI->face , &Win);
fs.fsCsb[0] |= FS_SYMBOL;
}
if (fs.fsCsb[0] == 0)
- { /* let's see if we can find any interesting cmaps */
+ { /* Let's see if we can find any interesting cmaps */
for (i = 0; i < FontGDI->face->num_charmaps; i++)
{
switch (FontGDI->face->charmaps[i]->encoding)
if(FT_Bitmap_Convert(GlyphSlot->library, &BitmapGlyph->bitmap, &AlignedBitmap, 4))
{
DPRINT1("Conversion failed\n");
+ ExFreePoolWithTag(NewEntry, TAG_FONT);
FT_Done_Glyph((FT_Glyph)BitmapGlyph);
return NULL;
}
IntLockFreeType;
- /* During testing, I never saw this used. In here just incase.*/
+ /* During testing, I never saw this used. It is here just in case. */
if (ft_face->charmap == NULL)
{
DPRINT("WARNING: No charmap selected!\n");
for (n = 0; n < ft_face->num_charmaps; n++)
{
charmap = ft_face->charmaps[n];
- DPRINT("found charmap encoding: %u\n", charmap->encoding);
+ DPRINT("Found charmap encoding: %u\n", charmap->encoding);
if (charmap->encoding != 0)
{
found = charmap;
// FT_Set_Pixel_Sizes(ft_face,
// TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
+ /* FIXME: Should set character height if neg */
// (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
// dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
needsTransform = TRUE;
}
- if (potm) ExFreePoolWithTag(potm, GDITAG_TEXT); /* It looks like we are finished with potm ATM.*/
+ if (potm) ExFreePoolWithTag(potm, GDITAG_TEXT); /* It looks like we are finished with potm ATM. */
if (!needsTransform)
{
bottom = bottom & -64;
top = (top + 63) & -64;
- DPRINT("transformed box: (%d,%d - %d,%d)\n", left, top, right, bottom);
+ DPRINT("Transformed box: (%d,%d - %d,%d)\n", left, top, right, bottom);
vec.x = ft_face->glyph->metrics.horiAdvance;
vec.y = 0;
FT_Vector_Transform(&vec, &transMat);
if (ft_face->glyph->format != ft_glyph_format_outline && iFormat != GGO_BITMAP)
{
- DPRINT1("loaded a bitmap\n");
+ DPRINT1("Loaded a bitmap\n");
return GDI_ERROR;
}
break;
default:
- DPRINT1("loaded glyph format %x\n", ft_face->glyph->format);
+ DPRINT1("Loaded glyph format %x\n", ft_face->glyph->format);
return GDI_ERROR;
}
break;
}
}
default:
- DPRINT1("loaded glyph format %x\n", ft_face->glyph->format);
+ DPRINT1("Loaded glyph format %x\n", ft_face->glyph->format);
return GDI_ERROR;
}
start = pvBuf;
else if (point <= outline->contours[contour] &&
outline->tags[point] & FT_Curve_Tag_On)
{
- /* add closing pt for bezier */
+ /* Add closing pt for bezier */
if (pvBuf)
FTVectorToPOINTFX(&outline->points[point], &ppc->apfx[cpfx]);
cpfx++;
(outline->tags[point] & FT_Curve_Tag_On) ==
(outline->tags[point-1] & FT_Curve_Tag_On));
/* At the end of a contour Windows adds the start point,
- but only for Beziers and we've already done that.
- */
+ but only for Beziers and we've already done that. */
if (point <= outline->contours[contour] &&
outline->tags[point] & FT_Curve_Tag_On)
{
for (n = 0; n < face->num_charmaps; n++)
{
charmap = face->charmaps[n];
- DPRINT("found charmap encoding: %u\n", charmap->encoding);
+ DPRINT("Found charmap encoding: %u\n", charmap->encoding);
if (charmap->encoding != 0)
{
found = charmap;
error = FT_Set_Pixel_Sizes(face,
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
- (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
- dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
+ /* FIXME: Should set character height if neg */
+ (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
+ dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
if (error)
{
DPRINT1("Error in setting pixel sizes: %u\n", error);
}
}
- /* retrieve kerning distance */
+ /* Retrieve kerning distance */
if (use_kerning && previous && glyph_index)
{
FT_Vector delta;
}
DPRINT("Csb 1=%x 0=%x\n", fs.fsCsb[1],fs.fsCsb[0]);
if (fs.fsCsb[0] == 0)
- { /* let's see if we can find any interesting cmaps */
+ { /* Let's see if we can find any interesting cmaps */
for (i = 0; i < Face->num_charmaps; i++)
{
switch (Face->charmaps[i]->encoding)
{
if (IntTranslateCharsetInfo(&fs0, &csi, TCI_SRCFONTSIG))
{
- //*cp = csi.ciACP;
+ // *cp = csi.ciACP;
DPRINT("Hit 2\n");
Ret = csi.ciCharset;
goto Exit;
char_code_prev = char_code = FT_Get_First_Char(face, &glyph_code);
- DPRINT("face encoding FT_ENCODING_UNICODE, number of glyphs %ld, first glyph %u, first char %04lx\n",
+ DPRINT("Face encoding FT_ENCODING_UNICODE, number of glyphs %ld, first glyph %u, first char %04lx\n",
face->num_glyphs, glyph_code, char_code);
if (!glyph_code) return 0;
{
if (char_code < char_code_prev)
{
- DPRINT1("expected increasing char code from FT_Get_Next_Char\n");
+ DPRINT1("Expected increasing char code from FT_Get_Next_Char\n");
return 0;
}
if (char_code - char_code_prev > 1)
}
}
else
- DPRINT1("encoding %u not supported\n", face->charmap->encoding);
+ DPRINT1("Encoding %u not supported\n", face->charmap->encoding);
size = sizeof(GLYPHSET) + sizeof(WCRANGE) * (num_ranges - 1);
if (glyphset)
IntLockFreeType;
Error = FT_Set_Pixel_Sizes(Face,
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
+ /* FIXME: Should set character height if neg */
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
IntUnLockFreeType;
{
Font->FontObj.flFontType |= FO_POSTSCRIPT;
}
- /* check for the presence of the 'CFF ' table to check if the font is Type1 */
+ /* Check for the presence of the 'CFF ' table to check if the font is Type1 */
if (!FT_Load_Sfnt_Table(Font->face, FT_MAKE_TAG('C','F','F',' '), 0, NULL, &tmp_size))
{
Font->FontObj.flFontType |= (FO_CFF|FO_POSTSCRIPT);
Status = ZwOpenFile(
&hFile,
- 0, //FILE_READ_ATTRIBUTES,
+ 0, // FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
{
if (RtlEqualUnicodeString(&NameInfo1->Name, &NameInfo2->Name, FALSE))
{
- /* found */
+ /* Found */
FontFamilyFillInfo(&Info, FontEntry->FaceName.Buffer, FontEntry->Font);
bFound = TRUE;
break;
switch (dwType)
{
- case 0: /* FIXME: returns 1 or 2, don't know what this is atm */
+ case 0: /* FIXME: Returns 1 or 2, don't know what this is atm */
*(DWORD*)pBuffer = 1;
*pdwBytes = sizeof(DWORD);
break;
}
-//////////////////
+///////////////////////////////////////////////////////////////////////////
//
// Functions needing sorting.
//
-///////////////
+///////////////////////////////////////////////////////////////////////////
int APIENTRY
NtGdiGetFontFamilyInfo(HDC Dc,
LPLOGFONTW UnsafeLogFont,
for (n = 0; n < face->num_charmaps; n++)
{
charmap = face->charmaps[n];
- DPRINT("found charmap encoding: %u\n", charmap->encoding);
+ DPRINT("Found charmap encoding: %u\n", charmap->encoding);
if (charmap->encoding != 0)
{
found = charmap;
error = FT_Set_Pixel_Sizes(
face,
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
+ /* FIXME: Should set character height if neg */
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
if (error)
}
}
- /* retrieve kerning distance */
+ /* Retrieve kerning distance */
if (use_kerning && previous && glyph_index)
{
FT_Vector delta;
previous = 0;
- if (pdcattr->lTextAlign & TA_RIGHT)
+ if ((pdcattr->lTextAlign & TA_CENTER) == TA_CENTER)
{
- RealXStart -= TextWidth;
+ RealXStart -= TextWidth / 2;
}
else
{
- RealXStart -= TextWidth / 2;
+ RealXStart -= TextWidth;
}
}
* brush.
*/
- if (lprc &&
- (fuOptions & ETO_CLIPPED) &&
+ if (lprc && (fuOptions & ETO_CLIPPED) &&
DestRect.right >= lprc->right + dc->ptlDCOrig.x)
{
// We do the check '>=' instead of '>' to possibly save an iteration
DestRect.right = lprc->right + dc->ptlDCOrig.x;
DoBreak = TRUE;
}
+ if (lprc && (fuOptions & ETO_CLIPPED) &&
+ DestRect.bottom >= lprc->bottom + dc->ptlDCOrig.y)
+ {
+ DestRect.bottom = lprc->bottom + dc->ptlDCOrig.y;
+ }
MouseSafetyOnDrawStart(dc->ppdev, DestRect.left, DestRect.top, DestRect.right, DestRect.bottom);
IntEngMaskBlt(
SurfObj,
if (NULL == Dx)
{
TextLeft += realglyph->root.advance.x >> 10;
- DPRINT("new TextLeft: %d\n", TextLeft);
+ DPRINT("New TextLeft: %d\n", TextLeft);
}
else
{
TextLeft += Dx[i<<DxShift] << 6;
- DPRINT("new TextLeft2: %d\n", TextLeft);
+ DPRINT("New TextLeft2: %d\n", TextLeft);
}
if (DxShift)
IntLockFreeType;
FT_Set_Pixel_Sizes(face,
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
+ /* FIXME: Should set character height if neg */
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
adv = (face->glyph->advance.x + 32) >> 6;
// int test = (INT)(face->glyph->metrics.horiAdvance + 63) >> 6;
-// DPRINT1("Advance Wine %d and Advance Ros %d\n",test, adv ); /* It's the same!*/
+// DPRINT1("Advance Wine %d and Advance Ros %d\n",test, adv ); /* It's the same! */
lsb = left >> 6;
bbx = (right - left) >> 6;
IntLockFreeType;
FT_Set_Pixel_Sizes(face,
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth,
- /* FIXME should set character height if neg */
+ /* FIXME: Should set character height if neg */
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ?
dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)));
for (i = 0; i < cwc; i++)
{
- Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]); // FIXME: unsafe!
+ Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]); // FIXME: Unsafe!
if (Buffer[i] == 0)
{
Buffer[i] = DefChar;
return GDI_ERROR;
}
-
/* EOF */