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[] = {
+        &notdef,
+        &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