From 429ff6bcd6c283e8609fffd1dc313df9fd5a56c9 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Mon, 4 Feb 2013 00:40:07 +0800 Subject: [PATCH] working --- src/HTMLRenderer/StateTracker.h | 79 ++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/src/HTMLRenderer/StateTracker.h b/src/HTMLRenderer/StateTracker.h index 35a38d8..7dfe6fd 100644 --- a/src/HTMLRenderer/StateTracker.h +++ b/src/HTMLRenderer/StateTracker.h @@ -10,6 +10,7 @@ #ifndef STATETRACKER_H__ #define STATETRACKER_H__ +#include #include #include @@ -19,19 +20,25 @@ namespace pdf2htmlEX { template class StateTracker {}; template -class StateTracker +class StateTracker { public: - // values no father than eps are treated as equal - StateTracker(const char * css_class_prefix, double eps) - : css_class_prefix(css_class_prefix) - , eps(eps) + StateTracker() + : eps(0) , changed(false) , imp(static_cast(this)) - { } + { + reset(); + } + + // values no father than eps are treated as equal + void set_param (const char * css_class_name, double eps) { + this->css_class_name = css_class_name; + this->eps = eps; + } // usually called at the beginning of a page - void reset(void) { imp->reset(); } + void reset(void) { value = imp->default_value(); } // is called when PDF updates the state void update(GfxState * state) { changed = true; } @@ -39,7 +46,7 @@ public: * retrive the new state if update() is called recently, or force == true * return if the state has been indeed changed */ - bool sync(GfxState * state, bool force)| { + bool sync(GfxState * state, bool force) { if(!(changed || force)) return false; @@ -52,13 +59,15 @@ public: install(new_value); return true; } - - + + double get_actual_value (void) const { return actual_value; } + long long install(double new_value) { value = new_value; auto iter = value_map.lower_bound(new_value - eps); - if((iter != value_map.end()) && (abs(iter->first - value) <= eps)) { + if((iter != value_map.end()) && (abs(iter->first - value) <= eps)) + { actual_value = iter->first; return iter->second; } @@ -67,23 +76,59 @@ public: long long new_id = map.size(); map.insert(make_pair(new_value, new_id)); - imp->create(new_id, new_value); - return new_id; } -private: - const char * css_class_prefix; - const double eps; + + void dump_css(std::ostream & out) { + for(auto iter = map.begin(); iter != map.end(); ++iter) + { + out << "." << css_class_name << iter->second << "{"; + imp->dump_value(out, iter->first); + out << "}" << std::endl; + } + } + +protected: + const char * css_class_name; + double eps; bool changed; Imp * imp; - long long id; double value; // the value we are tracking double actual_value; // the value we actually exported to HTML std::map value_map; }; +class FontSizeTracker : public StateTracker +{ +public: + double default_value(void) { return 0; } + double get_value(GfxState * state) { return state->getFontSize(); } + void dump_value(std::ostream & out, double value) { out "font-size:" << round(value) << "px;"; } + } +}; + +class LetterSpaceTracker : public StateTracker +{ +public: + double default_value(void) { return 0; } + double get_value(GfxState * state) { return state->getCharSpace(); } + void dump_value(std::ostream & out, double value) { out "font-size:" << round(value) << "px;"; } + } +}; + + + + std::map transform_matrix_map; + std::map letter_space_map; + std::map word_space_map; + std::unordered_map fill_color_map, stroke_color_map; + std::map whitespace_map; + std::map rise_map; + std::map height_map; + std::map left_map; + } // namespace pdf2htmlEX