ttc & sbit patch
Won Kyu Park
wkpark at chem.skku.ac.kr
Fri Jun 7 05:58:05 CDT 2002
Hello,
This is a quick hack for ttc fonts and it enables embeded sbits in ttc/ttf
with a recent freetype library.
It is based on a Korean patch but I don't know who make it :-)
Regards,
Won kyu Park
-------------- next part --------------
--- freetype.c.orig Thu Jun 6 14:56:09 2002
+++ freetype.c Fri Jun 7 19:22:21 2002
@@ -95,9 +95,13 @@
MAKE_FUNCPTR(FT_Vector_Rotate)
#undef MAKE_FUNCPTR
+#define USE_TTC
typedef struct tagFace {
WCHAR *StyleName;
char *file;
+#ifdef USE_TTC
+ int index;
+#endif
BOOL Italic;
BOOL Bold;
DWORD fsCsb[2]; /* codepage bitfield from FONTSIGNATURE */
@@ -161,6 +165,8 @@
static WCHAR TurkishW[] = {'T','u','r','k','i','s','h','\0'};
static WCHAR VietnameseW[] = {'V','i','e','t','n','a','m','e','s','e','\0'};
static WCHAR WesternW[] = {'W','e','s','t','e','r','n','\0'};
+static WCHAR JisJapanW[] = {'J','i','s','J','a','p','a','n','\0'};
+static WCHAR HangulW[] = {'H','a','n','g','u','l','\0'};
static WCHAR *ElfScriptsW[32] = { /* these are in the order of the fsCsb[0] bits */
WesternW, /*00*/
@@ -174,7 +180,7 @@
VietnameseW, /*08*/
NULL, NULL, NULL, NULL, NULL, NULL, NULL, /*15*/
ThaiW,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, /*23*/
+ JisJapanW, NULL, HangulW, NULL, NULL, NULL, NULL, /*23*/
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SymbolW /*31*/
};
@@ -198,22 +204,31 @@
TT_OS2 *pOS2;
WCHAR *FamilyW, *StyleW;
DWORD len;
- Family *family = FontList;
- Family **insert = &FontList;
+ Family *family;// = FontList;
+ Family **insert;// = &FontList;
Face **insertface;
FT_Error err;
int i;
+ int j,fn;
+
+ fn=1;
+
+ for (j=0; j<fn;j++ ) {
TRACE("Loading font file %s\n", debugstr_a(file));
- if((err = pFT_New_Face(library, file, 0, &ft_face)) != 0) {
+ if((err = pFT_New_Face(library, file, j, &ft_face)) != 0) {
ERR("Unable to load font file %s err = %x\n", debugstr_a(file), err);
return FALSE;
}
-
- if(!FT_IS_SFNT(ft_face)) { /* for now we'll skip everything but TT/OT */
+#ifdef USE_TTC
+ fn=ft_face->num_faces;
+#endif
+ if(ft_face->num_faces==1 && !FT_IS_SFNT(ft_face)) { /* for now we'll skip everything but TT/OT */
pFT_Done_Face(ft_face);
return FALSE;
}
+ family = FontList;
+ insert = &FontList;
len = MultiByteToWideChar(CP_ACP, 0, ft_face->family_name, -1, NULL, 0);
FamilyW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
@@ -253,6 +268,9 @@
(*insertface)->StyleName = StyleW;
(*insertface)->file = HeapAlloc(GetProcessHeap(),0,strlen(file)+1);
strcpy((*insertface)->file, file);
+#ifdef USE_TTC
+ (*insertface)->index = j;
+#endif
(*insertface)->next = NULL;
(*insertface)->Italic = (ft_face->style_flags & FT_STYLE_FLAG_ITALIC) ? 1 : 0;
(*insertface)->Bold = (ft_face->style_flags & FT_STYLE_FLAG_BOLD) ? 1 : 0;
@@ -281,11 +299,11 @@
}
}
}
-
- pFT_Done_Face(ft_face);
-
TRACE("Added font %s %s\n", debugstr_w(family->FamilyName),
debugstr_w(StyleW));
+ pFT_Done_Face(ft_face);
+ }
+
return TRUE;
}
@@ -574,13 +592,21 @@
static LONG load_VDMX(GdiFont, LONG);
+#ifndef USE_TTC
static FT_Face OpenFontFile(GdiFont font, char *file, LONG height)
+#else
+static FT_Face OpenFontFile(GdiFont font, Face *face, LONG height)
+#endif
{
FT_Error err;
FT_Face ft_face;
LONG ppem;
+#ifndef USE_TTC
err = pFT_New_Face(library, file, 0, &ft_face);
+#else
+ err = pFT_New_Face(library, face->file, face->index, &ft_face);
+#endif
if(err) {
ERR("FT_New_Face rets %d\n", err);
return 0;
@@ -894,8 +920,13 @@
TRACE("Choosen %s %s\n", debugstr_w(family->FamilyName),
debugstr_w(face->StyleName));
+#ifndef USE_TTC
ret->ft_face = OpenFontFile(ret, face->file,
INTERNAL_YWSTODS(dc,plf->lfHeight));
+#else
+ ret->ft_face = OpenFontFile(ret, face,
+ INTERNAL_YWSTODS(dc,plf->lfHeight));
+#endif
if (!ret->ft_face)
{
GDI_ReleaseObj(hfont);
@@ -967,7 +998,11 @@
UINT size;
GdiFont font = alloc_font();
+#ifndef USE_TTC
if (!(font->ft_face = OpenFontFile(font, face->file, 100)))
+#else
+ if (!(font->ft_face = OpenFontFile(font, face, 100)) || !FT_IS_SFNT(font->ft_face) )
+#endif
{
free_font(font);
return;
@@ -1266,13 +1301,42 @@
if(format == GGO_METRICS)
return 1; /* FIXME */
+#define ENABLE_EMBEDED_BITMAP
+#ifndef ENABLE_EMBEDED_BITMAP
if(ft_face->glyph->format != ft_glyph_format_outline) {
FIXME("loaded a bitmap\n");
return GDI_ERROR;
}
+#endif
switch(format) {
case GGO_BITMAP:
+#ifdef ENABLE_EMBEDED_BITMAP
+ /* TT embedded bitmap or .fon files bitmap */
+
+ if ( ft_face->glyph->format == ft_glyph_format_bitmap )
+ {
+ width = ft_face->glyph->bitmap.width;
+ height = ft_face->glyph->bitmap.rows;
+ pitch = (width + 31) / 32 * 4;
+ needed = pitch * height;
+ if(!buf || !buflen) break;
+ if ( buf )
+ {
+ int pitchf;
+ unsigned char *bbuf;
+
+ memset(buf, 0, needed);
+
+ pitchf = ft_face->glyph->bitmap.pitch;
+ bbuf = ft_face->glyph->bitmap.buffer;
+ for ( ; height ; height--, buf+=pitch, bbuf+=pitchf )
+ memcpy( buf, bbuf, pitchf );
+ }
+ }
+ else
+ {
+#endif
width = lpgm->gmBlackBoxX;
height = lpgm->gmBlackBoxY;
pitch = (width + 31) / 32 * 4;
@@ -1299,6 +1363,9 @@
/* Note: FreeType will only set 'black' bits for us. */
memset(buf, 0, needed);
pFT_Outline_Get_Bitmap(library, &ft_face->glyph->outline, &ft_bitmap);
+#ifdef ENABLE_EMBEDED_BITMAP
+ }
+#endif
break;
case GGO_GRAY2_BITMAP:
More information about the wine-devel
mailing list