1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-10-06 12:01:39 +00:00
pdf2htmlEX/src/util/StateTracker.h

115 lines
3.0 KiB
C
Raw Normal View History

2013-02-02 19:35:56 +00:00
/*
* StateTracker.h
*
* track specific PDF state
* manage reusable CSS classes
*
* Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com>
*/
2013-02-03 09:36:28 +00:00
#ifndef STATETRACKER_H__
#define STATETRACKER_H__
2013-02-02 19:35:56 +00:00
2013-02-03 16:40:07 +00:00
#include <iostream>
2013-02-03 09:36:28 +00:00
#include <map>
2013-02-02 19:35:56 +00:00
2013-02-05 05:57:11 +00:00
#include "util/math.h"
2013-02-02 19:35:56 +00:00
namespace pdf2htmlEX {
2013-02-03 09:36:28 +00:00
template<class ValueType, class Imp> class StateTracker {};
template<class Imp>
2013-02-03 16:40:07 +00:00
class StateTracker<double, Imp>
2013-02-02 19:35:56 +00:00
{
public:
2013-02-03 16:40:07 +00:00
StateTracker()
: eps(0)
2013-02-05 05:57:11 +00:00
, imp(static_cast<Imp*>(this))
2013-02-03 16:40:07 +00:00
{
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;
}
2013-02-02 19:35:56 +00:00
// usually called at the beginning of a page
2013-02-05 05:57:11 +00:00
void reset(void) {
value = imp->default_value();
_install(value);
}
2013-02-03 09:36:28 +00:00
2013-02-02 19:35:56 +00:00
/*
2013-02-05 05:57:11 +00:00
* install new_value if changed (equal() should be faster than map::lower_bound)
2013-02-03 09:36:28 +00:00
* return if the state has been indeed changed
2013-02-02 19:35:56 +00:00
*/
2013-02-05 05:57:11 +00:00
bool install(double new_value) {
2013-02-03 09:36:28 +00:00
if(equal(new_value, value))
return false;
2013-02-05 05:57:11 +00:00
return _install(new_value);
2013-02-03 09:36:28 +00:00
}
2013-02-05 05:57:11 +00:00
long long get_id (void) const { return id; }
2013-02-03 16:40:07 +00:00
double get_actual_value (void) const { return actual_value; }
2013-02-05 05:57:11 +00:00
void dump_css(std::ostream & out) {
for(auto iter = value_map.begin(); iter != value_map.end(); ++iter)
{
out << "." << css_class_name << iter->second << "{";
imp->dump_value(out, iter->first);
out << "}" << std::endl;
}
}
protected:
// this version of install does not check if value has been updated
bool _install(double new_value) {
2013-02-03 09:36:28 +00:00
value = new_value;
auto iter = value_map.lower_bound(new_value - eps);
2013-02-03 16:40:07 +00:00
if((iter != value_map.end()) && (abs(iter->first - value) <= eps))
{
2013-02-03 09:36:28 +00:00
actual_value = iter->first;
2013-02-05 05:57:11 +00:00
id = iter->second;
return false;
2013-02-03 09:36:28 +00:00
}
actual_value = new_value;
2013-02-05 05:57:11 +00:00
id = value_map.size();
value_map.insert(std::make_pair(new_value, id));
return true;
2013-02-03 16:40:07 +00:00
}
const char * css_class_name;
double eps;
2013-02-03 09:36:28 +00:00
Imp * imp;
2013-02-02 19:35:56 +00:00
2013-02-03 09:36:28 +00:00
long long id;
double value; // the value we are tracking
double actual_value; // the value we actually exported to HTML
std::map<double, long long> value_map;
2013-02-02 19:35:56 +00:00
};
2013-02-03 16:40:07 +00:00
class FontSizeTracker : public StateTracker<double, FontSizeTracker>
{
public:
double default_value(void) { return 0; }
double get_value(GfxState * state) { return state->getFontSize(); }
2013-02-05 05:57:11 +00:00
void dump_value(std::ostream & out, double value) { out << "font-size:" << round(value) << "px;"; }
2013-02-03 16:40:07 +00:00
};
class LetterSpaceTracker : public StateTracker<double, LetterSpaceTracker>
{
public:
double default_value(void) { return 0; }
double get_value(GfxState * state) { return state->getCharSpace(); }
2013-02-05 05:57:11 +00:00
void dump_value(std::ostream & out, double value) { out << "letter-spacing:" << round(value) << "px;"; }
2013-02-03 16:40:07 +00:00
};
2013-02-02 19:35:56 +00:00
} // namespace pdf2htmlEX
2013-02-03 09:36:28 +00:00
#endif //STATETRACKER_H__