//======================================================================== // // This file comes from pdftohtml project // http://pdftohtml.sourceforge.net // // Copyright from: // Gueorgui Ovtcharov // Rainer Dorsch // Mikhail Kruk // //======================================================================== //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2007 Albert Astals Cid // Copyright (C) 2008 Boris Toloknov // Copyright (C) 2008 Tomas Are Haavet // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #include "HtmlFonts.h" #include "GlobalParams.h" #include "UnicodeMap.h" #include struct Fonts{ char *Fontname; 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" }, }; #define xoutRound(x) ((int)(x + 0.5)) extern GBool xml; GooString* HtmlFont::DefaultFont=new GooString("Times"); // Arial,Helvetica,sans-serif HtmlFontColor::HtmlFontColor(GfxRGB rgb){ r=static_cast(rgb.r/65535.0*255.0); g=static_cast(rgb.g/65535.0*255.0); b=static_cast(rgb.b/65535.0*255.0); if (!(Ok(r)&&Ok(b)&&Ok(g))) { if (!globalParams->getErrQuiet()) fprintf(stderr, "Error : Bad color (%d,%d,%d) reset to (0,0,0)\n", r, g, b); r=0;g=0;b=0; } } GooString *HtmlFontColor::convtoX(unsigned int xcol) const{ GooString *xret=new GooString(); char tmp; unsigned int k; k = (xcol/16); if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); xret->append(tmp); k = (xcol%16); if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); xret->append(tmp); return xret; } GooString *HtmlFontColor::toString() const{ GooString *tmp=new GooString("#"); GooString *tmpr=convtoX(r); GooString *tmpg=convtoX(g); GooString *tmpb=convtoX(b); tmp->append(tmpr); tmp->append(tmpg); tmp->append(tmpb); delete tmpr; delete tmpg; delete tmpb; return tmp; } HtmlFont::HtmlFont(GooString* ftname,int _size, GfxRGB rgb){ //if (col) color=HtmlFontColor(col); //else color=HtmlFontColor(); color=HtmlFontColor(rgb); GooString *fontname = NULL; if( ftname ){ fontname = new GooString(ftname); FontName=new GooString(ftname); } else { fontname = NULL; FontName = NULL; } lineSize = -1; size=(_size-1); italic = gFalse; bold = gFalse; if (fontname){ if (strstr(fontname->lowerCase()->getCString(),"bold")) bold=gTrue; if (strstr(fontname->lowerCase()->getCString(),"italic")|| strstr(fontname->lowerCase()->getCString(),"oblique")) italic=gTrue; int i=0; while (strcmp(ftname->getCString(),fonts[i].Fontname)&&(igetTextEncoding())) { return tmp; } for (int i = 0; i < uLen; ++i) { switch (u[i]) { case '"': tmp->append("""); break; case '&': tmp->append("&"); break; case '<': tmp->append("<"); break; case '>': tmp->append(">"); break; case ' ': tmp->append( !xml && ( i+1 >= uLen || !tmp->getLength() || tmp->getChar( tmp->getLength()-1 ) == ' ' ) ? " " : " " ); break; default: { // convert unicode to string if ((n = uMap->mapUnicode(u[i], buf, sizeof(buf))) > 0) { tmp->append(buf, n); } } } } uMap->decRefCnt(); return tmp; } GooString* HtmlFont::simple(HtmlFont* font, Unicode* content, int uLen){ GooString *cont=HtmlFilter (content, uLen); /*if (font.isBold()) { cont->insert(0,"",3); cont->append("",4); } if (font.isItalic()) { cont->insert(0,"",3); cont->append("",4); } */ return cont; } HtmlFontAccu::HtmlFontAccu(){ accu=new GooVector(); } HtmlFontAccu::~HtmlFontAccu(){ if (accu) delete accu; } int HtmlFontAccu::AddFont(const HtmlFont& font){ GooVector::iterator i; for (i=accu->begin();i!=accu->end();i++) { if (font.isEqual(*i)) { return (int)(i-(accu->begin())); } } accu->push_back(font); return (accu->size()-1); } // get CSS font name for font #i GooString* HtmlFontAccu::getCSStyle(int i, GooString* content){ GooString *tmp; GooString *iStr=GooString::fromInt(i); if (!xml) { tmp = new GooString("append(iStr); tmp->append("\">"); tmp->append(content); tmp->append(""); } else { tmp = new GooString(""); tmp->append(content); } delete iStr; return tmp; } // get CSS font definition for font #i GooString* HtmlFontAccu::CSStyle(int i){ GooString *tmp=new GooString(); GooString *iStr=GooString::fromInt(i); GooVector::iterator g=accu->begin(); g+=i; HtmlFont font=*g; GooString *Size=GooString::fromInt(font.getSize()); GooString *colorStr=font.getColor().toString(); GooString *fontName=font.getFontName(); GooString *lSize; if(!xml){ tmp->append(".ft"); tmp->append(iStr); tmp->append("{font-size:"); tmp->append(Size); if( font.getLineSize() != -1 ) { lSize = GooString::fromInt(font.getLineSize()); tmp->append("px;line-height:"); tmp->append(lSize); delete lSize; } tmp->append("px;font-family:"); tmp->append(fontName); //font.getFontName()); tmp->append(";color:"); tmp->append(colorStr); tmp->append(";}"); } if (xml) { tmp->append("append(iStr); tmp->append("\" size=\""); tmp->append(Size); tmp->append("\" family=\""); tmp->append(fontName); //font.getFontName()); tmp->append("\" color=\""); tmp->append(colorStr); tmp->append("\"/>"); } delete fontName; delete colorStr; delete iStr; delete Size; return tmp; }