Erich E. Hoover : wineps.drv: Add support for PostScript Format 1 glyph names.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Sep 15 09:50:50 CDT 2015
Module: wine
Branch: master
Commit: ce0fbe4f1e3054db6284dd5397c52b7dd6d182f7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce0fbe4f1e3054db6284dd5397c52b7dd6d182f7
Author: Erich E. Hoover <erich.e.hoover at wine-staging.com>
Date: Wed Sep 2 17:21:15 2015 -0600
wineps.drv: Add support for PostScript Format 1 glyph names.
In order to generate a searchable PDF from a PostScript document the
glyph names must follow Adobe's convention.
---
dlls/wineps.drv/download.c | 321 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 318 insertions(+), 3 deletions(-)
diff --git a/dlls/wineps.drv/download.c b/dlls/wineps.drv/download.c
index e5b57f7..0c4c5a7 100644
--- a/dlls/wineps.drv/download.c
+++ b/dlls/wineps.drv/download.c
@@ -30,6 +30,8 @@
#include "winnls.h"
#include "psdrv.h"
+#include "data/agl.h"
+
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
@@ -359,11 +361,324 @@ BOOL PSDRV_WriteSetDownloadFont(PHYSDEV dev, BOOL vertical)
return TRUE;
}
+static void get_standard_glyph_name(WORD index, char *name)
+{
+ static const GLYPHNAME nonbreakingspace = { -1, "nonbreakingspace" };
+ static const GLYPHNAME nonmarkingreturn = { -1, "nonmarkingreturn" };
+ static const GLYPHNAME notdef = { -1, ".notdef" };
+ static const GLYPHNAME null = { -1, ".null" };
+ /* These PostScript Format 1 glyph names are stored by glyph index, do not reorder them. */
+ static const GLYPHNAME *glyph_table[] = {
+ ¬def,
+ &null,
+ &nonmarkingreturn,
+ GN_space,
+ GN_exclam,
+ GN_quotedbl,
+ GN_numbersign,
+ GN_dollar,
+ GN_percent,
+ GN_ampersand,
+ GN_quotesingle,
+ GN_parenleft,
+ GN_parenright,
+ GN_asterisk,
+ GN_plus,
+ GN_comma,
+ GN_hyphen,
+ GN_period,
+ GN_slash,
+ GN_zero,
+ GN_one,
+ GN_two,
+ GN_three,
+ GN_four,
+ GN_five,
+ GN_six,
+ GN_seven,
+ GN_eight,
+ GN_nine,
+ GN_colon,
+ GN_semicolon,
+ GN_less,
+ GN_equal,
+ GN_greater,
+ GN_question,
+ GN_at,
+ GN_A,
+ GN_B,
+ GN_C,
+ GN_D,
+ GN_E,
+ GN_F,
+ GN_G,
+ GN_H,
+ GN_I,
+ GN_J,
+ GN_K,
+ GN_L,
+ GN_M,
+ GN_N,
+ GN_O,
+ GN_P,
+ GN_Q,
+ GN_R,
+ GN_S,
+ GN_T,
+ GN_U,
+ GN_V,
+ GN_W,
+ GN_X,
+ GN_Y,
+ GN_Z,
+ GN_bracketleft,
+ GN_backslash,
+ GN_bracketright,
+ GN_asciicircum,
+ GN_underscore,
+ GN_grave,
+ GN_a,
+ GN_b,
+ GN_c,
+ GN_d,
+ GN_e,
+ GN_f,
+ GN_g,
+ GN_h,
+ GN_i,
+ GN_j,
+ GN_k,
+ GN_l,
+ GN_m,
+ GN_n,
+ GN_o,
+ GN_p,
+ GN_q,
+ GN_r,
+ GN_s,
+ GN_t,
+ GN_u,
+ GN_v,
+ GN_w,
+ GN_x,
+ GN_y,
+ GN_z,
+ GN_braceleft,
+ GN_bar,
+ GN_braceright,
+ GN_asciitilde,
+ GN_Adieresis,
+ GN_Aring,
+ GN_Ccedilla,
+ GN_Eacute,
+ GN_Ntilde,
+ GN_Odieresis,
+ GN_Udieresis,
+ GN_aacute,
+ GN_agrave,
+ GN_acircumflex,
+ GN_adieresis,
+ GN_atilde,
+ GN_aring,
+ GN_ccedilla,
+ GN_eacute,
+ GN_egrave,
+ GN_ecircumflex,
+ GN_edieresis,
+ GN_iacute,
+ GN_igrave,
+ GN_icircumflex,
+ GN_idieresis,
+ GN_ntilde,
+ GN_oacute,
+ GN_ograve,
+ GN_ocircumflex,
+ GN_odieresis,
+ GN_otilde,
+ GN_uacute,
+ GN_ugrave,
+ GN_ucircumflex,
+ GN_udieresis,
+ GN_dagger,
+ GN_degree,
+ GN_cent,
+ GN_sterling,
+ GN_section,
+ GN_bullet,
+ GN_paragraph,
+ GN_germandbls,
+ GN_registered,
+ GN_copyright,
+ GN_trademark,
+ GN_acute,
+ GN_dieresis,
+ GN_notequal,
+ GN_AE,
+ GN_Oslash,
+ GN_infinity,
+ GN_plusminus,
+ GN_lessequal,
+ GN_greaterequal,
+ GN_yen,
+ GN_mu,
+ GN_partialdiff,
+ GN_summation,
+ GN_product,
+ GN_pi,
+ GN_integral,
+ GN_ordfeminine,
+ GN_ordmasculine,
+ GN_Omega,
+ GN_ae,
+ GN_oslash,
+ GN_questiondown,
+ GN_exclamdown,
+ GN_logicalnot,
+ GN_radical,
+ GN_florin,
+ GN_approxequal,
+ GN_Delta,
+ GN_guillemotleft,
+ GN_guillemotright,
+ GN_ellipsis,
+ &nonbreakingspace,
+ GN_Agrave,
+ GN_Atilde,
+ GN_Otilde,
+ GN_OE,
+ GN_oe,
+ GN_endash,
+ GN_emdash,
+ GN_quotedblleft,
+ GN_quotedblright,
+ GN_quoteleft,
+ GN_quoteright,
+ GN_divide,
+ GN_lozenge,
+ GN_ydieresis,
+ GN_Ydieresis,
+ GN_fraction,
+ GN_currency,
+ GN_guilsinglleft,
+ GN_guilsinglright,
+ GN_fi,
+ GN_fl,
+ GN_daggerdbl,
+ GN_periodcentered,
+ GN_quotesinglbase,
+ GN_quotedblbase,
+ GN_perthousand,
+ GN_Acircumflex,
+ GN_Ecircumflex,
+ GN_Aacute,
+ GN_Edieresis,
+ GN_Egrave,
+ GN_Iacute,
+ GN_Icircumflex,
+ GN_Idieresis,
+ GN_Igrave,
+ GN_Oacute,
+ GN_Ocircumflex,
+ GN_apple,
+ GN_Ograve,
+ GN_Uacute,
+ GN_Ucircumflex,
+ GN_Ugrave,
+ GN_dotlessi,
+ GN_circumflex,
+ GN_tilde,
+ GN_macron,
+ GN_breve,
+ GN_dotaccent,
+ GN_ring,
+ GN_cedilla,
+ GN_hungarumlaut,
+ GN_ogonek,
+ GN_caron,
+ GN_Lslash,
+ GN_lslash,
+ GN_Scaron,
+ GN_scaron,
+ GN_Zcaron,
+ GN_zcaron,
+ GN_brokenbar,
+ GN_Eth,
+ GN_eth,
+ GN_Yacute,
+ GN_yacute,
+ GN_Thorn,
+ GN_thorn,
+ GN_minus,
+ GN_multiply,
+ GN_onesuperior,
+ GN_twosuperior,
+ GN_threesuperior,
+ GN_onehalf,
+ GN_onequarter,
+ GN_threequarters,
+ GN_franc,
+ GN_Gbreve,
+ GN_gbreve,
+ GN_Idotaccent,
+ GN_Scedilla,
+ GN_scedilla,
+ GN_Cacute,
+ GN_cacute,
+ GN_Ccaron,
+ GN_ccaron,
+ GN_dcroat
+ };
+ snprintf(name, MAX_G_NAME + 1, "%s", glyph_table[index]->sz);
+}
+
void get_glyph_name(HDC hdc, WORD index, char *name)
{
- /* FIXME */
- sprintf(name, "g%04x", index);
- return;
+ struct
+ {
+ DWORD format;
+ DWORD italicAngle;
+ SHORT underlinePosition;
+ SHORT underlineThickness;
+ DWORD isFixedPitch;
+ DWORD minMemType42;
+ DWORD maxMemType42;
+ DWORD minMemType1;
+ DWORD maxMemType1;
+ } *post_header;
+ BYTE *post = NULL;
+ DWORD size;
+
+ /* set a fallback name that is just 'g<index>' */
+ snprintf(name, MAX_G_NAME + 1, "g%04x", index);
+
+ /* attempt to obtain the glyph name from the 'post' table */
+ size = GetFontData(hdc, MS_MAKE_TAG('p','o','s','t'), 0, NULL, 0);
+ if(size < sizeof(*post_header) || size == GDI_ERROR)
+ return;
+ post = HeapAlloc(GetProcessHeap(), 0, size);
+ if(!post)
+ return;
+ size = GetFontData(hdc, MS_MAKE_TAG('p','o','s','t'), 0, post, size);
+ if(size < sizeof(*post_header) || size == GDI_ERROR)
+ goto cleanup;
+ post_header = (typeof(post_header))(post);
+ /* note: only interested in the format for obtaining glyph names */
+ post_header->format = GET_BE_DWORD(&post_header->format);
+
+ /* now that we know the format of the 'post' table we can get the glyph name */
+ if(post_header->format == MAKELONG(0, 1))
+ {
+ if(index < 258)
+ get_standard_glyph_name(index, name);
+ else
+ WARN("Font uses PostScript Format 1, but non-standard glyph (%d) requested.\n", index);
+ }
+ else
+ FIXME("PostScript Format %d.%d glyph names are currently unsupported.\n",
+ HIWORD(post_header->format), LOWORD(post_header->format));
+
+cleanup:
+ HeapFree(GetProcessHeap(), 0, post);
}
/****************************************************************************
More information about the wine-cvs
mailing list