1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-07-07 18:30:34 +00:00

FontSizeManager

This commit is contained in:
Lu Wang 2013-02-05 14:36:36 +08:00
parent dc0681ad84
commit cccb85f729
7 changed files with 41 additions and 61 deletions

View File

@ -30,7 +30,7 @@
#include "util/StringFormatter.h" #include "util/StringFormatter.h"
#include "util/TmpFiles.h" #include "util/TmpFiles.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/StateTracker.h" #include "util/StateManager.h"
namespace pdf2htmlEX { namespace pdf2htmlEX {
@ -164,7 +164,6 @@ class HTMLRenderer : public OutputDev
void install_base_font(GfxFont * font, GfxFontLoc * font_loc, FontInfo & info); void install_base_font(GfxFont * font, GfxFontLoc * font_loc, FontInfo & info);
void install_external_font (GfxFont * font, FontInfo & info); void install_external_font (GfxFont * font, FontInfo & info);
long long install_font_size(double font_size);
long long install_transform_matrix(const double * tm); long long install_transform_matrix(const double * tm);
long long install_fill_color(const GfxRGB * rgb); long long install_fill_color(const GfxRGB * rgb);
long long install_stroke_color(const GfxRGB * rgb); long long install_stroke_color(const GfxRGB * rgb);
@ -184,7 +183,6 @@ class HTMLRenderer : public OutputDev
void export_remote_default_font(long long fn_id); void export_remote_default_font(long long fn_id);
void export_local_font(const FontInfo & info, GfxFont * font, const std::string & original_font_name, const std::string & cssfont); void export_local_font(const FontInfo & info, GfxFont * font, const std::string & original_font_name, const std::string & cssfont);
void export_font_size(long long fs_id, double font_size);
void export_transform_matrix(long long tm_id, const double * tm); void export_transform_matrix(long long tm_id, const double * tm);
void export_fill_color(long long color_id, const GfxRGB * rgb); void export_fill_color(long long color_id, const GfxRGB * rgb);
void export_stroke_color(long long color_id, const GfxRGB * rgb); void export_stroke_color(long long color_id, const GfxRGB * rgb);
@ -283,9 +281,11 @@ class HTMLRenderer : public OutputDev
// font & size // font & size
const FontInfo * cur_font_info; const FontInfo * cur_font_info;
double cur_font_size;
long long cur_fs_id;
bool font_changed; bool font_changed;
// cur_font_size is as in GfxState,
// font_size_manager saves the final font size used in HTML
double cur_font_size;
FontSizeManager font_size_manager;
// transform matrix // transform matrix
long long cur_ttm_id; long long cur_ttm_id;
@ -300,11 +300,11 @@ class HTMLRenderer : public OutputDev
// letter spacing // letter spacing
bool letter_space_changed; bool letter_space_changed;
LetterSpaceTracker letter_space_tracker; LetterSpaceManager letter_space_manager;
// word spacing // word spacing
bool word_space_changed; bool word_space_changed;
WordSpaceTracker word_space_tracker; WordSpaceManager word_space_manager;
// fill color // fill color
long long cur_fill_color_id; long long cur_fill_color_id;
@ -330,7 +330,6 @@ class HTMLRenderer : public OutputDev
// draw_text_tm is cur_text_tm scaled by 1/draw_text_scale, // draw_text_tm is cur_text_tm scaled by 1/draw_text_scale,
// so everything redenered should be multiplied by draw_text_scale // so everything redenered should be multiplied by draw_text_scale
double draw_text_tm[6]; double draw_text_tm[6];
double draw_font_size;
double draw_text_scale; double draw_text_scale;
// the position of next char, in text coords // the position of next char, in text coords

View File

@ -3,8 +3,7 @@
* *
* Generate and optimized HTML for one line * Generate and optimized HTML for one line
* *
* by WangLu * Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
* 2012.09.04
*/ */
#include <vector> #include <vector>
@ -186,17 +185,17 @@ void HTMLRenderer::TextLineBuffer::flush(void)
void HTMLRenderer::TextLineBuffer::set_state (State & state) void HTMLRenderer::TextLineBuffer::set_state (State & state)
{ {
state.ids[State::FONT_ID] = renderer->cur_font_info->id; state.ids[State::FONT_ID] = renderer->cur_font_info->id;
state.ids[State::FONT_SIZE_ID] = renderer->cur_fs_id; state.ids[State::FONT_SIZE_ID] = renderer->font_size_manager.get_id();
state.ids[State::FILL_COLOR_ID] = renderer->cur_fill_color_id; state.ids[State::FILL_COLOR_ID] = renderer->cur_fill_color_id;
state.ids[State::STROKE_COLOR_ID] = renderer->cur_stroke_color_id; state.ids[State::STROKE_COLOR_ID] = renderer->cur_stroke_color_id;
state.ids[State::LETTER_SPACE_ID] = renderer->letter_space_tracker.get_id(); state.ids[State::LETTER_SPACE_ID] = renderer->letter_space_manager.get_id();
state.ids[State::WORD_SPACE_ID] = renderer->word_space_tracker.get_id(); state.ids[State::WORD_SPACE_ID] = renderer->word_space_manager.get_id();
state.ids[State::RISE_ID] = renderer->cur_rise_id; state.ids[State::RISE_ID] = renderer->cur_rise_id;
const FontInfo * info = renderer->cur_font_info; const FontInfo * info = renderer->cur_font_info;
state.ascent = info->ascent; state.ascent = info->ascent;
state.descent = info->descent; state.descent = info->descent;
state.draw_font_size = renderer->draw_font_size; state.draw_font_size = renderer->font_size_manager.get_value();
} }
void HTMLRenderer::TextLineBuffer::State::begin (ostream & out, const State * prev_state) void HTMLRenderer::TextLineBuffer::State::begin (ostream & out, const State * prev_state)

View File

@ -3,8 +3,7 @@
* *
* Export styles to HTML * Export styles to HTML
* *
* by WangLu * Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
* 2012.08.14
*/ */
#include <sstream> #include <sstream>
@ -131,10 +130,6 @@ void HTMLRenderer::export_local_font(const FontInfo & info, GfxFont * font, cons
f_css.fs << "}" << endl; f_css.fs << "}" << endl;
} }
void HTMLRenderer::export_font_size (long long fs_id, double font_size)
{
f_css.fs << ".s" << fs_id << "{font-size:" << round(font_size) << "px;}" << endl;
}
void HTMLRenderer::export_transform_matrix (long long tm_id, const double * tm) void HTMLRenderer::export_transform_matrix (long long tm_id, const double * tm)
{ {

View File

@ -3,8 +3,7 @@
* *
* Handling general stuffs * Handling general stuffs
* *
* Copyright (C) 2012 Lu Wang <coolwanglu@gmail.com> * Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
* 2012.08.14
*/ */
#include <cstdio> #include <cstdio>
@ -57,8 +56,9 @@ HTMLRenderer::HTMLRenderer(const Param * param)
cur_mapping2 = new char* [0x100]; cur_mapping2 = new char* [0x100];
width_list = new int [0x10000]; width_list = new int [0x10000];
letter_space_tracker.set_param(CSS::LETTER_SPACE_CN, EPS); font_size_manager .set_param(CSS::FONT_SIZE_CN , EPS);
word_space_tracker .set_param(CSS::WORD_SPACE_CN , EPS); letter_space_manager.set_param(CSS::LETTER_SPACE_CN, EPS);
word_space_manager .set_param(CSS::WORD_SPACE_CN , EPS);
} }
HTMLRenderer::~HTMLRenderer() HTMLRenderer::~HTMLRenderer()
@ -336,7 +336,9 @@ void HTMLRenderer::pre_process(PDFDoc * doc)
void HTMLRenderer::post_process() void HTMLRenderer::post_process()
{ {
// dump css // dump css
letter_space_tracker.dump_css(f_css.fs); font_size_manager .dump_css(f_css.fs);
letter_space_manager.dump_css(f_css.fs);
word_space_manager .dump_css(f_css.fs);
// close files // close files
f_outline.fs.close(); f_outline.fs.close();

View File

@ -3,8 +3,7 @@
* *
* maintaining all known styles * maintaining all known styles
* *
* by WangLu * Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
* 2012.08.14
*/ */
#include <iostream> #include <iostream>
@ -213,18 +212,6 @@ void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info)
export_local_font(info, font, fontname, ""); export_local_font(info, font, fontname, "");
} }
long long HTMLRenderer::install_font_size(double font_size)
{
auto iter = font_size_map.lower_bound(font_size - EPS);
if((iter != font_size_map.end()) && (equal(iter->first, font_size)))
return iter->second;
long long new_fs_id = font_size_map.size();
font_size_map.insert(make_pair(font_size, new_fs_id));
export_font_size(new_fs_id, font_size);
return new_fs_id;
}
long long HTMLRenderer::install_transform_matrix(const double * tm) long long HTMLRenderer::install_transform_matrix(const double * tm)
{ {
Matrix m; Matrix m;

View File

@ -97,15 +97,15 @@ void HTMLRenderer::reset_state()
draw_text_scale = 1.0; draw_text_scale = 1.0;
cur_font_info = install_font(nullptr); cur_font_info = install_font(nullptr);
cur_font_size = draw_font_size = 0;
cur_fs_id = install_font_size(cur_font_size); font_size_manager.reset();
memcpy(cur_text_tm, ID_MATRIX, sizeof(cur_text_tm)); memcpy(cur_text_tm, ID_MATRIX, sizeof(cur_text_tm));
memcpy(draw_text_tm, ID_MATRIX, sizeof(draw_text_tm)); memcpy(draw_text_tm, ID_MATRIX, sizeof(draw_text_tm));
cur_ttm_id = install_transform_matrix(draw_text_tm); cur_ttm_id = install_transform_matrix(draw_text_tm);
letter_space_tracker.reset(); letter_space_manager.reset();
word_space_tracker .reset(); word_space_manager .reset();
cur_fill_color.r = cur_fill_color.g = cur_fill_color.b = 0; cur_fill_color.r = cur_fill_color.g = cur_fill_color.b = 0;
cur_fill_color_id = install_fill_color(&cur_fill_color); cur_fill_color_id = install_fill_color(&cur_fill_color);
@ -262,11 +262,9 @@ void HTMLRenderer::check_state_change(GfxState * state)
draw_text_scale = new_draw_text_scale; draw_text_scale = new_draw_text_scale;
} }
if(!(equal(new_draw_font_size, draw_font_size))) if(!font_size_manager.install(new_draw_font_size))
{ {
new_line_state = max<NewLineState>(new_line_state, NLS_SPAN); new_line_state = max<NewLineState>(new_line_state, NLS_SPAN);
draw_font_size = new_draw_font_size;
cur_fs_id = install_font_size(draw_font_size);
} }
if(!(tm_equal(new_draw_text_tm, draw_text_tm, 4))) if(!(tm_equal(new_draw_text_tm, draw_text_tm, 4)))
{ {
@ -339,7 +337,7 @@ void HTMLRenderer::check_state_change(GfxState * state)
// letter space // letter space
// depends: draw_text_scale // depends: draw_text_scale
if((all_changed || letter_space_changed || draw_text_scale_changed) if((all_changed || letter_space_changed || draw_text_scale_changed)
&& (letter_space_tracker.install(state->getCharSpace() * draw_text_scale))) && (letter_space_manager.install(state->getCharSpace() * draw_text_scale)))
{ {
new_line_state = max<NewLineState>(new_line_state, NLS_SPAN); new_line_state = max<NewLineState>(new_line_state, NLS_SPAN);
} }
@ -347,7 +345,7 @@ void HTMLRenderer::check_state_change(GfxState * state)
// word space // word space
// depends draw_text_scale // depends draw_text_scale
if((all_changed || word_space_changed || draw_text_scale_changed) if((all_changed || word_space_changed || draw_text_scale_changed)
&& (word_space_tracker.install(state->getWordSpace() * draw_text_scale))) && (word_space_manager.install(state->getWordSpace() * draw_text_scale)))
{ {
new_line_state = max<NewLineState>(new_line_state, NLS_SPAN); new_line_state = max<NewLineState>(new_line_state, NLS_SPAN);
} }

View File

@ -1,14 +1,13 @@
/* /*
* StateTracker.h * StateManager.h
* *
* track specific PDF state
* manage reusable CSS classes * manage reusable CSS classes
* *
* Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com> * Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com>
*/ */
#ifndef STATETRACKER_H__ #ifndef STATEMANAGER_H__
#define STATETRACKER_H__ #define STATEMANAGER_H__
#include <iostream> #include <iostream>
#include <map> #include <map>
@ -17,13 +16,13 @@
namespace pdf2htmlEX { namespace pdf2htmlEX {
template<class ValueType, class Imp> class StateTracker {}; template<class ValueType, class Imp> class StateManager {};
template<class Imp> template<class Imp>
class StateTracker<double, Imp> class StateManager<double, Imp>
{ {
public: public:
StateTracker() StateManager()
: eps(0) : eps(0)
, imp(static_cast<Imp*>(this)) , imp(static_cast<Imp*>(this))
{ {
@ -52,8 +51,9 @@ public:
return _install(new_value); return _install(new_value);
} }
long long get_id (void) const { return id; } long long get_id (void) const { return id; }
double get_actual_value (void) const { return actual_value; } double get_value (void) const { return value; }
double get_actual_value (void) const { return actual_value; }
void dump_css(std::ostream & out) { void dump_css(std::ostream & out) {
for(auto iter = value_map.begin(); iter != value_map.end(); ++iter) for(auto iter = value_map.begin(); iter != value_map.end(); ++iter)
@ -93,21 +93,21 @@ protected:
std::map<double, long long> value_map; std::map<double, long long> value_map;
}; };
class FontSizeTracker : public StateTracker<double, FontSizeTracker> class FontSizeManager : public StateManager<double, FontSizeManager>
{ {
public: public:
double default_value(void) { return 0; } double default_value(void) { return 0; }
void dump_value(std::ostream & out, double value) { out << "font-size:" << round(value) << "px;"; } void dump_value(std::ostream & out, double value) { out << "font-size:" << round(value) << "px;"; }
}; };
class LetterSpaceTracker : public StateTracker<double, LetterSpaceTracker> class LetterSpaceManager : public StateManager<double, LetterSpaceManager>
{ {
public: public:
double default_value(void) { return 0; } double default_value(void) { return 0; }
void dump_value(std::ostream & out, double value) { out << "letter-spacing:" << round(value) << "px;"; } void dump_value(std::ostream & out, double value) { out << "letter-spacing:" << round(value) << "px;"; }
}; };
class WordSpaceTracker : public StateTracker<double, WordSpaceTracker> class WordSpaceManager : public StateManager<double, WordSpaceManager>
{ {
public: public:
double default_value(void) { return 0; } double default_value(void) { return 0; }
@ -116,4 +116,4 @@ public:
} // namespace pdf2htmlEX } // namespace pdf2htmlEX
#endif //STATETRACKER_H__ #endif //STATEMANAGER_H__