1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-07-07 18:30:34 +00:00
pdf2htmlEX/src/HTMLRenderer/TextLineBuffer.h

101 lines
2.3 KiB
C
Raw Normal View History

2012-12-11 12:48:10 +00:00
#ifndef TEXTLINEBUFFER_H__
#define TEXTLINEBUFFER_H__
#include <iostream>
#include <vector>
namespace pdf2htmlEX {
2013-01-19 11:19:15 +00:00
/*
* Store a series of
* - Text
* - Shift
* - State change
* within a line
*/
2012-12-11 12:52:36 +00:00
class HTMLRenderer;
2012-12-11 12:48:10 +00:00
class HTMLRenderer::TextLineBuffer
{
public:
TextLineBuffer (HTMLRenderer * renderer) : renderer(renderer) { }
class State {
2013-03-30 17:00:04 +00:00
public:
// before output
void begin(std::ostream & out, const State * prev_state);
// after output
void end(std::ostream & out) const;
// calculate the hash code
void hash(void);
// calculate the difference between another State
int diff(const State & s) const;
// the offset cause by a single ' ' char
double single_space_offset(void) const;
2013-03-30 17:21:14 +00:00
// calculate em_size of this state
double em_size(void) const;
2013-03-30 17:00:04 +00:00
enum {
FONT_ID,
FONT_SIZE_ID,
FILL_COLOR_ID,
STROKE_COLOR_ID,
LETTER_SPACE_ID,
WORD_SPACE_ID,
RISE_ID,
ID_COUNT
};
static long long umask_by_id(int id);
long long ids[ID_COUNT];
const FontInfo * font_info;
double draw_font_size;
double letter_space;
double word_space;
size_t start_idx; // index of the first Text using this state
// for optimzation
long long hash_value;
long long hash_umask; // some states may not be actually used
bool need_close;
static const char * const css_class_names []; // class names for each id
2012-12-11 12:48:10 +00:00
};
class Offset {
2013-03-30 17:00:04 +00:00
public:
size_t start_idx; // should put this Offset right before text[start_idx];
double width;
2012-12-11 12:48:10 +00:00
};
2013-03-30 14:37:20 +00:00
void set_pos(GfxState * state);
2012-12-11 12:48:10 +00:00
void append_unicodes(const Unicode * u, int l);
void append_offset(double width);
void append_state(void);
void flush(void);
private:
// retrieve state from renderer
void set_state(State & state);
2013-03-20 15:46:58 +00:00
void optimize(void);
2012-12-11 12:48:10 +00:00
HTMLRenderer * renderer;
double x, y;
long long tm_id;
std::vector<State> states;
std::vector<Offset> offsets;
std::vector<Unicode> text;
// for flush
std::vector<State*> stack;
};
} // namespace pdf2htmlEX
#endif //TEXTLINEBUFFER_H__