1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-07-05 17:48:38 +00:00
This commit is contained in:
Lu Wang 2013-04-04 22:57:50 +08:00
parent 19b1852d62
commit 6a8d111db6
2 changed files with 26 additions and 39 deletions

View File

@ -49,13 +49,6 @@ void HTMLRenderer::TextLineBuffer::append_offset(double width)
void HTMLRenderer::TextLineBuffer::append_state(const HTMLState & html_state) void HTMLRenderer::TextLineBuffer::append_state(const HTMLState & html_state)
{ {
if(states.empty())
{
// if this is the first state, update position and matrix
x = html_state.x;
y = html_state.y;
tm_id = renderer->transform_matrix_manager.install(html_state.transform_matrix);
}
if(states.empty() || (states.back().start_idx != text.size())) if(states.empty() || (states.back().start_idx != text.size()))
{ {
states.emplace_back(); states.emplace_back();
@ -63,7 +56,7 @@ void HTMLRenderer::TextLineBuffer::append_state(const HTMLState & html_state)
states.back().hash_umask = 0; states.back().hash_umask = 0;
} }
states.back().html_state = html_state; (HTMLState&)(states.back()) = html_state;
} }
void HTMLRenderer::TextLineBuffer::flush(void) void HTMLRenderer::TextLineBuffer::flush(void)
@ -101,32 +94,28 @@ void HTMLRenderer::TextLineBuffer::flush(void)
double max_ascent = 0; double max_ascent = 0;
for(auto iter = states.begin(); iter != states.end(); ++iter) for(auto iter = states.begin(); iter != states.end(); ++iter)
{ {
const auto & hs = iter->html_state; double cur_ascent = iter->rise + iter->font_info->ascent * iter->font_size;
double cur_ascent = hs.rise + hs.font_info->ascent * hs.font_size;
if(cur_ascent > max_ascent) if(cur_ascent > max_ascent)
max_ascent = cur_ascent; max_ascent = cur_ascent;
// set id // set id
iter->ids[State::FONT_ID] = hs.font_info->id; iter->ids[State::FONT_ID] = iter->font_info->id;
iter->ids[State::FONT_SIZE_ID] = renderer->font_size_manager.install(hs.font_size); iter->ids[State::FONT_SIZE_ID] = renderer->font_size_manager .install(iter->font_size);
iter->ids[State::FILL_COLOR_ID] = renderer->fill_color_manager.install(hs.fill_color); iter->ids[State::FILL_COLOR_ID] = renderer->fill_color_manager .install(iter->fill_color);
iter->ids[State::STROKE_COLOR_ID] = renderer->stroke_color_manager.install(hs.stroke_color); iter->ids[State::STROKE_COLOR_ID] = renderer->stroke_color_manager.install(iter->stroke_color);
iter->ids[State::LETTER_SPACE_ID] = renderer->letter_space_manager.install(hs.letter_space); iter->ids[State::LETTER_SPACE_ID] = renderer->letter_space_manager.install(iter->letter_space);
iter->ids[State::WORD_SPACE_ID] = renderer->word_space_manager.install(hs.word_space); iter->ids[State::WORD_SPACE_ID] = renderer->word_space_manager .install(iter->word_space);
iter->ids[State::RISE_ID] = renderer->rise_manager.install(hs.rise); iter->ids[State::RISE_ID] = renderer->rise_manager .install(iter->rise);
iter->hash(); iter->hash();
} }
long long hid = renderer->height_manager.install(max_ascent);
long long lid = renderer->left_manager .install(x);
long long bid = renderer->bottom_manager.install(y);
// open <div> for the current text line // open <div> for the current text line
out << "<div class=\"" << CSS::LINE_CN out << "<div class=\"" << CSS::LINE_CN
<< " " << CSS::TRANSFORM_MATRIX_CN << tm_id << " " << CSS::TRANSFORM_MATRIX_CN << renderer->transform_matrix_manager.install(states[0].transform_matrix)
<< " " << CSS::LEFT_CN << lid << " " << CSS::LEFT_CN << renderer->left_manager .install(states[0].x)
<< " " << CSS::HEIGHT_CN << hid << " " << CSS::HEIGHT_CN << renderer->height_manager .install(max_ascent)
<< " " << CSS::BOTTOM_CN << bid; << " " << CSS::BOTTOM_CN << renderer->bottom_manager .install(states[0].y)
;
// it will be closed by the first state // it will be closed by the first state
} }
@ -360,9 +349,9 @@ void HTMLRenderer::TextLineBuffer::optimize()
else else
{ {
// install new letter space // install new letter space
const double old_ls = state_iter1->html_state.letter_space; const double old_ls = state_iter1->letter_space;
state_iter1->ids[State::LETTER_SPACE_ID] = ls_manager.install(old_ls + most_used_width, &(state_iter1->html_state.letter_space)); state_iter1->ids[State::LETTER_SPACE_ID] = ls_manager.install(old_ls + most_used_width, &(state_iter1->letter_space));
letter_space_diff = old_ls - state_iter1->html_state.letter_space; letter_space_diff = old_ls - state_iter1->letter_space;
// update offsets // update offsets
auto off_iter = offset_iter1; auto off_iter = offset_iter1;
// re-count number of offsets // re-count number of offsets
@ -424,9 +413,9 @@ void HTMLRenderer::TextLineBuffer::optimize()
} }
} }
state_iter1->html_state.word_space = 0; // clear word_space for single_space_offset state_iter1->word_space = 0; // clear word_space for single_space_offset
double new_word_space = most_used_width - state_iter1->single_space_offset(); double new_word_space = most_used_width - state_iter1->single_space_offset();
state_iter1->ids[State::WORD_SPACE_ID] = ws_manager.install(new_word_space, &(state_iter1->html_state.word_space)); // install new word_space state_iter1->ids[State::WORD_SPACE_ID] = ws_manager.install(new_word_space, &(state_iter1->word_space)); // install new word_space
state_iter1->hash_umask &= (~word_space_umask); // mark that the word_space is not free state_iter1->hash_umask &= (~word_space_umask); // mark that the word_space is not free
} }
else // there is no offset at all else // there is no offset at all
@ -466,16 +455,16 @@ void HTMLRenderer::TextLineBuffer::State::begin (ostream & out, const State * pr
switch(i) switch(i)
{ {
case FONT_SIZE_ID: case FONT_SIZE_ID:
html_state.font_size = prev_state->html_state.font_size; font_size = prev_state->font_size;
break; break;
case LETTER_SPACE_ID: case LETTER_SPACE_ID:
html_state.letter_space = prev_state->html_state.letter_space; letter_space = prev_state->letter_space;
break; break;
case WORD_SPACE_ID: case WORD_SPACE_ID:
html_state.word_space = prev_state->html_state.word_space; word_space = prev_state->word_space;
break; break;
case RISE_ID: case RISE_ID:
html_state.rise = prev_state->html_state.rise; rise = prev_state->rise;
break; break;
default: default:
break; break;
@ -581,12 +570,12 @@ int HTMLRenderer::TextLineBuffer::State::diff(const State & s) const
double HTMLRenderer::TextLineBuffer::State::single_space_offset(void) const double HTMLRenderer::TextLineBuffer::State::single_space_offset(void) const
{ {
return html_state.word_space + html_state.letter_space + html_state.font_info->space_width * html_state.font_size; return word_space + letter_space + font_info->space_width * font_size;
} }
double HTMLRenderer::TextLineBuffer::State::em_size(void) const double HTMLRenderer::TextLineBuffer::State::em_size(void) const
{ {
return html_state.font_size * (html_state.font_info->ascent - html_state.font_info->descent); return 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)

View File

@ -19,7 +19,7 @@ class HTMLRenderer::TextLineBuffer
public: public:
TextLineBuffer (HTMLRenderer * renderer) : renderer(renderer) { } TextLineBuffer (HTMLRenderer * renderer) : renderer(renderer) { }
class State { class State : public HTMLState {
public: public:
// before output // before output
void begin(std::ostream & out, const State * prev_state); void begin(std::ostream & out, const State * prev_state);
@ -50,8 +50,6 @@ public:
long long ids[ID_COUNT]; long long ids[ID_COUNT];
HTMLState html_state;
size_t start_idx; // index of the first Text using this state size_t start_idx; // index of the first Text using this state
// for optimzation // for optimzation
long long hash_value; long long hash_value;