From 0d2352884a00d5caf8ff74042890c074ccdd091e Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Fri, 11 Jan 2019 10:55:55 +0800 Subject: [PATCH] tune style for LOGFONT --- include/gdi.h | 117 +++++++++++++++++++++++++++---------------- src/font/fontname.c | 67 ++++++++++++++++++++++--- src/font/freetype2.c | 5 +- src/font/logfont.c | 2 +- src/font/qpf.c | 9 ++-- src/font/upf.c | 9 ++-- 6 files changed, 149 insertions(+), 60 deletions(-) diff --git a/include/gdi.h b/include/gdi.h index 068ce12a..87e50373 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -5459,24 +5459,26 @@ MG_EXPORT int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc #define FONT_WEIGHT_NIL '\0' #define FONT_WEIGHT_ALL '*' -#define FONT_WEIGHT_BLACK 'c' -#define FONT_WEIGHT_BOLD 'b' -#define FONT_WEIGHT_BOOK 'k' -#define FONT_WEIGHT_DEMIBOLD 'd' +#define FONT_WEIGHT_THIN 't' +#define FONT_WEIGHT_EXTRA_LIGHT 'e' #define FONT_WEIGHT_LIGHT 'l' -#define FONT_WEIGHT_MEDIUM 'm' #define FONT_WEIGHT_REGULAR 'r' -#define FONT_WEIGHT_SUBPIXEL 's' +#define FONT_WEIGHT_MEDIUM 'm' +#define FONT_WEIGHT_DEMIBOLD 'd' +#define FONT_WEIGHT_BOLD 'b' +#define FONT_WEIGHT_EXTRA_BOLD 'x' +#define FONT_WEIGHT_BLACK 'c' #define FS_WEIGHT_MASK 0x000000FF -#define FS_WEIGHT_BLACK 0x00000001 -#define FS_WEIGHT_BOLD 0x00000002 -#define FS_WEIGHT_BOOK 0x00000004 -#define FS_WEIGHT_DEMIBOLD 0x00000006 /* BOOK | BOLD */ -#define FS_WEIGHT_LIGHT 0x00000010 -#define FS_WEIGHT_MEDIUM 0x00000020 -#define FS_WEIGHT_SUBPIXEL 0x00000040 +#define FS_WEIGHT_THIN 0x00000010 +#define FS_WEIGHT_EXTRA_LIGHT 0x00000011 +#define FS_WEIGHT_LIGHT 0x00000012 #define FS_WEIGHT_REGULAR 0x00000000 +#define FS_WEIGHT_MEDIUM 0x00000020 +#define FS_WEIGHT_DEMIBOLD 0x00000021 +#define FS_WEIGHT_EXTRA_BOLD 0x00000022 +#define FS_WEIGHT_BOLD 0x00000023 +#define FS_WEIGHT_BLACK 0x00000024 #define FONT_SLANT_NIL '\0' #define FONT_SLANT_ALL '*' @@ -5490,9 +5492,10 @@ MG_EXPORT int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc #define FS_SLANT_ROMAN 0x00000000 #define FONT_FLIP_NIL '\0' -#define FONT_FLIP_HORZ 'H' -#define FONT_FLIP_VERT 'V' -#define FONT_FLIP_HORZVERT 'T' +#define FONT_FLIP_HORZ 'h' +#define FONT_FLIP_VERT 'v' +#define FONT_FLIP_HORZVERT 't' +#define FONT_FLIP_NONE 'n' #define FS_FLIP_MASK 0x0000F000 #define FS_FLIP_HORZ 0x00001000 @@ -5500,20 +5503,68 @@ MG_EXPORT int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc #define FS_FLIP_HORZVERT 0x00003000 /* HORZ | VERT */ #define FONT_OTHER_NIL '\0' -#define FONT_OTHER_AUTOSCALE 'S' -#define FONT_OTHER_TTFNOCACHE 'N' -#define FONT_OTHER_TTFKERN 'K' -#define FONT_OTHER_TTFNOCACHEKERN 'R' -#define FONT_OTHER_LCDPORTRAIT 'P' -#define FONT_OTHER_LCDPORTRAITKERN 'Q' +#define FONT_OTHER_AUTOSCALE 's' +#define FONT_OTHER_TTFNOCACHE 'n' +#define FONT_OTHER_TTFKERN 'k' +#define FONT_OTHER_TTFNOCACHEKERN 'r' +#define FONT_OTHER_LCDPORTRAIT 'p' +#define FONT_OTHER_LCDPORTRAITKERN 'q' #define FS_OTHER_MASK 0x00FF0000 #define FS_OTHER_AUTOSCALE 0x00010000 #define FS_OTHER_TTFNOCACHE 0x00020000 #define FS_OTHER_TTFKERN 0x00040000 -#define FS_OTHER_TTFNOCACHEKERN 0x00060000 /* KERN | NOCACHE */ #define FS_OTHER_LCDPORTRAIT 0x00100000 -#define FS_OTHER_LCDPORTRAITKERN 0x00140000 +#define FS_OTHER_TTFNOCACHEKERN 0x00060000 /* KERN | NOCACHE */ +#define FS_OTHER_LCDPORTRAITKERN 0x00140000 /* KERN | PORTRAIT */ + +#define FONT_DECORATE_NIL '\0' +#define FONT_DECORATE_NONE 'n' +#define FONT_DECORATE_UNDERLINE 'u' +#define FONT_DECORATE_STRUCKOUT 's' +#define FONT_DECORATE_BOTH 'b' + +#define FS_DECORATE_MASK 0x0F000000 +#define FS_DECORATE_UNDERLINE 0x01000000 +#define FS_DECORATE_STRUCKOUT 0x02000000 +#define FS_DECORATE_BOTH 0x03000000 + +#define FONT_RENDER_NIL '\0' +#define FONT_RENDER_MONO 'n' +#define FONT_RENDER_GREY 'g' +#define FONT_RENDER_SUBPIXEL 's' + +#define FS_RENDER_MASK 0xF0000000 +#define FS_RENDER_MONO 0x00000000 +#define FS_RENDER_GREY 0x10000000 +#define FS_RENDER_SUBPIXEL 0x20000000 + +/* deprecated since v3.2.1, use FS_RENDER_XXX/FONT_RENDER_XXX instead */ +#define FONT_WEIGHT_SUBPIXEL 's' +#define FONT_WEIGHT_BOOK 'k' + +/* deprecated since v3.2.1, use FS_DECORATE_XXX/FONT_DECORATE_XXX instead */ +#define FONT_UNDERLINE_NIL '\0' +#define FONT_UNDERLINE_ALL '*' +#define FONT_UNDERLINE_LINE 'u' +#define FONT_UNDERLINE_NONE 'n' +#define FONT_STRUCKOUT_NIL '\0' +#define FONT_STRUCKOUT_ALL '*' +#define FONT_STRUCKOUT_LINE 's' +#define FONT_STRUCKOUT_NONE 'n' + +/* +#define FS_WEIGHT_SUBPIXEL 0x00000000 +#define FS_WEIGHT_BOOK 0x00000000 + +#define FS_UNDERLINE_MASK 0x00000000 +#define FS_UNDERLINE_LINE 0x00000000 +#define FS_UNDERLINE_NONE 0x00000000 + +#define FS_STRUCKOUT_MASK 0x00000000 +#define FS_STRUCKOUT_LINE 0x00000000 +#define FS_STRUCKOUT_NONE 0x00000000 +*/ /* * Backward compatiblilty definitions. @@ -5550,24 +5601,6 @@ MG_EXPORT int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc #define FS_SPACING_CHARCELL 0x00000000 */ -#define FONT_UNDERLINE_NIL '\0' -#define FONT_UNDERLINE_ALL '*' -#define FONT_UNDERLINE_LINE 'u' -#define FONT_UNDERLINE_NONE 'n' - -#define FS_UNDERLINE_MASK 0x00F00000 -#define FS_UNDERLINE_LINE 0x00100000 -#define FS_UNDERLINE_NONE 0x00000000 - -#define FONT_STRUCKOUT_NIL '\0' -#define FONT_STRUCKOUT_ALL '*' -#define FONT_STRUCKOUT_LINE 's' -#define FONT_STRUCKOUT_NONE 'n' - -#define FS_STRUCKOUT_MASK 0x0F000000 -#define FS_STRUCKOUT_LINE 0x01000000 -#define FS_STRUCKOUT_NONE 0x00000000 - #define FONT_TYPE_NAME_LEN 3 #define FONT_TYPE_NAME_BITMAP_RAW "rbf" #define FONT_TYPE_NAME_BITMAP_VAR "vbf" diff --git a/src/font/fontname.c b/src/font/fontname.c index 60435620..ac3910f3 100644 --- a/src/font/fontname.c +++ b/src/font/fontname.c @@ -131,38 +131,53 @@ DWORD fontConvertStyle (const char* style_part) { DWORD style = 0; + style &= ~FS_WEIGHT_MASK; switch (style_part [0]) { case FONT_WEIGHT_BLACK: style |= FS_WEIGHT_BLACK; break; + case FONT_WEIGHT_EXTRA_BOLD: + style |= FS_WEIGHT_EXTRA_BOLD; + break; case FONT_WEIGHT_BOLD: style |= FS_WEIGHT_BOLD; break; + /* deprecated since v3.2.1 case FONT_WEIGHT_BOOK: style |= FS_WEIGHT_BOOK; break; + */ case FONT_WEIGHT_DEMIBOLD: style |= FS_WEIGHT_DEMIBOLD; break; - case FONT_WEIGHT_LIGHT: - style |= FS_WEIGHT_LIGHT; - break; case FONT_WEIGHT_MEDIUM: style |= FS_WEIGHT_MEDIUM; break; case FONT_WEIGHT_REGULAR: style |= FS_WEIGHT_REGULAR; break; - case FONT_WEIGHT_SUBPIXEL: - style |= FS_WEIGHT_SUBPIXEL; - break; + case FONT_WEIGHT_LIGHT: + style |= FS_WEIGHT_LIGHT; + break; + case FONT_WEIGHT_EXTRA_LIGHT: + style |= FS_WEIGHT_EXTRA_LIGHT; + break; + case FONT_WEIGHT_THIN: + style |= FS_WEIGHT_THIN; + break; + /* deprecated since v3.2.1 + case FONT_WEIGHT_SUBPIXEL: + style |= FS_WEIGHT_SUBPIXEL; + break; case FONT_WEIGHT_ALL: style |= FS_WEIGHT_MASK; - break; + break; + */ default: - return 0xFFFFFFFF; + break; } + style &= ~FS_SLANT_MASK; switch (style_part [1]) { case FONT_SLANT_ITALIC: style |= FS_SLANT_ITALIC; @@ -180,6 +195,7 @@ DWORD fontConvertStyle (const char* style_part) return 0xFFFFFFFF; } + style &= ~FS_FLIP_MASK; switch (style_part [2]) { case FONT_FLIP_HORZ: style |= FS_FLIP_HORZ; @@ -194,6 +210,7 @@ DWORD fontConvertStyle (const char* style_part) break; } + style &= ~FS_OTHER_MASK; switch (style_part [3]) { case FONT_OTHER_AUTOSCALE: style |= FS_OTHER_AUTOSCALE; @@ -217,6 +234,39 @@ DWORD fontConvertStyle (const char* style_part) break; } + style &= ~FS_DECORATE_MASK; + switch (style_part [4]) { + case FONT_DECORATE_NONE: + break; + case FONT_DECORATE_UNDERLINE: + style |= FS_DECORATE_UNDERLINE; + break; + case FONT_DECORATE_STRUCKOUT: + style |= FS_DECORATE_STRUCKOUT; + break; + case FONT_DECORATE_BOTH: + style |= FS_DECORATE_BOTH; + break; + default: + break; + } + + style &= ~FS_RENDER_MASK; + switch (style_part [5]) { + case FONT_RENDER_MONO: + style |= FS_RENDER_MONO; + break; + case FONT_RENDER_GREY: + style |= FS_RENDER_GREY; + break; + case FONT_RENDER_SUBPIXEL: + style |= FS_RENDER_SUBPIXEL; + break; + default: + break; + } + + /* deprecated since v3.2.1 switch (style_part [4]) { case FONT_UNDERLINE_LINE: style |= FS_UNDERLINE_LINE; @@ -244,6 +294,7 @@ DWORD fontConvertStyle (const char* style_part) default: return 0xFFFFFFFF; } + */ return style; } diff --git a/src/font/freetype2.c b/src/font/freetype2.c index 3231b710..c5a6a844 100644 --- a/src/font/freetype2.c +++ b/src/font/freetype2.c @@ -55,8 +55,7 @@ #include "freetype2.h" -#define IS_SUBPIXEL(logfont) \ - (((logfont)->style & FS_WEIGHT_MASK) == FS_WEIGHT_SUBPIXEL) +#define IS_SUBPIXEL(logfont) ((logfont)->style & FS_OTHER_SUBPIXEL) #ifdef TTF_DBG static int bbox_nohit = 0; @@ -200,7 +199,7 @@ print_bitmap_grey (void* buffer, int width, int rows, int pitch) static DWORD get_glyph_type (LOGFONT* logfont, DEVFONT* devfont) { - if (logfont->style & FS_WEIGHT_SUBPIXEL) + if (logfont->style & FS_OTHER_SUBPIXEL) return DEVFONTGLYPHTYPE_SUBPIXEL; else if (logfont->style & FS_WEIGHT_BOOK) return DEVFONTGLYPHTYPE_GREYBMP; diff --git a/src/font/logfont.c b/src/font/logfont.c index b7552596..22d4f156 100644 --- a/src/font/logfont.c +++ b/src/font/logfont.c @@ -227,7 +227,7 @@ static PLOGFONT gdiCreateLogFont (const char* type, const char* family, /* reset style of logfont */ /* remove HORZVERT style if weight is subpixel */ - if (log_font->style & FS_WEIGHT_SUBPIXEL) { + if ((log_font->style & FS_RENDER_MASK) == FS_RENDER_SUBPIXEL) { log_font->style &= ~FS_FLIP_HORZVERT; log_font->style &= ~FS_SLANT_ITALIC; } diff --git a/src/font/qpf.c b/src/font/qpf.c index 4a8be7a8..a7e7428f 100644 --- a/src/font/qpf.c +++ b/src/font/qpf.c @@ -482,9 +482,12 @@ static DEVFONT* new_instance (LOGFONT* logfont, DEVFONT* devfont, BOOL need_sbc_font) { if (QPFONT_INFO_P (devfont)->fm->flags & FLAG_MODE_SMOOTH) { - logfont->style &= ~FS_WEIGHT_SUBPIXEL; - logfont->style |= FS_WEIGHT_BOOK; - logfont->style &= ~FS_WEIGHT_LIGHT; + logfont->style &= ~FS_RENDER_MASK; + logfont->style |= FS_RENDER_GREY; + } + else { + logfont->style &= ~FS_RENDER_MASK; + logfont->style |= FS_RENDER_MONO; } return devfont; diff --git a/src/font/upf.c b/src/font/upf.c index cdb68ae4..3ab88fde 100644 --- a/src/font/upf.c +++ b/src/font/upf.c @@ -471,9 +471,12 @@ static DEVFONT* new_instance (LOGFONT* logfont, DEVFONT* devfont, *set logfont to weight book; **/ if (!((UPFV1_FILE_HEADER*)p_upf)->mono_bitmap) { - logfont->style &= ~FS_WEIGHT_SUBPIXEL; - logfont->style |= FS_WEIGHT_BOOK; - logfont->style &= ~FS_WEIGHT_LIGHT; + logfont->style &= ~FS_RENDER_MASK; + logfont->style |= FS_RENDER_GREY; + } + else { + logfont->style &= ~FS_RENDER_MASK; + logfont->style |= FS_RENDER_MONO; } return devfont;