1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-07-05 09:38:40 +00:00

merge states with different (but proportional) matrices

This commit is contained in:
Lu Wang 2013-04-05 22:17:40 +08:00
parent ab2588a5fd
commit 952cd4d3c9

View File

@ -141,6 +141,12 @@ void HTMLRenderer::check_state_change(GfxState * state)
bool need_rescale_font = false; bool need_rescale_font = false;
bool draw_text_scale_changed = false; bool draw_text_scale_changed = false;
// save current info for later use
HTMLState old_html_state = cur_html_state;
double old_tm[6];
memcpy(old_tm, cur_text_tm, sizeof(old_tm));
double old_draw_text_scale = draw_text_scale;
// text position // text position
// we've been tracking the text position positively in the update*** functions // we've been tracking the text position positively in the update*** functions
if(all_changed || text_pos_changed) if(all_changed || text_pos_changed)
@ -148,9 +154,6 @@ void HTMLRenderer::check_state_change(GfxState * state)
need_recheck_position = true; need_recheck_position = true;
} }
// save current info for later use
auto old_font_info = cur_html_state.font_info;
double old_font_size = cur_html_state.font_size;
// font name & size // font name & size
if(all_changed || font_changed) if(all_changed || font_changed)
{ {
@ -180,10 +183,6 @@ void HTMLRenderer::check_state_change(GfxState * state)
} }
} }
// backup the current ctm for need_recheck_position
double old_tm[6];
memcpy(old_tm, cur_text_tm, sizeof(old_tm));
// ctm & text ctm & hori scale & rise // ctm & text ctm & hori scale & rise
if(all_changed || ctm_changed || text_mat_changed || hori_scale_changed || rise_changed) if(all_changed || ctm_changed || text_mat_changed || hori_scale_changed || rise_changed)
{ {
@ -276,25 +275,23 @@ void HTMLRenderer::check_state_change(GfxState * state)
/* /*
* CurTM * (cur_tx, cur_ty, 1)^T = OldTM * (draw_tx + dx, draw_ty + dy, 1)^T * CurTM * (cur_tx, cur_ty, 1)^T = OldTM * (draw_tx + dx, draw_ty + dy, 1)^T
* *
* the first 4 elements of CurTM and OldTM should be the same * the first 4 elements of CurTM and OldTM should be the proportional
* otherwise the following text cannot be parallel * otherwise the following text cannot be parallel
* *
* CurTM[4] - OldTM[4] = OldTM[0] * (draw_tx + dx - cur_tx) + OldTM[2] * (draw_ty + dy - cur_ty) * NOTE:
* CurTM[5] - OldTM[5] = OldTM[1] * (draw_tx + dx - cur_tx) + OldTM[3] * (draw_ty + dy - cur_ty) * dx,dy are handled by the old state. so they should be multiplied by old_draw_text_scale
*
* TODO, try to merge when cur_tm and old_tm are proportional
*/ */
bool merged = false; bool merged = false;
double dx = 0; double dx = 0;
double dy = 0; double dy = 0;
if(tm_equal(old_tm, cur_text_tm, 4)) if(tm_equal(old_html_state.transform_matrix, cur_html_state.transform_matrix, 4))
{ {
double det = old_tm[0] * old_tm[3] - old_tm[1] * old_tm[2]; double det = old_tm[0] * old_tm[3] - old_tm[1] * old_tm[2];
if(!equal(det, 0)) if(!equal(det, 0))
{ {
double lhs1 = cur_text_tm[4] - old_tm[4] - old_tm[0] * (draw_tx - cur_tx) - old_tm[2] * (draw_ty - cur_ty); double lhs1 = cur_text_tm[0] * cur_tx + cur_text_tm[2] * cur_ty + cur_text_tm[4] - old_tm[0] * draw_tx - old_tm[2] * draw_ty - old_tm[4];
double lhs2 = cur_text_tm[5] - old_tm[5] - old_tm[1] * (draw_tx - cur_tx) - old_tm[3] * (draw_ty - cur_ty); double lhs2 = cur_text_tm[1] * cur_tx + cur_text_tm[3] * cur_ty + cur_text_tm[5] - old_tm[1] * draw_tx - old_tm[3] * draw_ty - old_tm[5];
/* /*
* Now the equation system becomes * Now the equation system becomes
* *
@ -319,12 +316,12 @@ void HTMLRenderer::check_state_change(GfxState * state)
// otherwise we merge the lines only when // otherwise we merge the lines only when
// - text are not shifted to the left too much // - text are not shifted to the left too much
// - text are not moved too high or too low // - text are not moved too high or too low
if((dx * draw_text_scale) >= -(old_font_info->ascent - old_font_info->descent) * old_font_size - EPS) if((dx * old_draw_text_scale) >= -(old_html_state.font_info->ascent - old_html_state.font_info->descent) * old_html_state.font_size - EPS)
{ {
double oldymin = old_font_info->descent * old_font_size; double oldymin = old_html_state.font_info->descent * old_html_state.font_size;
double oldymax = old_font_info->ascent * old_font_size; double oldymax = old_html_state.font_info->ascent * old_html_state.font_size;
double ymin = dy * draw_text_scale + cur_html_state.font_info->descent * cur_html_state.font_size; double ymin = dy * old_draw_text_scale + cur_html_state.font_info->descent * cur_html_state.font_size;
double ymax = dy * draw_text_scale + cur_html_state.font_info->ascent * cur_html_state.font_size; double ymax = dy * old_draw_text_scale + cur_html_state.font_info->ascent * cur_html_state.font_size;
if((ymin <= oldymax + EPS) && (ymax >= oldymin - EPS)) if((ymin <= oldymax + EPS) && (ymax >= oldymin - EPS))
{ {
merged = true; merged = true;
@ -338,14 +335,14 @@ void HTMLRenderer::check_state_change(GfxState * state)
if(merged) if(merged)
{ {
text_line_buf->append_offset(dx * draw_text_scale); text_line_buf->append_offset(dx * old_draw_text_scale);
if(equal(dy, 0)) if(equal(dy, 0))
{ {
cur_html_state.vertical_align = 0; cur_html_state.vertical_align = 0;
} }
else else
{ {
cur_html_state.vertical_align = (dy * draw_text_scale); cur_html_state.vertical_align = (dy * old_draw_text_scale);
new_line_state = max<NewLineState>(new_line_state, NLS_SPAN); new_line_state = max<NewLineState>(new_line_state, NLS_SPAN);
} }
draw_tx = cur_tx; draw_tx = cur_tx;