mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 04:50:09 +00:00
fix glyph widths when not consistent with PDF [need more work]
This commit is contained in:
parent
6b28049d76
commit
dafc4b86dd
8
TODO
8
TODO
@ -1,3 +1,11 @@
|
|||||||
|
about glyph width:
|
||||||
|
- IE
|
||||||
|
- parameter for transform/trunc when width is too wide/narrow
|
||||||
|
- stretching ratio might not be correct..
|
||||||
|
|
||||||
|
better wrapper of ff
|
||||||
|
- need C++ class
|
||||||
|
|
||||||
try harder finding glyph names (using fontforge) for CID Type 0
|
try harder finding glyph names (using fontforge) for CID Type 0
|
||||||
rename single-html -> embed-font/image/css ...
|
rename single-html -> embed-font/image/css ...
|
||||||
create a glyph for ' ', if there is not in a font
|
create a glyph for ' ', if there is not in a font
|
||||||
|
@ -110,24 +110,15 @@ void HTMLRenderer::install_base_font(GfxFont * font, GfxFontLoc * font_loc, Font
|
|||||||
string psname(font_loc->path->getCString());
|
string psname(font_loc->path->getCString());
|
||||||
string basename = psname.substr(0, psname.find('-'));
|
string basename = psname.substr(0, psname.find('-'));
|
||||||
|
|
||||||
GfxFontLoc * localfontloc = font->locateFont(xref, gTrue);
|
GfxFontLoc * localfontloc = font->locateFont(xref, gFalse);
|
||||||
if(param->embed_base_font)
|
if(param->embed_base_font)
|
||||||
{
|
{
|
||||||
if(localfontloc != nullptr)
|
if(localfontloc != nullptr)
|
||||||
{
|
{
|
||||||
GooString * path = globalParams->findBase14FontFile(localfontloc->path, font);
|
embed_font(localfontloc->path->getCString(), font, info);
|
||||||
if(path)
|
export_remote_font(info, param->font_suffix, param->font_format, font);
|
||||||
{
|
delete localfontloc;
|
||||||
embed_font(string(path->getCString()), font, info);
|
return;
|
||||||
export_remote_font(info, param->font_suffix, param->font_format, font);
|
|
||||||
delete localfontloc;
|
|
||||||
delete path;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cerr << "Cannot embed base font: f" << hex << info.id << dec << ' ' << psname << endl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -189,14 +189,17 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
|||||||
info.em_size = ffw_get_em_size();
|
info.em_size = ffw_get_em_size();
|
||||||
|
|
||||||
if(get_metric_only)
|
if(get_metric_only)
|
||||||
|
{
|
||||||
|
ffw_metric(&info.ascent, &info.descent);
|
||||||
|
ffw_close();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
used_map = preprocessor.get_code_map(hash_ref(font->getID()));
|
used_map = preprocessor.get_code_map(hash_ref(font->getID()));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 1
|
* Step 1
|
||||||
* dump the font file directly from the font descriptor and put the glyphs into the correct slots
|
* dump the font file directly from the font descriptor and put the glyphs into the correct slots *
|
||||||
*
|
|
||||||
* for 8bit + nonTrueType
|
* for 8bit + nonTrueType
|
||||||
* re-encoding the font using a PostScript encoding list (glyph id <-> glpyh name)
|
* re-encoding the font using a PostScript encoding list (glyph id <-> glpyh name)
|
||||||
*
|
*
|
||||||
@ -395,8 +398,8 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ffw_reencode_raw(cur_mapping, max_key + 1, 1);
|
|
||||||
ffw_set_widths(width_list, max_key + 1);
|
ffw_set_widths(width_list, max_key + 1);
|
||||||
|
ffw_reencode_raw(cur_mapping, max_key + 1, 1);
|
||||||
|
|
||||||
if(ctu)
|
if(ctu)
|
||||||
ctu->decRefCnt();
|
ctu->decRefCnt();
|
||||||
@ -458,6 +461,7 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
|||||||
ffw_load_font(cur_tmp_fn.c_str());
|
ffw_load_font(cur_tmp_fn.c_str());
|
||||||
ffw_metric(&info.ascent, &info.descent);
|
ffw_metric(&info.ascent, &info.descent);
|
||||||
ffw_save(fn.c_str());
|
ffw_save(fn.c_str());
|
||||||
|
|
||||||
ffw_close();
|
ffw_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
25
src/ffw.c
25
src/ffw.c
@ -268,8 +268,10 @@ void ffw_metric(double * ascent, double * descent)
|
|||||||
if(a < 0) a = 0;
|
if(a < 0) a = 0;
|
||||||
if(d > 0) d = 0;
|
if(d > 0) d = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
sf->ascent = min(a, em);
|
sf->ascent = min(a, em);
|
||||||
sf->descent = em - bb.maxy;
|
sf->descent = em - bb.maxy;
|
||||||
|
*/
|
||||||
|
|
||||||
info->os2_winascent = a;
|
info->os2_winascent = a;
|
||||||
info->os2_typoascent = a;
|
info->os2_typoascent = a;
|
||||||
@ -294,6 +296,15 @@ void ffw_metric(double * ascent, double * descent)
|
|||||||
*/
|
*/
|
||||||
void ffw_set_widths(int * width_list, int mapping_len)
|
void ffw_set_widths(int * width_list, int mapping_len)
|
||||||
{
|
{
|
||||||
|
memset(cur_fv->selected, 1, cur_fv->map->enccount);
|
||||||
|
// remove kern
|
||||||
|
FVRemoveKerns(cur_fv);
|
||||||
|
FVRemoveVKerns(cur_fv);
|
||||||
|
// remove bearing
|
||||||
|
// TODO: optimize this, merge the transform matrix with width setting (below)
|
||||||
|
//FVSetWidthScript(cur_fv, wt_lbearing, 0, 0);
|
||||||
|
//FVSetWidthScript(cur_fv, wt_rbearing, 0, 0);
|
||||||
|
|
||||||
SplineFont * sf = cur_fv->sf;
|
SplineFont * sf = cur_fv->sf;
|
||||||
|
|
||||||
if(sf->onlybitmaps
|
if(sf->onlybitmaps
|
||||||
@ -319,6 +330,20 @@ void ffw_set_widths(int * width_list, int mapping_len)
|
|||||||
SplineChar * sc = sf->glyphs[j];
|
SplineChar * sc = sf->glyphs[j];
|
||||||
if(sc == NULL) continue;
|
if(sc == NULL) continue;
|
||||||
|
|
||||||
|
DBounds bb;
|
||||||
|
SplineCharFindBounds(sc, &bb);
|
||||||
|
|
||||||
|
// TODO: add an option
|
||||||
|
double glyph_width = bb.maxx - bb.minx;
|
||||||
|
if(glyph_width > width_list[i])
|
||||||
|
{
|
||||||
|
real transform[6];
|
||||||
|
transform[0] = ((double)width_list[i]) / glyph_width;
|
||||||
|
transform[3] = 1.0;
|
||||||
|
transform[1] = transform[2] = transform[4] = transform[5] = 0;
|
||||||
|
FVTrans(cur_fv, sc, transform, NULL, fvt_alllayers | fvt_dontmovewidth);
|
||||||
|
}
|
||||||
|
|
||||||
sc->width = width_list[i];
|
sc->width = width_list[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user