utils/HtmlFonts.cc | 135 ++++++++++++++++++------------------------------- utils/HtmlFonts.h | 8 -- utils/HtmlOutputDev.cc | 6 -- utils/pdftohtml.cc | 1 4 files changed, 53 insertions(+), 97 deletions(-)
New commits: commit e0eb2474ef0a154001512b66b7cd34f9d0cddd60 Author: Adam Reichold <[email protected]> Date: Tue Aug 21 20:09:40 2018 +0200 Remove HtmlFont::pos and always track a font name to allow handling of unknown font families with known style suffixes. diff --git a/utils/HtmlFonts.cc b/utils/HtmlFonts.cc index 9f0bc674..afd7a2a9 100644 --- a/utils/HtmlFonts.cc +++ b/utils/HtmlFonts.cc @@ -42,36 +42,37 @@ #include "GfxFont.h" #include <stdio.h> - struct Fonts{ - const char *Fontname; - const char *name; - }; - -const int font_num=13; - -static Fonts fonts[font_num+1]={ - {"Courier", "Courier" }, - {"Courier-Bold", "Courier"}, - {"Courier-BoldOblique", "Courier"}, - {"Courier-Oblique", "Courier"}, - {"Helvetica", "Helvetica"}, - {"Helvetica-Bold", "Helvetica"}, - {"Helvetica-BoldOblique", "Helvetica"}, - {"Helvetica-Oblique", "Helvetica"}, - {"Symbol", "Symbol" }, - {"Times-Bold", "Times" }, - {"Times-BoldItalic", "Times" }, - {"Times-Italic", "Times" }, - {"Times-Roman", "Times" }, - {" " , "Times" }, +namespace +{ + +const char* const defaultFamilyName = "Times"; + +const char* const styleSuffixes[] = { + "-Regular", + "-Bold", + "-BoldOblique", + "-BoldItalic", + "-Oblique", + "-Italic", + "-Roman", }; +void removeStyleSuffix(std::string& familyName) { + for (const char* const styleSuffix : styleSuffixes) { + auto pos = familyName.rfind(styleSuffix); + if (pos != std::string::npos) { + familyName.resize(pos); + return; + } + } +} + +} + #define xoutRound(x) ((int)(x + 0.5)) extern GBool xml; extern GBool fontFullName; -GooString* HtmlFont::DefaultFont=new GooString("Times"); // Arial,Helvetica,sans-serif - HtmlFontColor::HtmlFontColor(GfxRGB rgb){ r=static_cast<int>(rgb.r/65535.0*255.0); g=static_cast<int>(rgb.g/65535.0*255.0); @@ -110,23 +111,8 @@ GooString *HtmlFontColor::toString() const{ } HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb){ - //if (col) color=HtmlFontColor(col); - //else color=HtmlFontColor(); color=HtmlFontColor(rgb); - const GooString* ftname=font->getName(); - if (!ftname) ftname = getDefaultFont(); - GooString *fontname = nullptr; - - if( ftname ){ - fontname = new GooString(ftname); - FontName=new GooString(ftname); - } - else { - fontname = nullptr; - FontName = nullptr; - } - lineSize = -1; size=(_size-1); @@ -137,27 +123,28 @@ HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb){ if (font->isBold() || font->getWeight() >= GfxFont::W700) bold=gTrue; if (font->isItalic()) italic=gTrue; - if (fontname){ - if (!bold && strstr(fontname->lowerCase()->getCString(),"bold")) { + if (const GooString *fontname = font->getName()){ + FontName = new GooString(fontname); + + GooString fontnameLower(fontname); + fontnameLower.lowerCase(); + + if (!bold && strstr(fontnameLower.getCString(),"bold")) { bold=gTrue; } if (!italic && - (strstr(fontname->lowerCase()->getCString(),"italic")|| - strstr(fontname->lowerCase()->getCString(),"oblique"))) { + (strstr(fontnameLower.getCString(),"italic")|| + strstr(fontnameLower.getCString(),"oblique"))) { italic=gTrue; } - int i=0; - while (strcmp(ftname->getCString(),fonts[i].Fontname)&&(i<font_num)) - { - i++; - } - pos=i; - delete fontname; - } else - pos = font_num; - if (!DefaultFont) DefaultFont=new GooString(fonts[font_num].name); + familyName = fontname->getCString(); + removeStyleSuffix(familyName); + } else { + FontName = new GooString(defaultFamilyName); + familyName = defaultFamilyName; + } rotSkewMat[0] = rotSkewMat[1] = rotSkewMat[2] = rotSkewMat[3] = 0; } @@ -167,16 +154,16 @@ HtmlFont::HtmlFont(const HtmlFont& x){ lineSize=x.lineSize; italic=x.italic; bold=x.bold; - pos=x.pos; + familyName=x.familyName; color=x.color; - FontName = (x.FontName) ? new GooString(x.FontName) : nullptr; + FontName=new GooString(x.FontName); rotOrSkewed = x.rotOrSkewed; memcpy(rotSkewMat, x.rotSkewMat, sizeof(rotSkewMat)); } HtmlFont::~HtmlFont(){ - if (FontName) delete FontName; + delete FontName; } HtmlFont& HtmlFont::operator=(const HtmlFont& x){ @@ -185,20 +172,13 @@ HtmlFont& HtmlFont::operator=(const HtmlFont& x){ lineSize=x.lineSize; italic=x.italic; bold=x.bold; - pos=x.pos; + familyName=x.familyName; color=x.color; - if (FontName) delete FontName; - FontName = (x.FontName) ? new GooString(x.FontName) : nullptr; + delete FontName; + FontName=new GooString(x.FontName); return *this; } -void HtmlFont::clear(){ - if(DefaultFont) delete DefaultFont; - DefaultFont = nullptr; -} - - - /* This function is used to compare font uniquely for insertion into the list of all encountered fonts @@ -206,7 +186,7 @@ void HtmlFont::clear(){ GBool HtmlFont::isEqual(const HtmlFont& x) const{ return (size==x.size) && (lineSize==x.lineSize) && - (pos==x.pos) && (bold==x.bold) && (italic==x.italic) && + (FontName->cmp(x.FontName) == 0) && (bold==x.bold) && (italic==x.italic) && (color.isEqual(x.getColor())) && isRotOrSkewed() == x.isRotOrSkewed() && (!isRotOrSkewed() || rot_matrices_equal(getRotMat(), x.getRotMat())); } @@ -217,29 +197,16 @@ GBool HtmlFont::isEqual(const HtmlFont& x) const{ */ GBool HtmlFont::isEqualIgnoreBold(const HtmlFont& x) const{ return ((size==x.size) && - (!strcmp(fonts[pos].name, fonts[x.pos].name)) && + (familyName == x.familyName) && (color.isEqual(x.getColor()))); } GooString* HtmlFont::getFontName(){ - if (pos!=font_num) return new GooString(fonts[pos].name); - else return new GooString(DefaultFont); + return new GooString(familyName); } GooString* HtmlFont::getFullName(){ - if (FontName) - return new GooString(FontName); - else return new GooString(DefaultFont); -} - -void HtmlFont::setDefaultFont(GooString* defaultFont){ - if (DefaultFont) delete DefaultFont; - DefaultFont=new GooString(defaultFont); -} - - -GooString* HtmlFont::getDefaultFont(){ - return DefaultFont; + return new GooString(FontName); } // this method if plain wrong todo @@ -381,7 +348,7 @@ GooString* HtmlFontAccu::CSStyle(int i, int j){ tmp->append("\" size=\""); tmp->append(Size); tmp->append("\" family=\""); - tmp->append(fontName); //font.getFontName()); + tmp->append(fontName); tmp->append("\" color=\""); tmp->append(colorStr); tmp->append("\"/>"); diff --git a/utils/HtmlFonts.h b/utils/HtmlFonts.h index ba4f42ae..26abb7bf 100644 --- a/utils/HtmlFonts.h +++ b/utils/HtmlFonts.h @@ -65,8 +65,7 @@ class HtmlFont{ GBool italic; GBool bold; GBool rotOrSkewed; - int pos; // position of the font name in the fonts array - static GooString *DefaultFont; + std::string familyName; GooString *FontName; HtmlFontColor color; double rotSkewMat[4]; // only four values needed for rotation and skew @@ -77,7 +76,6 @@ public: HtmlFont& operator=(const HtmlFont& x); HtmlFontColor getColor() const {return color;} ~HtmlFont(); - static void clear(); GooString* getFullName(); GBool isItalic() const {return italic;} GBool isBold() const {return bold;} @@ -89,13 +87,11 @@ public: { rotOrSkewed = gTrue; memcpy(rotSkewMat, mat, sizeof(rotSkewMat)); } const double *getRotMat() const { return rotSkewMat; } GooString* getFontName(); - static GooString* getDefaultFont(); - static void setDefaultFont(GooString* defaultFont); static GooString* HtmlFilter(const Unicode* u, int uLen); //char* s); GBool isEqual(const HtmlFont& x) const; GBool isEqualIgnoreBold(const HtmlFont& x) const; static GooString* simple(HtmlFont *font, Unicode *content, int uLen); - void print() const {printf("font: %s %d %s%spos: %d\n", FontName->getCString(), size, bold ? "bold " : "", italic ? "italic " : "", pos);}; + void print() const {printf("font: %s (%s) %d %s%s\n", FontName->getCString(), familyName.c_str(), size, bold ? "bold " : "", italic ? "italic " : "");}; }; class HtmlFontAccu{ diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index df3171db..b379102b 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -352,7 +352,6 @@ void HtmlPage::conv(){ HtmlFont* h; for(tmp=yxStrings;tmp;tmp=tmp->yxNext){ int pos=tmp->fontpos; - // printf("%d\n",pos); h=fonts->Get(pos); if (tmp->htext) delete tmp->htext; @@ -360,9 +359,6 @@ void HtmlPage::conv(){ if (links->inLink(tmp->xMin,tmp->yMin,tmp->xMax,tmp->yMax, linkIndex)){ tmp->link = links->getLink(linkIndex); - /*GooString *t=tmp->htext; - tmp->htext=links->getLink(k)->Link(tmp->htext); - delete t;*/ } } @@ -1225,8 +1221,6 @@ HtmlOutputDev::HtmlOutputDev(Catalog *catalogA, const char *fileName, const char } HtmlOutputDev::~HtmlOutputDev() { - HtmlFont::clear(); - delete Docname; delete docTitle; diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc index a8ede422..6871f4e9 100644 --- a/utils/pdftohtml.cc +++ b/utils/pdftohtml.cc @@ -446,7 +446,6 @@ int main(int argc, char *argv[]) { if(globalParams) delete globalParams; if(htmlFileName) delete htmlFileName; - HtmlFont::clear(); return exit_status; } _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
