diff --git a/src/BackgroundRenderer.cc b/src/BackgroundRenderer.cc index 5941eee..2913947 100644 --- a/src/BackgroundRenderer.cc +++ b/src/BackgroundRenderer.cc @@ -14,7 +14,7 @@ void BackgroundRenderer::drawChar(GfxState *state, double x, double y, CharCode code, int nBytes, Unicode *u, int uLen) { auto font = state->getFont(); -// if((font->getType() == fontType3) || (font->getWMode())) + if((font->getType() == fontType3) || (font->getWMode())) { SplashOutputDev::drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); } diff --git a/src/HTMLRenderer.cc b/src/HTMLRenderer.cc index e2ba118..76047a5 100644 --- a/src/HTMLRenderer.cc +++ b/src/HTMLRenderer.cc @@ -126,8 +126,8 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) if(param->readable) html_fout << endl; cur_fn_id = cur_fs_id = cur_tm_id = cur_color_id = 0; - cur_line_x_offset = 0; cur_tx = cur_ty = 0; + cur_line_x_offset = 0; cur_font_size = 0; memcpy(cur_ctm, id_matrix, sizeof(cur_ctm)); @@ -154,7 +154,6 @@ void HTMLRenderer::close_cur_line() html_fout << ""; if(param->readable) html_fout << endl; - cur_line_x_offset = 0; line_opened = false; } } @@ -198,7 +197,6 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s) auto font = state->getFont(); if((font == nullptr) || (font->getWMode())) { - //TODO return; } @@ -208,26 +206,24 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s) // if the line is still open, try to merge with it if(line_opened) { - double target = (state->getLineX() - cur_tx - cur_line_x_offset) * draw_scale; - + double target = -cur_line_x_offset * draw_scale; if(target > -param->h_eps) { if(target > param->h_eps) { double w; auto wid = install_whitespace(target, w); - cur_line_x_offset = w-target; + cur_tx += w / draw_scale; + cur_line_x_offset = (w - target) / draw_scale; html_fout << boost::format(" ") % wid; } - else - { - cur_line_x_offset = -target; - } } else { // can we shift left using simple tags? close_cur_line(); + cur_tx = state->getLineX(); + cur_line_x_offset = 0; } } @@ -791,7 +787,7 @@ void HTMLRenderer::check_state_change(GfxState * state) { bool close_line = false; - if(all_changed || pos_changed) + if(all_changed || line_pos_changed) { double tx = state->getLineX(); double ty = state->getLineY(); @@ -801,9 +797,16 @@ void HTMLRenderer::check_state_change(GfxState * state) close_line = true; cur_ty = ty; cur_tx = tx; + cur_line_x_offset = 0; + } + else + { + // LineY remains unchanged + cur_line_x_offset += cur_tx - tx; } } + // TODO, we may use nested span if only color has been changed if(all_changed || color_changed) { GfxRGB new_color; @@ -836,10 +839,9 @@ void HTMLRenderer::check_state_change(GfxState * state) // TODO // Rise, HorizScale etc - double new_ctm[6]; - memcpy(new_ctm, draw_ctm, sizeof(new_ctm)); if(all_changed || text_mat_changed || ctm_changed) { + double new_ctm[6]; double * m1 = state->getCTM(); double * m2 = state->getTextMat(); new_ctm[0] = m1[0] * m2[0] + m1[2] * m2[1]; @@ -848,21 +850,23 @@ void HTMLRenderer::check_state_change(GfxState * state) new_ctm[3] = m1[1] * m2[2] + m1[3] * m2[3]; new_ctm[4] = new_ctm[5] = 0; - if(!_tm_equal(new_ctm, cur_ctm, 4)) { } + if(!_tm_equal(new_ctm, cur_ctm)) { need_rescale_font = true; + memcpy(cur_ctm, new_ctm, sizeof(cur_ctm)); } } if(need_rescale_font) { - draw_scale = std::sqrt(new_ctm[2] * new_ctm[2] + new_ctm[3] * new_ctm[3]); + draw_scale = std::sqrt(cur_ctm[2] * cur_ctm[2] + cur_ctm[3] * cur_ctm[3]); double new_draw_font_size = cur_font_size; + if(_is_positive(draw_scale)) { new_draw_font_size *= draw_scale; for(int i = 0; i < 4; ++i) - new_ctm[i] /= draw_scale; + cur_ctm[i] /= draw_scale; } else { @@ -875,9 +879,9 @@ void HTMLRenderer::check_state_change(GfxState * state) cur_fs_id = install_font_size(draw_font_size); close_line = true; } - if(!(_tm_equal(new_ctm, draw_ctm))) + if(!(_tm_equal(cur_ctm, draw_ctm))) { - memcpy(draw_ctm, new_ctm, sizeof(draw_ctm)); + memcpy(draw_ctm, cur_ctm, sizeof(draw_ctm)); cur_tm_id = install_transform_matrix(draw_ctm); close_line = true; } @@ -899,7 +903,7 @@ void HTMLRenderer::check_state_change(GfxState * state) void HTMLRenderer::reset_state_track() { all_changed = false; - pos_changed = false; + line_pos_changed = false; ctm_changed = false; text_mat_changed = false; font_changed = false; diff --git a/src/HTMLRenderer.h b/src/HTMLRenderer.h index 3142fd5..637e77d 100644 --- a/src/HTMLRenderer.h +++ b/src/HTMLRenderer.h @@ -96,7 +96,8 @@ class HTMLRenderer : public OutputDev virtual void updateFont(GfxState * state) { font_changed = true; } virtual void updateTextMat(GfxState * state) { text_mat_changed = true; } virtual void updateCTM(GfxState * state, double m11, double m12, double m21, double m22, double m31, double m32) { ctm_changed = true; } - virtual void updateTextPos(GfxState * state) { pos_changed = true; } + virtual void updateTextPos(GfxState * state) { line_pos_changed = true; } + virtual void updateTextShift(GfxState * state, double shift) { cur_line_x_offset += shift * 0.001 * state->getFontSize() * state->getHorizScaling(); } virtual void updateFillColor(GfxState * state) { color_changed = true; } //----- text drawing @@ -155,12 +156,11 @@ class HTMLRenderer : public OutputDev // if we have a pending opened line bool line_opened; - // (actual x) - (supposed x) - double cur_line_x_offset; // current position double cur_tx, cur_ty; // in text coords - bool pos_changed; + double cur_line_x_offset; // in text coords, our position - real position + bool line_pos_changed; long long cur_fn_id; double cur_font_size;