2013-02-02 19:35:56 +00:00
|
|
|
/*
|
2013-02-05 06:36:36 +00:00
|
|
|
* StateManager.h
|
2013-02-02 19:35:56 +00:00
|
|
|
*
|
|
|
|
* manage reusable CSS classes
|
|
|
|
*
|
|
|
|
* Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com>
|
|
|
|
*/
|
|
|
|
|
2013-02-05 06:36:36 +00:00
|
|
|
#ifndef STATEMANAGER_H__
|
|
|
|
#define STATEMANAGER_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-05 06:36:36 +00:00
|
|
|
template<class ValueType, class Imp> class StateManager {};
|
2013-02-03 09:36:28 +00:00
|
|
|
|
|
|
|
template<class Imp>
|
2013-02-05 06:36:36 +00:00
|
|
|
class StateManager<double, Imp>
|
2013-02-02 19:35:56 +00:00
|
|
|
{
|
|
|
|
public:
|
2013-02-05 06:36:36 +00:00
|
|
|
StateManager()
|
2013-02-03 16:40:07 +00:00
|
|
|
: 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
|
|
|
|
2013-02-05 06:36:36 +00:00
|
|
|
long long get_id (void) const { return id; }
|
|
|
|
double get_value (void) const { return value; }
|
|
|
|
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-05 06:36:36 +00:00
|
|
|
class FontSizeManager : public StateManager<double, FontSizeManager>
|
2013-02-03 16:40:07 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
double default_value(void) { return 0; }
|
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
|
|
|
};
|
|
|
|
|
2013-02-05 06:36:36 +00:00
|
|
|
class LetterSpaceManager : public StateManager<double, LetterSpaceManager>
|
2013-02-03 16:40:07 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
double default_value(void) { return 0; }
|
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-05 06:36:36 +00:00
|
|
|
class WordSpaceManager : public StateManager<double, WordSpaceManager>
|
2013-02-05 06:21:07 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
double default_value(void) { return 0; }
|
|
|
|
void dump_value(std::ostream & out, double value) { out << "word-spacing:" << round(value) << "px;"; }
|
|
|
|
};
|
|
|
|
|
2013-02-02 19:35:56 +00:00
|
|
|
} // namespace pdf2htmlEX
|
|
|
|
|
2013-02-05 06:36:36 +00:00
|
|
|
#endif //STATEMANAGER_H__
|