1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-12-22 13:00:08 +00:00

set correct width

This commit is contained in:
Lu Wang 2013-09-20 20:30:46 +08:00
parent 8cac1e6aaf
commit 84b0966551
3 changed files with 14 additions and 24 deletions

View File

@ -241,9 +241,6 @@ string HTMLRenderer::dump_type3_font (GfxFont * font, FontInfo & info)
cairo_surface_set_fallback_resolution(surface, param.h_dpi, param.v_dpi); cairo_surface_set_fallback_resolution(surface, param.h_dpi, param.v_dpi);
cairo_t * cr = cairo_create(surface); cairo_t * cr = cairo_create(surface);
//debug
std::cerr << "debug " << code << std::endl;
std::cerr << "pdf width " << ((Gfx8BitFont*)font)->getWidth(code) << std::endl;
/* /*
cairo_set_font_size(cr, scale); cairo_set_font_size(cr, scale);
cairo_set_font_face(cr, cur_font->getFontFace()); cairo_set_font_face(cr, cur_font->getFontFace());
@ -254,6 +251,7 @@ string HTMLRenderer::dump_type3_font (GfxFont * font, FontInfo & info)
double ox, oy; double ox, oy;
ox = oy = 0.0; ox = oy = 0.0;
auto glyph_width = ((Gfx8BitFont*)font)->getWidth(code);
// manually draw the char to get the metrics // manually draw the char to get the metrics
// adapted from _render_type3_glyph of poppler // adapted from _render_type3_glyph of poppler
{ {
@ -285,6 +283,12 @@ string HTMLRenderer::dump_type3_font (GfxFont * font, FontInfo & info)
// set ctm // set ctm
cairo_set_matrix(cr, &ctm); cairo_set_matrix(cr, &ctm);
// calculate the position of origin
cairo_matrix_transform_point(&ctm, &ox, &oy);
// calculate glyph width
double dummy = 0;
cairo_matrix_transform_point(&ctm, &glyph_width, &dummy);
// draw the glyph // draw the glyph
auto output_dev = new CairoOutputDev(); auto output_dev = new CairoOutputDev();
output_dev->setCairo(cr); output_dev->setCairo(cr);
@ -306,23 +310,6 @@ string HTMLRenderer::dump_type3_font (GfxFont * font, FontInfo & info)
auto glyph_index = cur_font->getGlyph(code, nullptr, 0); auto glyph_index = cur_font->getGlyph(code, nullptr, 0);
gfx->display(char_procs->getVal(glyph_index, &char_proc_obj)); gfx->display(char_procs->getVal(glyph_index, &char_proc_obj));
double wx, wy;
output_dev->getType3GlyphWidth(&wx, &wy);
cairo_matrix_transform_distance(&m1, &wx, &wy);
std::cerr << "wx " << wx << " wy " << wy << std::endl;
if(output_dev->hasType3GlyphBBox())
{
double *bbox = output_dev->getType3GlyphBBox();
cairo_matrix_transform_point (&m1, &bbox[0], &bbox[1]);
cairo_matrix_transform_point (&m1, &bbox[2], &bbox[3]);
std::cerr << "*bbox";
for(int i = 0; i < 4; ++i)
std::cerr << ' ' << bbox[i];
std::cerr << std::endl;
}
char_proc_obj.free(); char_proc_obj.free();
delete gfx; delete gfx;
delete output_dev; delete output_dev;
@ -345,7 +332,7 @@ string HTMLRenderer::dump_type3_font (GfxFont * font, FontInfo & info)
throw string("Error in cairo: ") + cairo_status_to_string(status); throw string("Error in cairo: ") + cairo_status_to_string(status);
} }
ffw_import_svg_glyph(code, glyph_filename.c_str(), ox / GLYPH_DUMP_EM_SIZE, oy / GLYPH_DUMP_EM_SIZE); ffw_import_svg_glyph(code, glyph_filename.c_str(), ox / GLYPH_DUMP_EM_SIZE, 1.0 - oy / GLYPH_DUMP_EM_SIZE, glyph_width / GLYPH_DUMP_EM_SIZE);
} }
string font_filename = (char*)str_fmt("%s/f%llx.ttf", param.tmp_dir.c_str(), fn_id); string font_filename = (char*)str_fmt("%s/f%llx.ttf", param.tmp_dir.c_str(), fn_id);

View File

@ -425,7 +425,7 @@ void ffw_set_widths(int * width_list, int mapping_len,
} }
} }
void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy) void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy, double width)
{ {
int enc = SFFindSlot(cur_fv->sf, cur_fv->map, code, ""); int enc = SFFindSlot(cur_fv->sf, cur_fv->map, code, "");
if(enc == -1) if(enc == -1)
@ -439,7 +439,7 @@ void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy)
if(!ok) if(!ok)
err("Import SVG glyph failed"); err("Import SVG glyph failed");
// correct the origin // correct origin and width
{ {
int a = cur_fv->sf->ascent; int a = cur_fv->sf->ascent;
int d = cur_fv->sf->descent; int d = cur_fv->sf->descent;
@ -450,6 +450,8 @@ void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy)
transform[4] = -ox * (a+d); transform[4] = -ox * (a+d);
transform[5] = -oy * (a+d) + d; transform[5] = -oy * (a+d) + d;
FVTrans(cur_fv, sc, transform, NULL, fvt_alllayers | fvt_dontmovewidth); FVTrans(cur_fv, sc, transform, NULL, fvt_alllayers | fvt_dontmovewidth);
SCSynchronizeWidth(sc, floor(width * (a+d) + 0.5), sc->width, cur_fv);
} }
} }

View File

@ -63,7 +63,8 @@ void ffw_set_widths(int * width_list, int mapping_len,
//////////////////////// ////////////////////////
// others // others
// (ox,oy) is the position of the true origin, fractions related to em_size // (ox,oy) is the position of the true origin, fractions related to em_size
void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy); // also true for glyph_width
void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy, double glyph_width);
void ffw_auto_hint(void); void ffw_auto_hint(void);
void ffw_override_fstype(void); void ffw_override_fstype(void);