diff --git a/src/FontPreprocessor.cc b/src/FontPreprocessor.cc new file mode 100644 index 0000000..1ee1d35 --- /dev/null +++ b/src/FontPreprocessor.cc @@ -0,0 +1,61 @@ +/* + * FontPreprocessor.h + * + * Check used codes for each font + * + * by WangLu + * 2012.09.07 + */ + +#include + +#include +#include + +#include "FontPreprocessor.h" +#include "util.h" + +FontPreprocessor::FontPreprocessor(void) + : cur_font_id(0) + , cur_code_map(nullptr) +{ } + +FontPreprocessor::~FontPreprocessor(void) +{ + for(auto & p : code_maps) + delete [] p.second; +} + +void FontPreprocessor::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) +{ + GfxFont * font = state->getFont(); + if(!font) return; + + long long fn_id = hash_ref(font->getID()); + + if(fn_id != cur_font_id) + { + cur_font_id = fn_id; + auto p = code_maps.insert(std::make_pair(cur_font_id, nullptr)); + if(p.second) + { + // this is a new font + int len = font->isCIDFont() ? 0x10000 : 0x100; + p.first->second = new char [len]; + memset(p.first->second, 0, len * sizeof(char)); + } + + cur_code_map = p.first->second; + } + + cur_code_map[code] = 1; +} + +const char * FontPreprocessor::get_code_map (long long font_id) const +{ + auto iter = code_maps.find(font_id); + return (iter == code_maps.end()) ? nullptr : (iter->second); +} diff --git a/src/FontPreprocessor.h b/src/FontPreprocessor.h new file mode 100644 index 0000000..96bc8e5 --- /dev/null +++ b/src/FontPreprocessor.h @@ -0,0 +1,42 @@ +/* + * FontPreprocessor.h + * + * Check used codes for each font + * + * by WangLu + * 2012.09.07 + */ + + +#ifndef FONTPREPROCESSOR_H__ +#define FONTPREPROCESSOR_H__ + +#include + +#include + +class FontPreprocessor : public OutputDev { +public: + FontPreprocessor(void); + virtual ~FontPreprocessor(void); + + virtual GBool upsideDown() { return gFalse; } + virtual GBool useDrawChar() { return gTrue; } + virtual GBool interpretType3Chars() { return gFalse; } + virtual GBool needNonText() { return gFalse; } + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + + const char * get_code_map (long long font_id) const; + +protected: + long long cur_font_id; + char * cur_code_map; + + std::unordered_map code_maps; +}; + + +#endif //FONTPREPROCESSOR_H__