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:
parent
ab2588a5fd
commit
952cd4d3c9
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user