mirror of
https://github.com/reactos/reactos.git
synced 2024-09-07 03:11:07 +00:00
327 lines
7.4 KiB
C++
327 lines
7.4 KiB
C++
![]() |
#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>(255*rgb.r);
|
||
|
g=static_cast<int>(255*rgb.g);
|
||
|
b=static_cast<int>(255*rgb.b);
|
||
|
if (!(Ok(r)&&Ok(b)&&Ok(g))) {printf("Error : Bad color \n");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;
|
||
|
}
|
||
|
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;
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
|