Alexandre Julliard : gdi32: Move checking of the subpixel support and gasp flags to freetype.c.
Alexandre Julliard
julliard at winehq.org
Fri Nov 2 15:52:02 CDT 2012
Module: wine
Branch: master
Commit: 123da6f888b954c242bd49a4abab8cad0e1436fb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=123da6f888b954c242bd49a4abab8cad0e1436fb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Nov 2 17:21:28 2012 +0100
gdi32: Move checking of the subpixel support and gasp flags to freetype.c.
---
dlls/gdi32/font.c | 101 ++---------------------------------
dlls/gdi32/freetype.c | 138 +++++++++++++++++++++++++++++++++++++------------
2 files changed, 110 insertions(+), 129 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index a2d4d3e..09ea1b7 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -39,12 +39,6 @@
#include "wine/unicode.h"
#include "wine/debug.h"
-#ifdef WORDS_BIGENDIAN
-#define get_be_word(x) (x)
-#else
-#define get_be_word(x) RtlUshortByteSwap(x)
-#endif
-
WINE_DEFAULT_DEBUG_CHANNEL(font);
/* Device -> World size conversion */
@@ -266,69 +260,6 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC
memcpy(&ptmA->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
}
-static DWORD get_font_ppem( HDC hdc )
-{
- TEXTMETRICW tm;
- DWORD ppem;
- DC *dc = get_dc_ptr( hdc );
-
- if (!dc) return GDI_ERROR;
-
- GetTextMetricsW( hdc, &tm );
- ppem = abs( INTERNAL_YWSTODS( dc, tm.tmAscent + tm.tmDescent - tm.tmInternalLeading ) );
- release_dc_ptr( dc );
- return ppem;
-}
-
-#define GASP_GRIDFIT 0x01
-#define GASP_DOGRAY 0x02
-
-static BOOL get_gasp_flags( HDC hdc, WORD *flags )
-{
- DWORD size, gasp_tag = 0x70736167;
- WORD buf[16]; /* Enough for seven ranges before we need to alloc */
- WORD *alloced = NULL, *ptr = buf;
- WORD num_recs, version;
- DWORD ppem = get_font_ppem( hdc );
- BOOL ret = FALSE;
-
- *flags = 0;
- if (ppem == GDI_ERROR) return FALSE;
-
- size = GetFontData( hdc, gasp_tag, 0, NULL, 0 );
- if (size == GDI_ERROR) return FALSE;
- if (size < 4 * sizeof(WORD)) return FALSE;
- if (size > sizeof(buf))
- {
- ptr = alloced = HeapAlloc( GetProcessHeap(), 0, size );
- if (!ptr) return FALSE;
- }
-
- GetFontData( hdc, gasp_tag, 0, ptr, size );
-
- version = get_be_word( *ptr++ );
- num_recs = get_be_word( *ptr++ );
-
- if (version > 1 || size < (num_recs * 2 + 2) * sizeof(WORD))
- {
- FIXME( "Unsupported gasp table: ver %d size %d recs %d\n", version, size, num_recs );
- goto done;
- }
-
- while (num_recs--)
- {
- *flags = get_be_word( *(ptr + 1) );
- if (ppem <= get_be_word( *ptr )) break;
- ptr += 2;
- }
- TRACE( "got flags %04x for ppem %d\n", *flags, ppem );
- ret = TRUE;
-
-done:
- HeapFree( GetProcessHeap(), 0, alloced );
- return ret;
-}
-
enum smoothing { no_smoothing, aa_smoothing, subpixel_smoothing };
static DWORD get_desktop_value( const WCHAR *name, DWORD *value )
@@ -392,19 +323,8 @@ static UINT get_subpixel_orientation( void )
UINT get_font_aa_flags( HDC hdc, const LOGFONTW *lf )
{
- WORD gasp_flags;
- static int hinter = -1;
- static int subpixel_enabled = -1;
enum smoothing smoothing;
- if (hinter == -1 || subpixel_enabled == -1)
- {
- RASTERIZER_STATUS status;
- GetRasterizerCaps(&status, sizeof(status));
- hinter = status.wFlags & WINE_TT_HINTER_ENABLED;
- subpixel_enabled = status.wFlags & WINE_TT_SUBPIXEL_RENDERING_ENABLED;
- }
-
switch (lf->lfQuality)
{
case NONANTIALIASED_QUALITY:
@@ -423,24 +343,15 @@ UINT get_font_aa_flags( HDC hdc, const LOGFONTW *lf )
smoothing = get_default_smoothing();
}
- if (smoothing == subpixel_smoothing)
- {
- if (subpixel_enabled)
- {
- UINT ret = get_subpixel_orientation();
- if (ret != GGO_GRAY4_BITMAP) return ret;
- }
- smoothing = aa_smoothing;
- }
-
- if (smoothing == aa_smoothing)
+ switch (smoothing)
{
- if (hinter && get_gasp_flags( hdc, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY))
- return GGO_BITMAP;
+ case subpixel_smoothing:
+ return get_subpixel_orientation();
+ case aa_smoothing:
return GGO_GRAY4_BITMAP;
+ default:
+ return GGO_BITMAP;
}
-
- return GGO_BITMAP;
}
/***********************************************************************
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index ad179f1..a70b853 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -894,6 +894,44 @@ static inline FT_Fixed FT_FixedFromFIXED(FIXED f)
return (FT_Fixed)((int)f.value << 16 | (unsigned int)f.fract);
}
+static BOOL is_hinting_enabled(void)
+{
+ static int enabled = -1;
+
+ if (enabled == -1)
+ {
+ /* Use the >= 2.2.0 function if available */
+ if (pFT_Get_TrueType_Engine_Type)
+ {
+ FT_TrueTypeEngineType type = pFT_Get_TrueType_Engine_Type(library);
+ enabled = (type == FT_TRUETYPE_ENGINE_TYPE_PATENTED);
+ }
+#ifdef FT_DRIVER_HAS_HINTER
+ else
+ {
+ /* otherwise if we've been compiled with < 2.2.0 headers use the internal macro */
+ FT_Module mod = pFT_Get_Module(library, "truetype");
+ enabled = (mod && FT_DRIVER_HAS_HINTER(mod));
+ }
+#endif
+ else enabled = FALSE;
+ }
+ return enabled;
+}
+
+static BOOL is_subpixel_rendering_enabled( void )
+{
+#ifdef HAVE_FREETYPE_FTLCDFIL_H
+ static int enabled = -1;
+ if (enabled == -1)
+ enabled = (pFT_Library_SetLcdFilter &&
+ pFT_Library_SetLcdFilter( NULL, 0 ) != FT_Err_Unimplemented_Feature);
+ return enabled;
+#else
+ return FALSE;
+#endif
+}
+
static const struct list *get_face_list_from_family(const Family *family)
{
@@ -4426,6 +4464,53 @@ static FT_Encoding pick_charmap( FT_Face face, int charset )
return *encs;
}
+#define GASP_GRIDFIT 0x01
+#define GASP_DOGRAY 0x02
+#define GASP_TAG MS_MAKE_TAG('g','a','s','p')
+
+static BOOL get_gasp_flags( GdiFont *font, WORD *flags )
+{
+ DWORD size;
+ WORD buf[16]; /* Enough for seven ranges before we need to alloc */
+ WORD *alloced = NULL, *ptr = buf;
+ WORD num_recs, version;
+ BOOL ret = FALSE;
+
+ *flags = 0;
+ size = get_font_data( font, GASP_TAG, 0, NULL, 0 );
+ if (size == GDI_ERROR) return FALSE;
+ if (size < 4 * sizeof(WORD)) return FALSE;
+ if (size > sizeof(buf))
+ {
+ ptr = alloced = HeapAlloc( GetProcessHeap(), 0, size );
+ if (!ptr) return FALSE;
+ }
+
+ get_font_data( font, GASP_TAG, 0, ptr, size );
+
+ version = GET_BE_WORD( *ptr++ );
+ num_recs = GET_BE_WORD( *ptr++ );
+
+ if (version > 1 || size < (num_recs * 2 + 2) * sizeof(WORD))
+ {
+ FIXME( "Unsupported gasp table: ver %d size %d recs %d\n", version, size, num_recs );
+ goto done;
+ }
+
+ while (num_recs--)
+ {
+ *flags = GET_BE_WORD( *(ptr + 1) );
+ if (font->ft_face->size->metrics.y_ppem <= GET_BE_WORD( *ptr )) break;
+ ptr += 2;
+ }
+ TRACE( "got flags %04x for ppem %d\n", *flags, font->ft_face->size->metrics.y_ppem );
+ ret = TRUE;
+
+done:
+ HeapFree( GetProcessHeap(), 0, alloced );
+ return ret;
+}
+
/*************************************************************
* freetype_SelectFont
*/
@@ -4868,6 +4953,25 @@ found_face:
done:
if (ret)
{
+ /* fixup the antialiasing flags for that font */
+ switch (*aa_flags)
+ {
+ case WINE_GGO_HRGB_BITMAP:
+ case WINE_GGO_HBGR_BITMAP:
+ case WINE_GGO_VRGB_BITMAP:
+ case WINE_GGO_VBGR_BITMAP:
+ if (is_subpixel_rendering_enabled()) break;
+ *aa_flags = GGO_GRAY4_BITMAP;
+ /* fall through */
+ case GGO_GRAY4_BITMAP:
+ if (is_hinting_enabled())
+ {
+ WORD gasp_flags;
+ if (get_gasp_flags( ret, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY))
+ *aa_flags = GGO_BITMAP;
+ }
+ break;
+ }
dc->gdiFont = ret;
physdev->font = ret;
}
@@ -7430,40 +7534,6 @@ static BOOL freetype_FontIsLinked( PHYSDEV dev )
return ret;
}
-static BOOL is_hinting_enabled(void)
-{
- /* Use the >= 2.2.0 function if available */
- if(pFT_Get_TrueType_Engine_Type)
- {
- FT_TrueTypeEngineType type = pFT_Get_TrueType_Engine_Type(library);
- return type == FT_TRUETYPE_ENGINE_TYPE_PATENTED;
- }
-#ifdef FT_DRIVER_HAS_HINTER
- else
- {
- FT_Module mod;
-
- /* otherwise if we've been compiled with < 2.2.0 headers
- use the internal macro */
- mod = pFT_Get_Module(library, "truetype");
- if(mod && FT_DRIVER_HAS_HINTER(mod))
- return TRUE;
- }
-#endif
-
- return FALSE;
-}
-
-static BOOL is_subpixel_rendering_enabled( void )
-{
-#ifdef HAVE_FREETYPE_FTLCDFIL_H
- return pFT_Library_SetLcdFilter &&
- pFT_Library_SetLcdFilter( NULL, 0 ) != FT_Err_Unimplemented_Feature;
-#else
- return FALSE;
-#endif
-}
-
/*************************************************************************
* GetRasterizerCaps (GDI32.@)
*/
More information about the wine-cvs
mailing list