diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.12.4/utils/HtmlFonts.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.12.4/utils/HtmlFonts.cc | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.12.4/utils/HtmlFonts.cc b/Build/source/libs/poppler/poppler-0.12.4/utils/HtmlFonts.cc new file mode 100644 index 00000000000..d2cbfd5363a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.12.4/utils/HtmlFonts.cc @@ -0,0 +1,360 @@ +//======================================================================== +// +// This file comes from pdftohtml project +// http://pdftohtml.sourceforge.net +// +// Copyright from: +// Gueorgui Ovtcharov +// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/> +// Mikhail Kruk <meshko@cs.brandeis.edu> +// +//======================================================================== + +//======================================================================== +// +// 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 <aacid@kde.org> +// Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru> +// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com> +// +// 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 <stdio.h> + + 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<int>(rgb.r/65535.0*255.0); + g=static_cast<int>(rgb.g/65535.0*255.0); + b=static_cast<int>(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)&&(i<font_num)) + { + i++; + } + pos=i; + delete fontname; + } else + pos = font_num; + if (!DefaultFont) DefaultFont=new GooString(fonts[font_num].name); + +} + +HtmlFont::HtmlFont(const HtmlFont& x){ + size=x.size; + lineSize=x.lineSize; + italic=x.italic; + bold=x.bold; + pos=x.pos; + color=x.color; + if (x.FontName) FontName=new GooString(x.FontName); + } + + +HtmlFont::~HtmlFont(){ + if (FontName) delete FontName; +} + +HtmlFont& HtmlFont::operator=(const HtmlFont& x){ + if (this==&x) return *this; + size=x.size; + lineSize=x.lineSize; + italic=x.italic; + bold=x.bold; + pos=x.pos; + color=x.color; + if (FontName) delete FontName; + if (x.FontName) FontName=new GooString(x.FontName); + return *this; +} + +void HtmlFont::clear(){ + if(DefaultFont) delete DefaultFont; + DefaultFont = NULL; +} + + + +/* + This function is used to compare font uniquily for insertion into + the list of all encountered fonts +*/ +GBool HtmlFont::isEqual(const HtmlFont& x) const{ + return ((size==x.size) && + (lineSize==x.lineSize) && + (pos==x.pos) && (bold==x.bold) && (italic==x.italic) && + (color.isEqual(x.getColor()))); +} + +/* + This one is used to decide whether two pieces of text can be joined together + and therefore we don't care about bold/italics properties +*/ +GBool HtmlFont::isEqualIgnoreBold(const HtmlFont& x) const{ + return ((size==x.size) && + (!strcmp(fonts[pos].name, fonts[x.pos].name)) && + (color.isEqual(x.getColor()))); +} + +GooString* HtmlFont::getFontName(){ + if (pos!=font_num) return new GooString(fonts[pos].name); + else return new GooString(DefaultFont); +} + +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; +} + +// this method if plain wrong todo +GooString* HtmlFont::HtmlFilter(Unicode* u, int uLen) { + GooString *tmp = new GooString(); + UnicodeMap *uMap; + char buf[8]; + int n; + + // get the output encoding + if (!(uMap = globalParams->getTextEncoding())) { + 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,"<b>",3); + cont->append("</b>",4); + } + if (font.isItalic()) { + cont->insert(0,"<i>",3); + cont->append("</i>",4); + } */ + + return cont; +} + +HtmlFontAccu::HtmlFontAccu(){ + accu=new GooVector<HtmlFont>(); +} + +HtmlFontAccu::~HtmlFontAccu(){ + if (accu) delete accu; +} + +int HtmlFontAccu::AddFont(const HtmlFont& font){ + GooVector<HtmlFont>::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("<span class=\"ft"); + tmp->append(iStr); + tmp->append("\">"); + tmp->append(content); + tmp->append("</span>"); + } 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<HtmlFont>::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("<fontspec id=\""); + tmp->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; +} + + |