static void write_subrs(gs_fapi_font * a_fapi_font, WRF_output * a_output, int raw) { int i; int count = a_fapi_font->get_word(a_fapi_font, gs_fapi_font_feature_Subrs_count, 0); if (count <= 0) return; WRF_wstring(a_fapi_font->memory, a_output, "/Subrs "); WRF_wint(a_fapi_font->memory, a_output, count); WRF_wstring(a_fapi_font->memory, a_output, " array\n"); for (i = 0; i < count; i++) { long length; long buffer_size; if (raw) length = a_fapi_font->get_raw_subr(a_fapi_font, i, 0, 0); else length = a_fapi_font->get_subr(a_fapi_font, i, 0, 0); WRF_wstring(a_fapi_font->memory, a_output, "dup "); WRF_wint(a_fapi_font->memory, a_output, i); WRF_wbyte(a_fapi_font->memory, a_output, ' '); WRF_wint(a_fapi_font->memory, a_output, length); WRF_wstring(a_fapi_font->memory, a_output, " RD "); /* Get the subroutine into the buffer and encrypt it in place. */ buffer_size = a_output->m_limit - a_output->m_count; if (buffer_size >= length) { if (raw) a_fapi_font->get_raw_subr(a_fapi_font, i, a_output->m_pos, (ushort) length); else a_fapi_font->get_subr(a_fapi_font, i, a_output->m_pos, (ushort) length); WRF_wtext(a_fapi_font->memory, a_output, a_output->m_pos, length); } else a_output->m_count += length; WRF_wstring(a_fapi_font->memory, a_output, " NP\n"); } WRF_wstring(a_fapi_font->memory, a_output, "ND\n"); }
static void write_charstrings(gs_fapi_font * a_fapi_font, WRF_output * a_output) { long length; long buffer_size; int i, count = a_fapi_font->get_word(a_fapi_font, gs_fapi_font_feature_CharStrings_count, 0); char NameBuf[256]; if (count <= 0) return; WRF_wstring(a_fapi_font->memory, a_output, "2 index /CharStrings "); WRF_wint(a_fapi_font->memory, a_output, count); WRF_wstring(a_fapi_font->memory, a_output, " dict dup begin\n"); for (i = 0; i < count; i++) { length = a_fapi_font->get_charstring_name(a_fapi_font, i, (byte *) & NameBuf, 256); if (length > 0) { length = a_fapi_font->get_charstring(a_fapi_font, i, 0, 0); WRF_wbyte(a_fapi_font->memory, a_output, '/'); WRF_wstring(a_fapi_font->memory, a_output, (const char *)&NameBuf); WRF_wbyte(a_fapi_font->memory, a_output, ' '); WRF_wint(a_fapi_font->memory, a_output, length); WRF_wstring(a_fapi_font->memory, a_output, " RD "); /* Get the CharString into the buffer and encrypt it in place. */ buffer_size = a_output->m_limit - a_output->m_count; if (buffer_size >= length) { a_fapi_font->get_charstring(a_fapi_font, i, a_output->m_pos, (ushort) length); WRF_wtext(a_fapi_font->memory, a_output, a_output->m_pos, length); } else a_output->m_count += length; WRF_wstring(a_fapi_font->memory, a_output, " ND\n"); } } WRF_wstring(a_fapi_font->memory, a_output, " end"); }
static void write_word_entry(FAPI_font* a_fapi_font,WRF_output* a_output,const char* a_name,int a_index,int a_divisor) { short x; WRF_wbyte(a_output,'/'); WRF_wstring(a_output,a_name); WRF_wbyte(a_output,' '); /* Get the value and convert it from unsigned to signed by assigning it to a short. */ x = a_fapi_font->get_word(a_fapi_font,a_index,0); /* Divide by the divisor to bring it back to font units. */ x = (short)(x / a_divisor); WRF_wint(a_output,x); WRF_wstring(a_output," def\n"); }
static void write_array_entry_with_count(FAPI_font* a_fapi_font,WRF_output* a_output,const char* a_name,int a_index,int a_count,int a_divisor) { int i; if (a_count <= 0) return; WRF_wbyte(a_output,'/'); WRF_wstring(a_output,a_name); WRF_wstring(a_output," ["); for (i = 0; i < a_count; i++) { /* Get the value and convert it from unsigned to signed by assigning it to a short. */ short x = a_fapi_font->get_word(a_fapi_font,a_index,i); /* Divide by the divisor to bring it back to font units. */ x = (short)(x / a_divisor); WRF_wint(a_output,x); WRF_wbyte(a_output,(byte)(i == a_count - 1 ? ']' : ' ')); } WRF_wstring(a_output," def\n"); }
static void write_main_dictionary(FAPI_font* a_fapi_font,WRF_output* a_output) { 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,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,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,FAPI_FONT_FEATURE_BlendAxisTypes_count,0); if (x) entries++; x = a_fapi_font->get_word(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignPositionsArrays_count,0); if (x) entries++; x = a_fapi_font->get_word(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignMapArrays_count,0); if (x) entries++; sprintf(Buffer, "/FontInfo %d dict dup begin\n", entries); WRF_wstring(a_output, Buffer); x = a_fapi_font->get_word(a_fapi_font,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,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrays_count,0); if (x) { WRF_wstring(a_output, "/BlendDesignPositions ["); x2 = a_fapi_font->get_word(a_fapi_font,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*8+j); 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,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,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*64+j*64); sprintf(Buffer, "%f ", x1); WRF_wstring(a_output,Buffer); x1 = a_fapi_font->get_float(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*64+j*64 + 1); 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"); WRF_wstring(a_output,"/$Blend {"); x = a_fapi_font->get_word(a_fapi_font,FAPI_FONT_FEATURE_DollarBlend_length,0); if(a_output->m_count) a_output->m_count += x; x = a_fapi_font->get_proc(a_fapi_font,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"); 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,FAPI_FONT_FEATURE_WeightVector_count,0); for (i = 0;i < x;i++) { x1 = a_fapi_font->get_float(a_fapi_font,FAPI_FONT_FEATURE_WeightVector,i); 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); if (is_MM_font(a_fapi_font)) { write_blend_dictionary(a_fapi_font, a_output); } }
static void write_main_dictionary(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,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,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,FAPI_FONT_FEATURE_BlendAxisTypes_count,0); if (x) entries++; x = a_fapi_font->get_word(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignPositionsArrays_count,0); if (x) entries++; x = a_fapi_font->get_word(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignMapArrays_count,0); if (x) entries++; sprintf(Buffer, "/FontInfo %d dict dup begin\n", entries); WRF_wstring(a_output, Buffer); x = a_fapi_font->get_word(a_fapi_font,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,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrays_count,0); if (x) { WRF_wstring(a_output, "/BlendDesignPositions ["); x2 = a_fapi_font->get_word(a_fapi_font,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*8+j); 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,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,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,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*64+j*64); sprintf(Buffer, "%f ", x1); WRF_wstring(a_output,Buffer); x1 = a_fapi_font->get_float(a_fapi_font,FAPI_FONT_FEATURE_BlendDesignPositionsArrayValue,i*64+j*64 + 1); 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,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,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,FAPI_FONT_FEATURE_WeightVector_count,0); for (i = 0;i < x;i++) { x1 = a_fapi_font->get_float(a_fapi_font,FAPI_FONT_FEATURE_WeightVector,i); 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); } }