diff --git a/src/HTMLRenderer/HTMLRenderer.h b/src/HTMLRenderer/HTMLRenderer.h index 40ad4c4..89d3d1e 100644 --- a/src/HTMLRenderer/HTMLRenderer.h +++ b/src/HTMLRenderer/HTMLRenderer.h @@ -30,7 +30,7 @@ #include "util/StringFormatter.h" #include "util/TmpFiles.h" #include "util/misc.h" -#include "util/StateTracker.h" +#include "util/StateManager.h" namespace pdf2htmlEX { @@ -164,7 +164,6 @@ class HTMLRenderer : public OutputDev void install_base_font(GfxFont * font, GfxFontLoc * font_loc, 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_fill_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_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_fill_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 const FontInfo * cur_font_info; - double cur_font_size; - long long cur_fs_id; 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 long long cur_ttm_id; @@ -300,11 +300,11 @@ class HTMLRenderer : public OutputDev // letter spacing bool letter_space_changed; - LetterSpaceTracker letter_space_tracker; + LetterSpaceManager letter_space_manager; // word spacing bool word_space_changed; - WordSpaceTracker word_space_tracker; + WordSpaceManager word_space_manager; // fill color 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, // so everything redenered should be multiplied by draw_text_scale double draw_text_tm[6]; - double draw_font_size; double draw_text_scale; // the position of next char, in text coords diff --git a/src/HTMLRenderer/TextLineBuffer.cc b/src/HTMLRenderer/TextLineBuffer.cc index 9289a94..f0fc599 100644 --- a/src/HTMLRenderer/TextLineBuffer.cc +++ b/src/HTMLRenderer/TextLineBuffer.cc @@ -3,8 +3,7 @@ * * Generate and optimized HTML for one line * - * by WangLu - * 2012.09.04 + * Copyright (C) 2012,2013 Lu Wang */ #include @@ -186,17 +185,17 @@ void HTMLRenderer::TextLineBuffer::flush(void) void HTMLRenderer::TextLineBuffer::set_state (State & state) { 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::STROKE_COLOR_ID] = renderer->cur_stroke_color_id; - state.ids[State::LETTER_SPACE_ID] = renderer->letter_space_tracker.get_id(); - state.ids[State::WORD_SPACE_ID] = renderer->word_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_manager.get_id(); state.ids[State::RISE_ID] = renderer->cur_rise_id; const FontInfo * info = renderer->cur_font_info; state.ascent = info->ascent; 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) diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc index 86f2ba6..742dd68 100644 --- a/src/HTMLRenderer/export.cc +++ b/src/HTMLRenderer/export.cc @@ -3,8 +3,7 @@ * * Export styles to HTML * - * by WangLu - * 2012.08.14 + * Copyright (C) 2012,2013 Lu Wang */ #include @@ -131,10 +130,6 @@ void HTMLRenderer::export_local_font(const FontInfo & info, GfxFont * font, cons 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) { diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index d5d5c0c..7bab35c 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -3,8 +3,7 @@ * * Handling general stuffs * - * Copyright (C) 2012 Lu Wang - * 2012.08.14 + * Copyright (C) 2012,2013 Lu Wang */ #include @@ -57,8 +56,9 @@ HTMLRenderer::HTMLRenderer(const Param * param) cur_mapping2 = new char* [0x100]; width_list = new int [0x10000]; - letter_space_tracker.set_param(CSS::LETTER_SPACE_CN, EPS); - word_space_tracker .set_param(CSS::WORD_SPACE_CN , EPS); + font_size_manager .set_param(CSS::FONT_SIZE_CN , EPS); + letter_space_manager.set_param(CSS::LETTER_SPACE_CN, EPS); + word_space_manager .set_param(CSS::WORD_SPACE_CN , EPS); } HTMLRenderer::~HTMLRenderer() @@ -336,7 +336,9 @@ void HTMLRenderer::pre_process(PDFDoc * doc) void HTMLRenderer::post_process() { // 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 f_outline.fs.close(); diff --git a/src/HTMLRenderer/install.cc b/src/HTMLRenderer/install.cc index e6abb42..fda5ae5 100644 --- a/src/HTMLRenderer/install.cc +++ b/src/HTMLRenderer/install.cc @@ -3,8 +3,7 @@ * * maintaining all known styles * - * by WangLu - * 2012.08.14 + * Copyright (C) 2012,2013 Lu Wang */ #include @@ -213,18 +212,6 @@ void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info) 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) { Matrix m; diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc index 0726abb..61e5f84 100644 --- a/src/HTMLRenderer/state.cc +++ b/src/HTMLRenderer/state.cc @@ -97,15 +97,15 @@ void HTMLRenderer::reset_state() draw_text_scale = 1.0; 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(draw_text_tm, ID_MATRIX, sizeof(draw_text_tm)); cur_ttm_id = install_transform_matrix(draw_text_tm); - letter_space_tracker.reset(); - word_space_tracker .reset(); + letter_space_manager.reset(); + word_space_manager .reset(); cur_fill_color.r = cur_fill_color.g = cur_fill_color.b = 0; 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; } - if(!(equal(new_draw_font_size, draw_font_size))) + if(!font_size_manager.install(new_draw_font_size)) { new_line_state = max(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))) { @@ -339,7 +337,7 @@ void HTMLRenderer::check_state_change(GfxState * state) // letter space // depends: draw_text_scale 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(new_line_state, NLS_SPAN); } @@ -347,7 +345,7 @@ void HTMLRenderer::check_state_change(GfxState * state) // word space // depends draw_text_scale 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(new_line_state, NLS_SPAN); } diff --git a/src/util/StateTracker.h b/src/util/StateManager.h similarity index 80% rename from src/util/StateTracker.h rename to src/util/StateManager.h index 25e5f91..2f98019 100644 --- a/src/util/StateTracker.h +++ b/src/util/StateManager.h @@ -1,14 +1,13 @@ /* - * StateTracker.h + * StateManager.h * - * track specific PDF state * manage reusable CSS classes * * Copyright (C) 2013 Lu Wang */ -#ifndef STATETRACKER_H__ -#define STATETRACKER_H__ +#ifndef STATEMANAGER_H__ +#define STATEMANAGER_H__ #include #include @@ -17,13 +16,13 @@ namespace pdf2htmlEX { -template class StateTracker {}; +template class StateManager {}; template -class StateTracker +class StateManager { public: - StateTracker() + StateManager() : eps(0) , imp(static_cast(this)) { @@ -52,8 +51,9 @@ public: return _install(new_value); } - long long get_id (void) const { return id; } - double get_actual_value (void) const { return actual_value; } + long long get_id (void) const { return id; } + double get_value (void) const { return value; } + double get_actual_value (void) const { return actual_value; } void dump_css(std::ostream & out) { for(auto iter = value_map.begin(); iter != value_map.end(); ++iter) @@ -93,21 +93,21 @@ protected: std::map value_map; }; -class FontSizeTracker : public StateTracker +class FontSizeManager : public StateManager { public: double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "font-size:" << round(value) << "px;"; } }; -class LetterSpaceTracker : public StateTracker +class LetterSpaceManager : public StateManager { public: double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "letter-spacing:" << round(value) << "px;"; } }; -class WordSpaceTracker : public StateTracker +class WordSpaceManager : public StateManager { public: double default_value(void) { return 0; } @@ -116,4 +116,4 @@ public: } // namespace pdf2htmlEX -#endif //STATETRACKER_H__ +#endif //STATEMANAGER_H__