1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-12-22 04:50:09 +00:00

don't add space for tiny gaps

This commit is contained in:
Lu Wang 2013-03-31 01:21:14 +08:00
parent b1121bf02b
commit 99213d4e0b
2 changed files with 13 additions and 2 deletions

View File

@ -187,7 +187,7 @@ void HTMLRenderer::TextLineBuffer::flush(void)
if(is_positive(-actual_offset)) if(is_positive(-actual_offset))
last_text_pos_with_negative_offset = cur_text_idx; last_text_pos_with_negative_offset = cur_text_idx;
double threshold = cur_state->draw_font_size * (cur_state->font_info->ascent - cur_state->font_info->descent) * (renderer->param->space_threshold); double threshold = cur_state->em_size() * (renderer->param->space_threshold);
out << "<span class=\"" << CSS::WHITESPACE_CN out << "<span class=\"" << CSS::WHITESPACE_CN
<< ' ' << CSS::WHITESPACE_CN << wid << "\">" << (target > (threshold - EPS) ? " " : "") << "</span>"; << ' ' << CSS::WHITESPACE_CN << wid << "\">" << (target > (threshold - EPS) ? " " : "") << "</span>";
@ -268,9 +268,14 @@ void HTMLRenderer::TextLineBuffer::optimize(void)
while((offset_iter != offsets.end()) && (offset_iter->start_idx < text_idx1)) while((offset_iter != offsets.end()) && (offset_iter->start_idx < text_idx1))
++ offset_iter; ++ offset_iter;
double threshold = (state_iter1->em_size()) * (renderer->param->space_threshold);
for(; (offset_iter != offsets.end()) && (offset_iter->start_idx < text_idx2); ++offset_iter) for(; (offset_iter != offsets.end()) && (offset_iter->start_idx < text_idx2); ++offset_iter)
{ {
double target = offset_iter->width; double target = offset_iter->width;
// we don't want to add spaces for tiny gaps, or even negative shifts
if(target < threshold - EPS)
continue;
auto iter = width_map.lower_bound(target-EPS); auto iter = width_map.lower_bound(target-EPS);
if((iter != width_map.end()) && (abs(iter->first - target) <= EPS)) if((iter != width_map.end()) && (abs(iter->first - target) <= EPS))
{ {
@ -303,7 +308,6 @@ void HTMLRenderer::TextLineBuffer::optimize(void)
state_iter1->word_space = 0; state_iter1->word_space = 0;
double new_word_space = most_used_width - state_iter1->single_space_offset(); double new_word_space = most_used_width - state_iter1->single_space_offset();
// install new word_space // install new word_space
state_iter1->ids[State::WORD_SPACE_ID] = renderer->word_space_manager.install(new_word_space, &(state_iter1->word_space)); state_iter1->ids[State::WORD_SPACE_ID] = renderer->word_space_manager.install(new_word_space, &(state_iter1->word_space));
// mark that the word_space is not free // mark that the word_space is not free
@ -422,6 +426,11 @@ double HTMLRenderer::TextLineBuffer::State::single_space_offset(void) const
return word_space + letter_space + font_info->space_width * draw_font_size; return word_space + letter_space + font_info->space_width * draw_font_size;
} }
double HTMLRenderer::TextLineBuffer::State::em_size(void) const
{
return draw_font_size * (font_info->ascent - font_info->descent);
}
long long HTMLRenderer::TextLineBuffer::State::umask_by_id(int id) long long HTMLRenderer::TextLineBuffer::State::umask_by_id(int id)
{ {
return (((long long)0xff) << (8*id)); return (((long long)0xff) << (8*id));

View File

@ -31,6 +31,8 @@ public:
int diff(const State & s) const; int diff(const State & s) const;
// the offset cause by a single ' ' char // the offset cause by a single ' ' char
double single_space_offset(void) const; double single_space_offset(void) const;
// calculate em_size of this state
double em_size(void) const;
enum { enum {
FONT_ID, FONT_ID,