From 9ed6e9c325d38ccd4f3089c5c92811dc521afa20 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Thu, 16 Aug 2012 20:26:09 +0800 Subject: [PATCH] integrate negative whtiespace; restructru prepare_line --- lib/all.css | 1 - src/HTMLRenderer.h | 9 +++- src/HTMLRenderer/export.cc | 5 +- src/HTMLRenderer/general.cc | 2 +- src/HTMLRenderer/image.cc | 3 +- src/HTMLRenderer/state.cc | 105 +++++++++++++++++------------------- src/HTMLRenderer/text.cc | 1 + 7 files changed, 64 insertions(+), 62 deletions(-) diff --git a/lib/all.css b/lib/all.css index 6af0e9a..7b4a82f 100644 --- a/lib/all.css +++ b/lib/all.css @@ -22,7 +22,6 @@ white-space:pre; } .l > ._ { - display:inline-block; color:transparent; } ::selection{ diff --git a/src/HTMLRenderer.h b/src/HTMLRenderer.h index ba0f6f0..5ef408c 100644 --- a/src/HTMLRenderer.h +++ b/src/HTMLRenderer.h @@ -161,9 +161,14 @@ class HTMLRenderer : public OutputDev //////////////////////////////////////////////////// // state tracking //////////////////////////////////////////////////// + // check updated states, and determine new_line_stauts + // make sure this function can be called several times consecutively without problem void check_state_change(GfxState * state); - void reset_state_track(); - void prepare_line(); // close current span or div if necessary, according to new_line_status + // reset all ***_changed flags + void reset_state_change(); + // prepare the line context, (close old tags, open new tags) + // make sure the current HTML style consistent with PDF + void prepare_line(GfxState * state); void close_line(); diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc index 3d81c3a..3236ef2 100644 --- a/src/HTMLRenderer/export.cc +++ b/src/HTMLRenderer/export.cc @@ -148,6 +148,9 @@ void HTMLRenderer::export_color (long long color_id, const GfxRGB * rgb) void HTMLRenderer::export_whitespace (long long ws_id, double ws_width) { - allcss_fout << format("._%|1$x|{width:%2%px;}") % ws_id % ws_width << endl; + if(ws_width > 0) + allcss_fout << format("._%|1$x|{display:inline-block;width:%2%px;}") % ws_id % ws_width << endl; + else + allcss_fout << format("._%|1$x|{display:inline;margin-left:%2%px;}") % ws_id % ws_width << endl; } diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index 074e588..422538c 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -182,7 +182,7 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) draw_scale = 1.0; draw_tx = draw_ty = 0; - reset_state_track(); + reset_state_change(); } void HTMLRenderer::endPage() { diff --git a/src/HTMLRenderer/image.cc b/src/HTMLRenderer/image.cc index 6174ddb..03188dd 100644 --- a/src/HTMLRenderer/image.cc +++ b/src/HTMLRenderer/image.cc @@ -55,7 +55,8 @@ void HTMLRenderer::drawImage(GfxState * state, Object * ref, Stream * str, int w close_line(); - double * ctm = state->getCTM(); + double ctm[6]; + memcpy(ctm, state->getCTM(), sizeof(ctm)); ctm[4] = ctm[5] = 0.0; html_fout << format("") % image_count % install_transform_matrix(ctm) % state->getCurX() % state->getCurY() % width % height << endl; diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc index f7a31e8..4edae4d 100644 --- a/src/HTMLRenderer/state.cc +++ b/src/HTMLRenderer/state.cc @@ -89,7 +89,7 @@ void HTMLRenderer::check_state_change(GfxState * state) } // text position - // we've been tracking the text position positively in update... function + // we've been tracking the text position positively in the update*** functions if(all_changed || text_pos_changed) { need_recheck_position = true; @@ -224,9 +224,48 @@ void HTMLRenderer::check_state_change(GfxState * state) } } - prepare_line(); + reset_state_change(); +} - // TODO: move the following to prepare_line ?? +void HTMLRenderer::reset_state_change() +{ + all_changed = false; + + rise_changed = false; + text_pos_changed = false; + + font_changed = false; + ctm_changed = false; + text_mat_changed = false; + hori_scale_changed = false; + + letter_space_changed = false; + word_space_changed = false; + + color_changed = false; +} +void HTMLRenderer::prepare_line(GfxState * state) +{ + // close old tags when necessary + if((line_status == LineStatus::NONE) || (new_line_status == LineStatus::NONE)) + { + //pass + } + else if(new_line_status == LineStatus::DIV) + { + close_line(); + } + else + { + assert(new_line_status == LineStatus::SPAN); + if(line_status == LineStatus::SPAN) + html_fout << ""; + else + assert(line_status == LineStatus::DIV); + // don't change line_status + } + + // open new tags when necessary if(line_status == LineStatus::NONE) { new_line_status = LineStatus::DIV; @@ -250,20 +289,10 @@ void HTMLRenderer::check_state_change(GfxState * state) { // don't close a pending span here, keep the styling - if(target > param->h_eps) - { - double w; - auto wid = install_whitespace(target, w); - html_fout << format(" ") % wid; - draw_tx += w / draw_scale; - } - else - { - // shift left - // TODO, create a class for this - html_fout << format("") % target; - draw_tx += target / draw_scale; - } + double w; + auto wid = install_whitespace(target, w); + html_fout << format("%2%") % wid % (target > 0 ? " " : ""); + draw_tx += w / draw_scale; } } @@ -311,48 +340,12 @@ void HTMLRenderer::check_state_change(GfxState * state) line_status = new_line_status; } - reset_state_track(); - -} - -void HTMLRenderer::reset_state_track() -{ - all_changed = false; - - rise_changed = false; - text_pos_changed = false; - - font_changed = false; - ctm_changed = false; - text_mat_changed = false; - hori_scale_changed = false; - - letter_space_changed = false; - word_space_changed = false; - - color_changed = false; -} -void HTMLRenderer::prepare_line() -{ - if((line_status == LineStatus::NONE) || (new_line_status == LineStatus::NONE)) - return; - - if(new_line_status == LineStatus::DIV) - { - close_line(); - } - else - { - assert(new_line_status == LineStatus::SPAN); - if(line_status == LineStatus::SPAN) - html_fout << ""; - else - assert(line_status == LineStatus::DIV); - // don't change line_status - } } void HTMLRenderer::close_line() { + if(line_status == LineStatus::NONE) + return; + if(line_status == LineStatus::SPAN) html_fout << ""; else diff --git a/src/HTMLRenderer/text.cc b/src/HTMLRenderer/text.cc index bcbf84a..a5cc07f 100644 --- a/src/HTMLRenderer/text.cc +++ b/src/HTMLRenderer/text.cc @@ -155,6 +155,7 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s) // see if the line has to be closed due to state change check_state_change(state); + prepare_line(state); // Now ready to output // get the unicodes