diff --git a/src/HTMLRenderer.h b/src/HTMLRenderer.h
index ffc38bd..eed9a65 100644
--- a/src/HTMLRenderer.h
+++ b/src/HTMLRenderer.h
@@ -272,6 +272,7 @@ class HTMLRenderer : public OutputDev
// for font reencoding
int32_t * cur_mapping;
+ char ** cur_mapping2;
////////////////////////////////////////////////////
// styles & resources
diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc
index 83cd348..ac587e2 100644
--- a/src/HTMLRenderer/general.cc
+++ b/src/HTMLRenderer/general.cc
@@ -36,12 +36,14 @@ HTMLRenderer::HTMLRenderer(const Param * param)
ff_init();
cur_mapping = new int32_t [0x10000];
+ cur_mapping2 = new char* [0x100];
}
HTMLRenderer::~HTMLRenderer()
{
clean_tmp_files();
delete [] cur_mapping;
+ delete [] cur_mapping2;
}
void HTMLRenderer::process(PDFDoc *doc)
diff --git a/src/HTMLRenderer/text.cc b/src/HTMLRenderer/text.cc
index 4543b6b..5f0aea3 100644
--- a/src/HTMLRenderer/text.cc
+++ b/src/HTMLRenderer/text.cc
@@ -209,26 +209,24 @@ void HTMLRenderer::embed_font(const path & filepath, GfxFont * font, FontInfo &
else
{
// 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 nameset;
bool name_conflict_warned = false;
- out << format("/%1% [") % fn << endl;
+ memset(cur_mapping2, 0, 256 * sizeof(char*));
+
for(int i = 0; i < 256; ++i)
{
auto cn = font_8bit->getCharName(i);
if(cn == nullptr)
{
- out << "/.notdef" << endl;
+ continue;
}
else
{
if(nameset.insert(string(cn)).second)
{
- out << "/" << cn << endl;
+ cur_mapping2[i] = cn;
}
else
{
@@ -238,14 +236,11 @@ void HTMLRenderer::embed_font(const path & filepath, GfxFont * font, FontInfo &
//TODO: may be resolved using advanced font properties?
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(fn.c_str(), 0);
+ ff_reencode_raw2(cur_mapping2, 256, 0);
}
}
else
diff --git a/src/ff/ff.c b/src/ff/ff.c
index 777fbe7..87b444e 100644
--- a/src/ff/ff.c
+++ b/src/ff/ff.c
@@ -73,6 +73,7 @@ void ff_load_font(const char * filename)
FVAppend(_FontViewCreate(cur_font));
}
+/*
void ff_load_encoding(const char * filename, const char * encname)
{
char * _filename = strcopy(filename);
@@ -81,6 +82,23 @@ void ff_load_encoding(const char * filename, const char * encname)
free(_encname);
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)
{
@@ -88,17 +106,7 @@ void ff_reencode(const char * encname, int force)
if(!enc)
err("Unknown encoding %s\n", encname);
- if(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);
+ ff_do_reencode(enc, 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));
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);
- }
- else
- {
- EncMapFree(cur_font->fv->map);
- cur_font->fv->map= EncMapFromEncoding(cur_font, enc);
+ if(mapping[i])
+ {
+ enc->unicode[i] = UniFromName(mapping[i], ui_none, &custom);
+ enc->psnames[i] = strcopy(mapping[i]);
+ }
+ else
+ {
+ enc->unicode[i] = -1;
+ }
}
- SFReplaceEncodingBDFProps(cur_font, cur_font->fv->map);
+ ff_do_reencode(enc, force);
}
void ff_cidflatten(void)
diff --git a/src/ff/ff.h b/src/ff/ff.h
index 31df702..ed0d15c 100644
--- a/src/ff/ff.h
+++ b/src/ff/ff.h
@@ -20,9 +20,12 @@ extern "C" {
void ff_init(void);
void ff_load_font(const char * filename);
+/*
void ff_load_encoding(const char * filename, const char * encname);
+*/
void ff_reencode(const char * encname, 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_save(const char * filename);
void ff_close(void);