Esempio n. 1
0
static void
write_private_dictionary(gs_fapi_font * a_fapi_font, WRF_output * a_output,
                         int Write_CharStrings)
{
    a_output->m_encrypt = true;

    /* Write 4 bytes that must encrypt to at least one character that cannot be a valid hexadecimal character. */
    WRF_wstring(a_fapi_font->memory, a_output, "XXXX");

    /*+ to do: correct size of dictionary from 8. */
    WRF_wstring(a_fapi_font->memory, a_output, "dup /Private 8 dict dup begin\n");

    WRF_wstring(a_fapi_font->memory, a_output, "/MinFeature {16 16} def\n");
    WRF_wstring(a_fapi_font->memory, a_output, "/password 5839 def\n");
    if (Write_CharStrings)
        write_word_entry(a_fapi_font, a_output, "lenIV",
                         gs_fapi_font_feature_lenIV, 1);
    else
        WRF_wstring(a_fapi_font->memory, a_output, "/lenIV -1 def\n");       /* indicate that /subrs are not encoded. */
    write_word_entry(a_fapi_font, a_output, "BlueFuzz",
                     gs_fapi_font_feature_BlueFuzz, 16);

    WRF_wstring(a_fapi_font->memory, a_output, "/BlueScale ");
    WRF_wfloat(a_fapi_font->memory, a_output,
               a_fapi_font->get_long(a_fapi_font,
                                     gs_fapi_font_feature_BlueScale,
                                     0) / 65536.0);
    WRF_wstring(a_fapi_font->memory, a_output, " def\n");

    write_word_entry(a_fapi_font, a_output, "BlueShift",
                     gs_fapi_font_feature_BlueShift, 16);
    write_array_entry(a_fapi_font, a_output, "BlueValues",
                      gs_fapi_font_feature_BlueValues, 16);
    write_array_entry(a_fapi_font, a_output, "OtherBlues",
                      gs_fapi_font_feature_OtherBlues, 16);
    write_array_entry(a_fapi_font, a_output, "FamilyBlues",
                      gs_fapi_font_feature_FamilyBlues, 16);
    write_array_entry(a_fapi_font, a_output, "FamilyOtherBlues",
                      gs_fapi_font_feature_FamilyOtherBlues, 16);
    write_word_entry(a_fapi_font, a_output, "ForceBold",
                     gs_fapi_font_feature_ForceBold, 1);
    write_array_entry_with_count(a_fapi_font, a_output, "StdHW",
                                 gs_fapi_font_feature_StdHW, 1, 16);
    write_array_entry_with_count(a_fapi_font, a_output, "StdVW",
                                 gs_fapi_font_feature_StdVW, 1, 16);
    write_array_entry(a_fapi_font, a_output, "StemSnapH",
                      gs_fapi_font_feature_StemSnapH, 16);
    write_array_entry(a_fapi_font, a_output, "StemSnapV",
                      gs_fapi_font_feature_StemSnapV, 16);

    if (is_MM_font(a_fapi_font)) {
        WRF_wstring(a_fapi_font->memory, a_output, "3 index /Blend get /Private get begin\n");
        WRF_wstring(a_fapi_font->memory, a_output, "|-\n");
    }
    if (Write_CharStrings)
        write_subrs(a_fapi_font, a_output, 1);
    else
        write_subrs(a_fapi_font, a_output, 0);
    if (Write_CharStrings)
        write_charstrings(a_fapi_font, a_output);
}
Esempio n. 2
0
static void
write_main_dictionary(gs_fapi_font * a_fapi_font, WRF_output * a_output,
                      int Write_CharStrings)
{
    int i;

    WRF_wstring(a_output, "5 dict begin\n");

    WRF_wstring(a_output, "/FontType 1 def\n");

    WRF_wstring(a_output, "/FontMatrix [");
    for (i = 0; i < 6; i++) {
        WRF_wfloat(a_output,
                   a_fapi_font->get_float(a_fapi_font,
                                          gs_fapi_font_feature_FontMatrix,
                                          i));
        WRF_wbyte(a_output, (byte) (i == 5 ? ']' : ' '));
    }
    WRF_wbyte(a_output, '\n');

    /* For now, specify standard encoding - I think GS will pass glyph indices so doesn't matter. */
    WRF_wstring(a_output, "/Encoding StandardEncoding def\n");

    WRF_wstring(a_output, "/FontBBox {");
    for (i = 0; i < 4; i++) {
        short x =
            a_fapi_font->get_word(a_fapi_font, gs_fapi_font_feature_FontBBox,
                                  i);
        WRF_wint(a_output, x);
        WRF_wbyte(a_output, (byte) (i == 3 ? '}' : ' '));
    }
    WRF_wbyte(a_output, '\n');
    if (is_MM_font(a_fapi_font)) {
        short x, x2;
        float x1;
        uint i, j, entries;
        char Buffer[255];

        entries = 0;
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendAxisTypes_count,
                                  0);
        if (x)
            entries++;
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendDesignPositionsArrays_count,
                                  0);
        if (x)
            entries++;
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendDesignMapArrays_count,
                                  0);
        if (x)
            entries++;

        gs_sprintf(Buffer, "/FontInfo %d dict dup begin\n", entries);
        WRF_wstring(a_output, Buffer);
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendAxisTypes_count,
                                  0);
        if (x) {
            WRF_wstring(a_output, "/BlendAxisTypes [");
            for (i = 0; i < x; i++) {
                WRF_wstring(a_output, " /");
                a_fapi_font->get_name(a_fapi_font,
                                      gs_fapi_font_feature_BlendAxisTypes, i,
                                      (char *)&Buffer, 255);
                WRF_wstring(a_output, Buffer);
            }
            WRF_wstring(a_output, "] def\n");
        }
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendDesignPositionsArrays_count,
                                  0);
        if (x) {
            WRF_wstring(a_output, "/BlendDesignPositions [");
            x2 = a_fapi_font->get_word(a_fapi_font,
                                       gs_fapi_font_feature_BlendAxisTypes_count,
                                       0);
            for (i = 0; i < x; i++) {
                WRF_wstring(a_output, "[");
                for (j = 0; j < x2; j++) {
                    x1 = a_fapi_font->get_float(a_fapi_font,
                                                gs_fapi_font_feature_BlendDesignPositionsArrayValue,
                                                i * 8 + j);
                    gs_sprintf(Buffer, "%f ", x1);
                    WRF_wstring(a_output, Buffer);
                }
                WRF_wstring(a_output, "]");
            }
            WRF_wstring(a_output, "] def\n");
        }
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_BlendDesignMapArrays_count,
                                  0);
        if (x) {
            WRF_wstring(a_output, "/BlendDesignMap [");
            for (i = 0; i < x; i++) {
                x2 = a_fapi_font->get_word(a_fapi_font,
                                           gs_fapi_font_feature_BlendDesignMapSubArrays_count,
                                           i);
                WRF_wstring(a_output, "[");
                for (j = 0; j < x2; j++) {
                    WRF_wstring(a_output, "[");
                    x1 = a_fapi_font->get_float(a_fapi_font,
                                                gs_fapi_font_feature_BlendDesignPositionsArrayValue,
                                                i * 64 + j * 64);
                    gs_sprintf(Buffer, "%f ", x1);
                    WRF_wstring(a_output, Buffer);
                    x1 = a_fapi_font->get_float(a_fapi_font,
                                                gs_fapi_font_feature_BlendDesignPositionsArrayValue,
                                                i * 64 + j * 64 + 1);
                    gs_sprintf(Buffer, "%f ", x1);
                    WRF_wstring(a_output, Buffer);
                    WRF_wstring(a_output, "]");
                }
                WRF_wstring(a_output, "]");
            }
            WRF_wstring(a_output, "] def\n");
        }
        WRF_wstring(a_output, "end readonly def\n");

        /* Previously we tried to write $Blend twice - the "real" one from the font,
         * and the boiler plate one below.
         * For now, I assume there was a good reason for including the second, but it may
         * be because the "get_proc" method below was missing the code to handle PS name
         * objects.
         */
        if ((x =
             a_fapi_font->get_word(a_fapi_font,
                                   gs_fapi_font_feature_DollarBlend_length,
                                   0)) > 0) {
            WRF_wstring(a_output, "/$Blend {");

            if (a_output->m_count)
                a_output->m_count += x;
            x = a_fapi_font->get_proc(a_fapi_font,
                                      gs_fapi_font_feature_DollarBlend, 0,
                                      (char *)a_output->m_pos);
            if (a_output->m_pos)
                a_output->m_pos += x;
            WRF_wstring(a_output, "} def\n");
        } else {
            WRF_wstring(a_output,
                        "/$Blend {0.1 mul exch 0.45 mul add exch 0.17 mul add add} def\n");
        }
        WRF_wstring(a_output, "/WeightVector [");
        x = a_fapi_font->get_word(a_fapi_font,
                                  gs_fapi_font_feature_WeightVector_count, 0);
        for (i = 0; i < x; i++) {
            x1 = a_fapi_font->get_float(a_fapi_font,
                                        gs_fapi_font_feature_WeightVector, i);
            gs_sprintf(Buffer, "%f ", x1);
            WRF_wstring(a_output, Buffer);
        }
        WRF_wstring(a_output, "] def\n");
    }
    WRF_wstring(a_output, "currentdict end\ncurrentfile eexec\n");
    write_private_dictionary(a_fapi_font, a_output, Write_CharStrings);
    if (is_MM_font(a_fapi_font)) {
        write_blend_dictionary(a_fapi_font, a_output);
    }
}