From 3cdde4bce7d19a6ee3927d9ec2327f2c031a003f Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sun, 19 Aug 2012 22:30:05 +0200 Subject: [PATCH] better line merging --- src/HTMLRenderer/state.cc | 83 +++++++++++++++------------------------ 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc index 66a8164..e029143 100644 --- a/src/HTMLRenderer/state.cc +++ b/src/HTMLRenderer/state.cc @@ -182,73 +182,52 @@ void HTMLRenderer::check_state_change(GfxState * state) // depends: rise & text position & transformation if(need_recheck_position) { - bool hope = true; - // do not bother with draw_ctm - if(_tm_equal(cur_ctm, old_ctm)) { - // nothing to do - } - else if (_tm_equal(cur_ctm, old_ctm, 4)) + // try to transform the old origin under the new TM + /* + * OldTM * (draw_tx, draw_ty, 1)^T = CurTM * (draw_tx + dx, draw_ty + dy, 1)^T + * + * OldTM[4] = CurTM[0] * dx + CurTM[2] * dy + CurTM[4] + * OldTM[5] = CurTM[1] * dx + CurTM[3] * dy + CurTM[5] + * + * We just care if we can map the origin y to the same new y + * So just let dy = cur_y - old_y, and try to solve dx + * + * TODO, writing mode, set dx and solve dy + */ + + double dy = cur_ty + cur_rise - draw_ty; + draw_ty += dy; + + double tdx = old_ctm[4] - cur_ctm[4] - cur_ctm[2] * dy; + double tdy = old_ctm[5] - cur_ctm[5] - cur_ctm[3] * dy; + + if(_equal(cur_ctm[0] * tdy, cur_ctm[1] * tdx)) { - // try harder, - // try to transform the old origin under the new TM - /* - * OldTM * (draw_tx, draw_ty, 1)^T = CurTM * (draw_tx + dx, draw_ty + dy, 1)^T - * - * OldTM[4] = CurTM[0] * dx + CurTM[2] * dy + CurTM[4] - * OldTM[5] = CurTM[1] * dx + CurTM[3] * dy + CurTM[5] - * - */ - - double tdx = old_ctm[4] - cur_ctm[4]; - double tdy = old_ctm[5] - cur_ctm[5]; - - double deter = cur_ctm[0] * cur_ctm[3] - cur_ctm[1] * cur_ctm[2]; - - if(abs(deter) > EPS) - { - //ok, only one solution - draw_tx += (cur_ctm[3]*tdx - cur_ctm[2]*tdy) / deter; - draw_ty += (-cur_ctm[1]*tdx + cur_ctm[0]*tdy) / deter; - } + if(abs(cur_ctm[0]) > EPS) + draw_tx += tdx / cur_ctm[0]; + else if (abs(cur_ctm[1]) > EPS) + draw_tx += tdy / cur_ctm[1]; else { - //TODO, writing mode? - //prefer the same line, so dy = 0 - if(_equal(cur_ctm[0] * old_ctm[5], cur_ctm[1] * old_ctm[4])) + if((abs(tdx) < EPS) && (abs(tdy) < EPS)) { - // just compute dx - if(abs(cur_ctm[0]) > EPS) - draw_tx += old_ctm[4] / cur_ctm[0]; - else if (abs(cur_ctm[1]) > EPS) - draw_tx += old_ctm[5] / cur_ctm[1]; - else - { - // wo cur_ctm[0] == cur_ctm[1] == 0 - // while the first 4 elements of cur/old_ctm are the same, but the last 2 are not - // so give up - hope = false; - } - } + // free + draw_tx = cur_tx; + } else { - hope = false; + // fail + new_line_status = max(new_line_status, LineStatus::DIV); } } } else { - // ok, have to start a new line - hope = false; - } - - // should use the draw_scale here - if(!(hope && (abs((cur_ty + cur_rise) - draw_ty) * draw_scale < param->v_eps))) - { + // no solution new_line_status = max(new_line_status, LineStatus::DIV); } } - // letter space // depends: draw_scale if(all_changed || letter_space_changed)