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:
parent
8cac1e6aaf
commit
84b0966551
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user