mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 04:50:09 +00:00
build ps encodnig directly without read/write fiels
This commit is contained in:
parent
ba305ae9fd
commit
8bfd45d4d1
@ -272,6 +272,7 @@ class HTMLRenderer : public OutputDev
|
|||||||
|
|
||||||
// for font reencoding
|
// for font reencoding
|
||||||
int32_t * cur_mapping;
|
int32_t * cur_mapping;
|
||||||
|
char ** cur_mapping2;
|
||||||
|
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
// styles & resources
|
// styles & resources
|
||||||
|
@ -36,12 +36,14 @@ HTMLRenderer::HTMLRenderer(const Param * param)
|
|||||||
|
|
||||||
ff_init();
|
ff_init();
|
||||||
cur_mapping = new int32_t [0x10000];
|
cur_mapping = new int32_t [0x10000];
|
||||||
|
cur_mapping2 = new char* [0x100];
|
||||||
}
|
}
|
||||||
|
|
||||||
HTMLRenderer::~HTMLRenderer()
|
HTMLRenderer::~HTMLRenderer()
|
||||||
{
|
{
|
||||||
clean_tmp_files();
|
clean_tmp_files();
|
||||||
delete [] cur_mapping;
|
delete [] cur_mapping;
|
||||||
|
delete [] cur_mapping2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLRenderer::process(PDFDoc *doc)
|
void HTMLRenderer::process(PDFDoc *doc)
|
||||||
|
@ -209,26 +209,24 @@ void HTMLRenderer::embed_font(const path & filepath, GfxFont * font, FontInfo &
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// move the slot such that it's consistent with the encoding seen in PDF
|
// move the slot such that it's consistent with the encoding seen in PDF
|
||||||
// TODO: build encoding directly
|
|
||||||
ofstream out(tmp_dir / (fn + "_.encoding"));
|
|
||||||
add_tmp_file(fn+"_.encoding");
|
|
||||||
|
|
||||||
unordered_set<string> nameset;
|
unordered_set<string> nameset;
|
||||||
bool name_conflict_warned = false;
|
bool name_conflict_warned = false;
|
||||||
|
|
||||||
out << format("/%1% [") % fn << endl;
|
memset(cur_mapping2, 0, 256 * sizeof(char*));
|
||||||
|
|
||||||
for(int i = 0; i < 256; ++i)
|
for(int i = 0; i < 256; ++i)
|
||||||
{
|
{
|
||||||
auto cn = font_8bit->getCharName(i);
|
auto cn = font_8bit->getCharName(i);
|
||||||
if(cn == nullptr)
|
if(cn == nullptr)
|
||||||
{
|
{
|
||||||
out << "/.notdef" << endl;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(nameset.insert(string(cn)).second)
|
if(nameset.insert(string(cn)).second)
|
||||||
{
|
{
|
||||||
out << "/" << cn << endl;
|
cur_mapping2[i] = cn;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -238,14 +236,11 @@ void HTMLRenderer::embed_font(const path & filepath, GfxFont * font, FontInfo &
|
|||||||
//TODO: may be resolved using advanced font properties?
|
//TODO: may be resolved using advanced font properties?
|
||||||
cerr << "Warning: encoding confliction detected in font: " << fn << endl;
|
cerr << "Warning: encoding confliction detected in font: " << fn << endl;
|
||||||
}
|
}
|
||||||
out << "/.notdef" << endl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out << "] def" << endl;
|
|
||||||
|
|
||||||
ff_load_encoding((tmp_dir / (fn+"_.encoding")).c_str(), nullptr);
|
ff_reencode_raw2(cur_mapping2, 256, 0);
|
||||||
ff_reencode(fn.c_str(), 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
60
src/ff/ff.c
60
src/ff/ff.c
@ -73,6 +73,7 @@ void ff_load_font(const char * filename)
|
|||||||
FVAppend(_FontViewCreate(cur_font));
|
FVAppend(_FontViewCreate(cur_font));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void ff_load_encoding(const char * filename, const char * encname)
|
void ff_load_encoding(const char * filename, const char * encname)
|
||||||
{
|
{
|
||||||
char * _filename = strcopy(filename);
|
char * _filename = strcopy(filename);
|
||||||
@ -81,6 +82,23 @@ void ff_load_encoding(const char * filename, const char * encname)
|
|||||||
free(_encname);
|
free(_encname);
|
||||||
free(_filename);
|
free(_filename);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void ff_do_reencode(Encoding * encoding, int force)
|
||||||
|
{
|
||||||
|
if(force)
|
||||||
|
{
|
||||||
|
SFForceEncoding(cur_font, cur_font->fv->map, encoding);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EncMapFree(cur_font->fv->map);
|
||||||
|
cur_font->fv->map= EncMapFromEncoding(cur_font, encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
SFReplaceEncodingBDFProps(cur_font, cur_font->fv->map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ff_reencode(const char * encname, int force)
|
void ff_reencode(const char * encname, int force)
|
||||||
{
|
{
|
||||||
@ -88,17 +106,7 @@ void ff_reencode(const char * encname, int force)
|
|||||||
if(!enc)
|
if(!enc)
|
||||||
err("Unknown encoding %s\n", encname);
|
err("Unknown encoding %s\n", encname);
|
||||||
|
|
||||||
if(force)
|
ff_do_reencode(enc, force);
|
||||||
{
|
|
||||||
SFForceEncoding(cur_font, cur_font->fv->map, enc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EncMapFree(cur_font->fv->map);
|
|
||||||
cur_font->fv->map= EncMapFromEncoding(cur_font, enc);
|
|
||||||
}
|
|
||||||
|
|
||||||
SFReplaceEncodingBDFProps(cur_font, cur_font->fv->map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_reencode_raw(int32 * mapping, int mapping_len, int force)
|
void ff_reencode_raw(int32 * mapping, int mapping_len, int force)
|
||||||
@ -110,17 +118,31 @@ void ff_reencode_raw(int32 * mapping, int mapping_len, int force)
|
|||||||
memcpy(enc->unicode, mapping, mapping_len * sizeof(int32_t));
|
memcpy(enc->unicode, mapping, mapping_len * sizeof(int32_t));
|
||||||
enc->enc_name = strcopy("");
|
enc->enc_name = strcopy("");
|
||||||
|
|
||||||
if(force)
|
ff_do_reencode(enc, force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ff_reencode_raw2(char ** mapping, int mapping_len, int force)
|
||||||
|
{
|
||||||
|
Encoding * enc = calloc(1, sizeof(Encoding));
|
||||||
|
enc->enc_name = strcopy("");
|
||||||
|
enc->char_cnt = mapping_len;
|
||||||
|
enc->unicode = (int32_t*)malloc(mapping_len * sizeof(int32_t));
|
||||||
|
enc->psnames = (char**)calloc(mapping_len, sizeof(char*));
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < mapping_len; ++i)
|
||||||
{
|
{
|
||||||
SFForceEncoding(cur_font, cur_font->fv->map, enc);
|
if(mapping[i])
|
||||||
}
|
{
|
||||||
else
|
enc->unicode[i] = UniFromName(mapping[i], ui_none, &custom);
|
||||||
{
|
enc->psnames[i] = strcopy(mapping[i]);
|
||||||
EncMapFree(cur_font->fv->map);
|
}
|
||||||
cur_font->fv->map= EncMapFromEncoding(cur_font, enc);
|
else
|
||||||
|
{
|
||||||
|
enc->unicode[i] = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SFReplaceEncodingBDFProps(cur_font, cur_font->fv->map);
|
ff_do_reencode(enc, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_cidflatten(void)
|
void ff_cidflatten(void)
|
||||||
|
@ -20,9 +20,12 @@ extern "C" {
|
|||||||
|
|
||||||
void ff_init(void);
|
void ff_init(void);
|
||||||
void ff_load_font(const char * filename);
|
void ff_load_font(const char * filename);
|
||||||
|
/*
|
||||||
void ff_load_encoding(const char * filename, const char * encname);
|
void ff_load_encoding(const char * filename, const char * encname);
|
||||||
|
*/
|
||||||
void ff_reencode(const char * encname, int force);
|
void ff_reencode(const char * encname, int force);
|
||||||
void ff_reencode_raw(int32_t * mapping, int mapping_len, int force);
|
void ff_reencode_raw(int32_t * mapping, int mapping_len, int force);
|
||||||
|
void ff_reencode_raw2(char ** mapping, int mapping_len, int force);
|
||||||
void ff_cidflatten(void);
|
void ff_cidflatten(void);
|
||||||
void ff_save(const char * filename);
|
void ff_save(const char * filename);
|
||||||
void ff_close(void);
|
void ff_close(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user