diff --git a/src/HTMLRenderer/HTMLRenderer.h b/src/HTMLRenderer/HTMLRenderer.h index 89d3d1e..4956588 100644 --- a/src/HTMLRenderer/HTMLRenderer.h +++ b/src/HTMLRenderer/HTMLRenderer.h @@ -168,7 +168,6 @@ class HTMLRenderer : public OutputDev long long install_fill_color(const GfxRGB * rgb); long long install_stroke_color(const GfxRGB * rgb); long long install_whitespace(double ws_width, double & actual_width); - long long install_rise(double rise); long long install_height(double height); long long install_left(double left); @@ -187,7 +186,6 @@ class HTMLRenderer : public OutputDev void export_fill_color(long long color_id, const GfxRGB * rgb); void export_stroke_color(long long color_id, const GfxRGB * rgb); void export_whitespace(long long ws_id, double ws_width); - void export_rise(long long rise_id, double rise); void export_height(long long height_id, double height); void export_left(long long left_id, double left); @@ -319,9 +317,8 @@ class HTMLRenderer : public OutputDev bool stroke_color_changed; // rise - long long cur_rise_id; - double cur_rise; bool rise_changed; + RiseManager rise_manager; // optimize for web // we try to render the final font size directly @@ -359,11 +356,9 @@ class HTMLRenderer : public OutputDev //////////////////////////////////////////////////// std::unordered_map font_name_map; - std::map font_size_map; std::map transform_matrix_map; std::unordered_map fill_color_map, stroke_color_map; std::map whitespace_map; - std::map rise_map; std::map height_map; std::map left_map; diff --git a/src/HTMLRenderer/TextLineBuffer.cc b/src/HTMLRenderer/TextLineBuffer.cc index f0fc599..9a00f07 100644 --- a/src/HTMLRenderer/TextLineBuffer.cc +++ b/src/HTMLRenderer/TextLineBuffer.cc @@ -190,7 +190,7 @@ void HTMLRenderer::TextLineBuffer::set_state (State & state) state.ids[State::STROKE_COLOR_ID] = renderer->cur_stroke_color_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; + state.ids[State::RISE_ID] = renderer->rise_manager.get_id(); const FontInfo * info = renderer->cur_font_info; state.ascent = info->ascent; diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc index 742dd68..6332df9 100644 --- a/src/HTMLRenderer/export.cc +++ b/src/HTMLRenderer/export.cc @@ -196,11 +196,6 @@ void HTMLRenderer::export_whitespace (long long ws_id, double ws_width) f_css.fs << "._" << ws_id << "{display:inline;margin-left:" << round(ws_width) << "px;}" << endl; } -void HTMLRenderer::export_rise (long long rise_id, double rise) -{ - f_css.fs << ".r" << rise_id << "{top:" << round(-rise) << "px;}" << endl; -} - void HTMLRenderer::export_height (long long height_id, double height) { f_css.fs << ".h" << height_id << "{height:" << round(height) << "px;}" << endl; diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index 7bab35c..1b95fdf 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -56,9 +56,10 @@ HTMLRenderer::HTMLRenderer(const Param * param) cur_mapping2 = new char* [0x100]; width_list = new int [0x10000]; - 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); + 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 ); + rise_manager .set_param(CSS::RISE_CN , param->v_eps); } HTMLRenderer::~HTMLRenderer() @@ -339,6 +340,7 @@ void HTMLRenderer::post_process() font_size_manager .dump_css(f_css.fs); letter_space_manager.dump_css(f_css.fs); word_space_manager .dump_css(f_css.fs); + rise_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 fda5ae5..4b65151 100644 --- a/src/HTMLRenderer/install.cc +++ b/src/HTMLRenderer/install.cc @@ -280,20 +280,6 @@ long long HTMLRenderer::install_whitespace(double ws_width, double & actual_widt return new_ws_id; } -long long HTMLRenderer::install_rise(double rise) -{ - auto iter = rise_map.lower_bound(rise - param->v_eps); - if((iter != rise_map.end()) && (abs(iter->first - rise) <= param->v_eps)) - { - return iter->second; - } - - long long new_rise_id = rise_map.size(); - rise_map.insert(make_pair(rise, new_rise_id)); - export_rise(new_rise_id, rise); - return new_rise_id; -} - long long HTMLRenderer::install_height(double height) { auto iter = height_map.lower_bound(height - EPS); diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc index dc6225e..d11f93f 100644 --- a/src/HTMLRenderer/state.cc +++ b/src/HTMLRenderer/state.cc @@ -116,8 +116,7 @@ void HTMLRenderer::reset_state() cur_stroke_color_id = install_stroke_color(&cur_stroke_color); cur_has_stroke = false; - cur_rise = 0; - cur_rise_id = install_rise(cur_rise); + rise_manager.reset(); cur_tx = cur_ty = 0; draw_tx = draw_ty = 0; @@ -408,15 +407,10 @@ void HTMLRenderer::check_state_change(GfxState * state) // rise // depends draw_text_scale - if(all_changed || rise_changed || draw_text_scale_changed) + if((all_changed || rise_changed || draw_text_scale_changed) + && (rise_manager.install(state->getRise() * draw_text_scale))) { - double new_rise = state->getRise(); - if(!equal(cur_rise, new_rise)) - { - new_line_state = max(new_line_state, NLS_SPAN); - cur_rise = new_rise; - cur_rise_id = install_rise(new_rise * draw_text_scale); - } + new_line_state = max(new_line_state, NLS_SPAN); } reset_state_change(); diff --git a/src/util/StateManager.h b/src/util/StateManager.h index 2f98019..edb582a 100644 --- a/src/util/StateManager.h +++ b/src/util/StateManager.h @@ -114,6 +114,13 @@ public: void dump_value(std::ostream & out, double value) { out << "word-spacing:" << round(value) << "px;"; } }; +class RiseManager : public StateManager +{ +public: + double default_value(void) { return 0; } + void dump_value(std::ostream & out, double value) { out << "top:" << round(-value) << "px;"; } +}; + } // namespace pdf2htmlEX #endif //STATEMANAGER_H__