Subversion Repositories Scribus

Rev

Rev 3205 | Rev 3240 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 Franz 1
#include "scpreview.h"
2
#include <qtextstream.h>
3
#include <qdom.h>
838 cbradney 4
#include <qmap.h>
30 Franz 5
#include <qpainter.h>
6
#include <qrect.h>
7
#include <qimage.h>
8
#include <qregion.h>
9
#include <qregexp.h>
10
#include <qfileinfo.h>
11
#include <qbitmap.h>
31 Franz 12
#include <qdir.h>
30 Franz 13
#include <cmath>
31 Franz 14
#include <cstdlib>
30 Franz 15
#include "missing.h"
382 Franz 16
#include "scribus.h"
1743 craig 17
#include "splash.h"
2534 craig 18
#include "util.h"
2834 cbradney 19
#include "prefsmanager.h"
504 cbradney 20
 
21
using namespace std;
22
 
30 Franz 23
 
3205 craig 24
 
2834 cbradney 25
ScPreview::ScPreview()
30 Franz 26
{
2834 cbradney 27
        prefsManager = PrefsManager::instance();
30 Franz 28
        Farben.clear();
29
        MLineStyles.clear();
30
        Segments.clear();
31
}
31 Franz 32
 
30 Franz 33
QPixmap ScPreview::createPreview(QString data)
34
{
1065 cbradney 35
        struct CopyPasteBuffer OB;
36
        struct ScText *hg;
37
        struct ScText *hl;
38
        QPtrList<ScText> Ptexti;
220 Franz 39
        bool error;
2886 fschmid 40
        ScColor lf = ScColor();
30 Franz 41
        QFont fo;
42
        QMap<QString,QString> DoFonts;
43
        QMap<QString,QFont> DoFonts2;
741 fschmid 44
        QMap<int,int> arrowID;
30 Franz 45
        QString tmpf, tmpx, tmp2, tmp3;
46
        int x, y;
80 Franz 47
        double xf, yf, asce;
30 Franz 48
        QPainter pm;
63 Franz 49
        QPainter pb;
50
        QPainter pd;
51
        QBitmap bmd;
52
        QPixmap pmd;
68 Franz 53
        QImage ip2;
54
        FPoint gv;
55
        int chs;
30 Franz 56
        QPointArray cl;
57
        QColor tmpfa;
58
        QString chx;
59
        uint a, zae;
80 Franz 60
        double CurY, EndX, CurX, wide, rota, wid;
1065 cbradney 61
        QValueList<ArrowDesc> arrowStyles;
2834 cbradney 62
        arrowStyles = prefsManager->appPrefs.arrowStyles;
30 Franz 63
        QDomDocument docu("scridoc");
64
        docu.setContent(data);
65
        QDomElement elem=docu.documentElement();
66
        if ((elem.tagName() != "SCRIBUSELEM") && (elem.tagName() != "SCRIBUSELEMUTF8"))
268 Franz 67
        {
30 Franz 68
                QPixmap tmp = QPixmap(0, 0);
69
                return tmp;
268 Franz 70
        }
80 Franz 71
        double GrX = QStodouble(elem.attribute("XP"));
72
        double GrY = QStodouble(elem.attribute("YP"));
73
        double GrW = QStodouble(elem.attribute("W"));
74
        double GrH = QStodouble(elem.attribute("H"));
2834 cbradney 75
        double pmmax = prefsManager->appPrefs.PSize / QMAX(GrW+50, GrH+50);
741 fschmid 76
        QPixmap tmp = QPixmap(static_cast<int>(GrW)+50, static_cast<int>(GrH)+50);
68 Franz 77
        ScPainter *pS = new ScPainter(&tmp, tmp.width(), tmp.height());
741 fschmid 78
        pS->translate(25,25);
30 Franz 79
        QDomNode DOC=elem.firstChild();
80
        DoFonts.clear();
68 Franz 81
        FT_Init_FreeType( &library );
30 Franz 82
        while(!DOC.isNull())
268 Franz 83
        {
30 Franz 84
                QDomElement pg=DOC.toElement();
741 fschmid 85
                if(pg.tagName()=="Arrows")
86
                {
1065 cbradney 87
                        struct ArrowDesc arrow;
741 fschmid 88
                        double xa, ya;
760 fschmid 89
                        arrow.name = pg.attribute("Name");
741 fschmid 90
                        QString tmp = pg.attribute("Points");
91
                        QTextStream fp(&tmp, IO_ReadOnly);
92
                        for (uint cx = 0; cx < pg.attribute("NumPoints").toUInt(); ++cx)
93
                        {
94
                                fp >> xa;
95
                                fp >> ya;
760 fschmid 96
                                arrow.points.addPoint(xa, ya);
741 fschmid 97
                        }
98
                        arrowStyles.append(arrow);
99
                        arrowID.insert(QStoInt(pg.attribute("Index")), arrowStyles.count());
100
                }
30 Franz 101
                if(pg.tagName()=="FONT")
268 Franz 102
                {
30 Franz 103
                        tmpf = GetAttr(&pg, "NAME");
2834 cbradney 104
                        if ((!prefsManager->appPrefs.AvailFonts.find(tmpf)) || (!prefsManager->appPrefs.AvailFonts[tmpf]->UseFont))
268 Franz 105
                        {
2834 cbradney 106
                                if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[prefsManager->appPrefs.GFontSub[tmpf]]->UseFont))
30 Franz 107
                                {
669 cbradney 108
                                        if (ScApp->splashScreen != NULL)
109
                                                ScApp->splashScreen->hide();
2834 cbradney 110
                                        MissingFont *dia = new MissingFont(0, tmpf, 0);
30 Franz 111
                                        dia->exec();
713 cbradney 112
                                        tmpf = dia->getReplacementFont();
30 Franz 113
                                        delete dia;
669 cbradney 114
                                        if (ScApp->splashScreen != NULL)
115
                                                ScApp->splashScreen->show();
2834 cbradney 116
                                        prefsManager->appPrefs.GFontSub[pg.attribute("NAME")] = tmpf;
268 Franz 117
                                }
30 Franz 118
                                else
2834 cbradney 119
                                        tmpf = prefsManager->appPrefs.GFontSub[tmpf];
268 Franz 120
                        }
68 Franz 121
                        if (!DoFonts2.contains(tmpf))
220 Franz 122
                        {
123
                                FT_Face      face;
2834 cbradney 124
                                error = FT_New_Face( library, prefsManager->appPrefs.AvailFonts[tmpf]->Datei, prefsManager->appPrefs.AvailFonts[tmpf]->faceIndex, &face );
220 Franz 125
                                if (error)
2834 cbradney 126
                                        tmpf = prefsManager->appPrefs.toolSettings.defFont;
127
                                if (prefsManager->appPrefs.AvailFonts[tmpf]->ReadMetrics())
128
                                        prefsManager->appPrefs.AvailFonts[tmpf]->CharWidth[13] = 0;
220 Franz 129
                                else
68 Franz 130
                                {
2834 cbradney 131
                                        tmpf = prefsManager->appPrefs.toolSettings.defFont;
132
                                        prefsManager->appPrefs.AvailFonts[tmpf]->ReadMetrics();
133
                                        prefsManager->appPrefs.AvailFonts[tmpf]->CharWidth[13] = 0;
68 Franz 134
                                }
220 Franz 135
                        }
2834 cbradney 136
                        fo = prefsManager->appPrefs.AvailFonts[tmpf]->Font;
220 Franz 137
                        fo.setPointSize(12);
30 Franz 138
                        DoFonts[GetAttr(&pg, "NAME")] = tmpf;
139
                        DoFonts2[GetAttr(&pg, "NAME")] = fo;
268 Franz 140
                }
30 Franz 141
                if(pg.tagName()=="COLOR")
268 Franz 142
                {
30 Franz 143
                        if (pg.hasAttribute("CMYK"))
144
                                lf.setNamedColor(GetAttr(&pg, "CMYK"));
145
                        else
146
                                lf.fromQColor(QColor(GetAttr(&pg, "RGB")));
268 Franz 147
                        Farben[GetAttr(&pg, "NAME")] = lf;
148
                }
30 Franz 149
                if(pg.tagName()=="MultiLine")
268 Franz 150
                {
30 Franz 151
                        multiLine ml;
152
                        QDomNode MuLn = DOC.firstChild();
153
                        while(!MuLn.isNull())
268 Franz 154
                        {
30 Franz 155
                                QDomElement MuL = MuLn.toElement();
1065 cbradney 156
                                struct SingleLine sl;
30 Franz 157
                                sl.Color = MuL.attribute("Color");
158
                                sl.Dash = QStoInt(MuL.attribute("Dash"));
159
                                sl.LineEnd = QStoInt(MuL.attribute("LineEnd"));
160
                                sl.LineJoin = QStoInt(MuL.attribute("LineJoin"));
161
                                sl.Shade = QStoInt(MuL.attribute("Shade"));
80 Franz 162
                                sl.Width = QStodouble(MuL.attribute("Width"));
33 Franz 163
                                ml.push_back(sl);
30 Franz 164
                                MuLn = MuLn.nextSibling();
268 Franz 165
                        }
30 Franz 166
                        if (!MLineStyles.contains(pg.attribute("Name")))
167
                                MLineStyles.insert(pg.attribute("Name"), ml);
268 Franz 168
                }
30 Franz 169
                DOC=DOC.nextSibling();
268 Franz 170
        }
30 Franz 171
        DOC=elem.firstChild();
172
        while(!DOC.isNull())
268 Franz 173
        {
30 Franz 174
                QDomElement pg=DOC.toElement();
175
                if(pg.tagName()=="ITEM")
268 Franz 176
                {
31 Franz 177
                        QString CurDirP = QDir::currentDirPath();
282 Franz 178
                        QDir::setCurrent(QDir::homeDirPath());
30 Franz 179
                        Segments.clear();
1460 cbradney 180
                        // TODO: Nicer conversion
181
                        OB.PType = static_cast<PageItem::ItemType>(QStoInt(pg.attribute("PTYPE")));
80 Franz 182
                        OB.Xpos = QStodouble(pg.attribute("XPOS")) - GrX;
183
                        OB.Ypos = QStodouble(pg.attribute("YPOS")) - GrY;
184
                        OB.Width = QStodouble(pg.attribute("WIDTH"));
185
                        OB.Height = QStodouble(pg.attribute("HEIGHT"));
186
                        OB.RadRect = QStodouble(pg.attribute("RADRECT","0"));
30 Franz 187
                        OB.ClipEdited = QStoInt(pg.attribute("CLIPEDIT", "0"));
188
                        OB.FrameType = QStoInt(pg.attribute("FRTYPE", "0"));
80 Franz 189
                        OB.Pwidth = QStodouble(pg.attribute("PWIDTH"));
30 Franz 190
                        OB.Pcolor = pg.attribute("PCOLOR");
191
                        OB.Pcolor2 = pg.attribute("PCOLOR2");
192
                        OB.NamedLStyle = pg.attribute("NAMEDLST", "");
193
                        if (!MLineStyles.contains(OB.NamedLStyle))
194
                                OB.NamedLStyle = "";
195
                        OB.Shade = QStoInt(pg.attribute("SHADE"));
196
                        OB.Shade2 = QStoInt(pg.attribute("SHADE2"));
68 Franz 197
                        OB.TxtFill = pg.attribute("TXTFILL", "Black");
198
                        OB.TxtStroke = pg.attribute("TXTSTROKE", "None");
199
                        OB.ShTxtFill = QStoInt(pg.attribute("TXTFILLSH", "100"));
200
                        OB.ShTxtStroke = QStoInt(pg.attribute("TXTSTRSH", "100"));
2242 fschmid 201
                        OB.TxtScale = qRound(QStodouble(pg.attribute("TXTSCALE", "100")) * 10);
202
                        OB.TxtScaleV = qRound(QStodouble(pg.attribute("TXTSCALEV", "100")) * 10);
203
                        OB.TxTBase = qRound(QStodouble(pg.attribute("TXTBASE", "0")) * 10);
68 Franz 204
                        OB.TxTStyle = QStoInt(pg.attribute("TXTSTYLE", "0"));
30 Franz 205
                        OB.GrType = QStoInt(pg.attribute("GRTYP","0"));
295 Franz 206
                        OB.fill_gradient.clearStops();
207
                        if (OB.GrType != 0)
208
                        {
209
                                OB.GrStartX = QStodouble(pg.attribute("GRSTARTX","0.0"));
210
                                OB.GrStartY = QStodouble(pg.attribute("GRSTARTY","0.0"));
211
                                OB.GrEndX = QStodouble(pg.attribute("GRENDX","0.0"));
212
                                OB.GrEndY = QStodouble(pg.attribute("GRENDY","0.0"));
213
                                OB.GrColor = pg.attribute("GRCOLOR","");
2877 cbradney 214
                                if (!OB.GrColor.isEmpty())
295 Franz 215
                                {
216
                                        OB.GrColor2 = pg.attribute("GRCOLOR2","");
217
                                        OB.GrShade = QStoInt(pg.attribute("GRSHADE","100"));
218
                                        OB.GrShade2 = QStoInt(pg.attribute("GRSHADE2","100"));
219
                                }
220
                        }
80 Franz 221
                        OB.Rot = QStodouble(pg.attribute("ROT"));
30 Franz 222
                        OB.PLineArt = Qt::PenStyle(QStoInt(pg.attribute("PLINEART")));
223
                        OB.PLineEnd = Qt::PenCapStyle(QStoInt(pg.attribute("PLINEEND","0")));
224
                        OB.PLineJoin = Qt::PenJoinStyle(QStoInt(pg.attribute("PLINEJOIN","0")));
80 Franz 225
                        OB.LineSp = QStodouble(pg.attribute("LINESP"));
226
                        OB.ExtraV = QStodouble(pg.attribute("EXTRAV","0"));
227
                        OB.LocalScX = QStodouble(pg.attribute("LOCALSCX"));
228
                        OB.LocalScY = QStodouble(pg.attribute("LOCALSCY"));
229
                        OB.LocalX = QStodouble(pg.attribute("LOCALX"));
230
                        OB.LocalY = QStodouble(pg.attribute("LOCALY"));
30 Franz 231
                        OB.PicArt = QStoInt(pg.attribute("PICART"));
232
                        OB.flippedH = QStoInt(pg.attribute("FLIPPEDH"));
233
                        OB.flippedV = QStoInt(pg.attribute("FLIPPEDV"));
234
                        OB.ScaleType = QStoInt(pg.attribute("SCALETYPE","1"));
235
                        OB.AspectRatio = QStoInt(pg.attribute("RATIO","0"));
80 Franz 236
                        OB.BBoxX = QStodouble(pg.attribute("BBOXX"));
237
                        OB.BBoxH = QStodouble(pg.attribute("BBOXH"));
30 Franz 238
                        OB.isPrintable = QStoInt(pg.attribute("PRINTABLE"));
239
                        OB.isBookmark = false;
240
                        OB.BMnr = 0;
241
                        OB.isAnnotation = QStoInt(pg.attribute("ANNOTATION","0"));
242
                        if (QStoInt(pg.attribute("TRANSPARENT","0")) == 1)
243
                                OB.Pcolor = "None";
244
                        OB.Textflow = QStoInt(pg.attribute("TEXTFLOW"));
245
                        OB.Textflow2 = QStoInt(pg.attribute("TEXTFLOW2","0"));
80 Franz 246
                        OB.Extra = QStodouble(pg.attribute("EXTRA"));
247
                        OB.TExtra = QStodouble(pg.attribute("TEXTRA", "1"));
248
                        OB.BExtra = QStodouble(pg.attribute("BEXTRA", "1"));
249
                        OB.RExtra = QStodouble(pg.attribute("REXTRA", "1"));
30 Franz 250
                        OB.PoShow = QStoInt(pg.attribute("PTLSHOW","0"));
80 Franz 251
                        OB.BaseOffs = QStodouble(pg.attribute("BASEOF","0"));
1065 cbradney 252
                        OB.textAlignment = QStoInt(pg.attribute("ALIGN","0"));
30 Franz 253
                        OB.IFont = DoFonts[pg.attribute("IFONT")];
111 Franz 254
                        OB.ISize = qRound(QStodouble(pg.attribute("ISIZE","12")) * 10.0);
30 Franz 255
                        OB.Pfile = pg.attribute("PFILE");
256
                        OB.Pfile2 = pg.attribute("PFILE2","");
257
                        OB.Pfile3 = pg.attribute("PFILE3","");
258
                        OB.IProfile = pg.attribute("PRFILE","");
259
                        OB.EmProfile = pg.attribute("EPROF","");
260
                        OB.IRender = QStoInt(pg.attribute("IRENDER","1"));
261
                        OB.UseEmbedded = QStoInt(pg.attribute("EMBEDDED","1"));
262
                        OB.Locked = static_cast<bool>(QStoInt(pg.attribute("LOCK","0")));
263
                        OB.Reverse = static_cast<bool>(QStoInt(pg.attribute("REVERS","0")));
80 Franz 264
                        OB.Transparency = QStodouble(pg.attribute("TransValue","0.0"));
68 Franz 265
                        if (pg.hasAttribute("TransValueS"))
80 Franz 266
                                OB.TranspStroke = QStodouble(pg.attribute("TransValueS","0.0"));
68 Franz 267
                        else
268
                                OB.TranspStroke = OB.Transparency;
30 Franz 269
                        if (pg.hasAttribute("NUMCLIP"))
268 Franz 270
                        {
30 Franz 271
                                OB.Clip.resize(pg.attribute("NUMCLIP").toUInt());
272
                                tmpx = pg.attribute("CLIPCOOR");
273
                                QTextStream f(&tmpx, IO_ReadOnly);
274
                                for (uint c=0; c<pg.attribute("NUMCLIP").toUInt(); ++c)
268 Franz 275
                                {
30 Franz 276
                                        f >> x;
277
                                        f >> y;
278
                                        OB.Clip.setPoint(c, x, y);
279
                                }
268 Franz 280
                        }
30 Franz 281
                        else
282
                                OB.Clip.resize(0);
283
                        if (pg.hasAttribute("NUMPO"))
268 Franz 284
                        {
30 Franz 285
                                OB.PoLine.resize(pg.attribute("NUMPO").toUInt());
286
                                tmpx = pg.attribute("POCOOR");
287
                                QTextStream fp(&tmpx, IO_ReadOnly);
288
                                for (uint cx=0; cx<pg.attribute("NUMPO").toUInt(); ++cx)
268 Franz 289
                                {
30 Franz 290
                                        fp >> xf;
291
                                        fp >> yf;
292
                                        OB.PoLine.setPoint(cx, xf, yf);
293
                                }
268 Franz 294
                        }
30 Franz 295
                        else
296
                                OB.PoLine.resize(0);
297
                        OB.Groups.clear();
298
                        if (OB.Clip.size() == 0)
299
                                OB.Clip = FlattenPath(OB.PoLine, Segments);
300
                        tmpx = "";
301
                        QDomNode IT=DOC.firstChild();
302
                        while(!IT.isNull())
268 Franz 303
                        {
30 Franz 304
                                QDomElement it=IT.toElement();
295 Franz 305
                                if (it.tagName()=="CSTOP")
306
                                {
307
                                        QString name = it.attribute("NAME");
308
                                        double ramp = QStodouble(it.attribute("RAMP","0.0"));
309
                                        int shade = QStoInt(it.attribute("SHADE","100"));
310
                                        SetFarbe(&tmpfa, name, shade);
311
                                        OB.fill_gradient.addStop(tmpfa, ramp, 0.5, 1.0, name, shade);
312
                                }
30 Franz 313
                                if (it.tagName()=="ITEXT")
268 Franz 314
                                {
315
                                        tmp2 = it.attribute("CH");
316
                                        tmp2.replace(QRegExp("\r"), QChar(5));
317
                                        tmp2.replace(QRegExp("\n"), QChar(5));
318
                                        tmp3 = "\t" + DoFonts[it.attribute("CFONT")] + "\t";
319
                                        tmp3 += it.attribute("CSIZE") + "\t";
320
                                        tmp3 += it.attribute("CCOLOR") + "\t";
2382 fschmid 321
//                                      tmp3 += it.attribute("CEXTRA") + "\t";
322
                                        tmp3 += "0\t";
268 Franz 323
                                        tmp3 += it.attribute("CSHADE") + "\t";
324
                                        tmp3 += it.attribute("CSTYLE") + "\t";
325
                                        tmp3 += "0\t";
326
                                        tmp3 += it.attribute("CSTROKE","None") + "\t";
327
                                        tmp3 += it.attribute("CSHADE2","100") + "\t";
328
                                        tmp3 += it.attribute("CSCALE","100") + "\n";
329
                                        for (uint cxx=0; cxx<tmp2.length(); cxx++)
330
                                        {
331
                                                tmpx += tmp2.at(cxx)+tmp3;
332
                                        }
30 Franz 333
                                }
268 Franz 334
                                IT=IT.nextSibling();
335
                        }
1065 cbradney 336
                        OB.itemText = tmpx;
2877 cbradney 337
                        if (!OB.itemText.isEmpty())
268 Franz 338
                        {
1065 cbradney 339
                                QTextStream t(&OB.itemText, IO_ReadOnly);
30 Franz 340
                                QString cc;
341
                                while (!t.atEnd())
268 Franz 342
                                {
30 Franz 343
                                        cc = t.readLine();
2877 cbradney 344
                                        if (cc.isEmpty())
30 Franz 345
                                                continue;
346
                                        QStringList wt;
347
                                        QStringList::Iterator it;
348
                                        wt = QStringList::split("\t", cc);
349
                                        it = wt.begin();
1065 cbradney 350
                                        hg = new ScText;
30 Franz 351
                                        hg->ch = (*it);
352
                                        if (hg->ch == QChar(5))
353
                                                hg->ch = QChar(13);
354
                                        it++;
2834 cbradney 355
                                        hg->cfont = prefsManager->appPrefs.AvailFonts[*it];
30 Franz 356
                                        it++;
111 Franz 357
                                        hg->csize = qRound((*it).toDouble() * 10.0);
30 Franz 358
                                        it++;
359
                                        hg->ccolor = *it;
360
                                        it++;
361
                                        hg->cextra = (*it).toInt();
362
                                        it++;
363
                                        hg->cshade = (*it).toInt();
364
                                        hg->cselect = false;
365
                                        it++;
366
                                        if (it == NULL)
367
                                                hg->cstyle = 0;
368
                                        else
369
                                                hg->cstyle = (*it).toInt();
370
                                        it++;
371
                                        if (it == NULL)
372
                                                hg->cab = 0;
373
                                        else
374
                                                hg->cab = (*it).toInt();
68 Franz 375
                                        it++;
376
                                        if (it == NULL)
377
                                                hg->cstroke = "None";
378
                                        else
379
                                                hg->cstroke = *it;
380
                                        it++;
381
                                        if (it == NULL)
382
                                                hg->cshade2 = 100;
383
                                        else
384
                                                hg->cshade2 = (*it).toInt();
385
                                        it++;
386
                                        if (it == NULL)
387
                                                hg->cscale = 100;
388
                                        else
389
                                                hg->cscale = (*it).toInt();
30 Franz 390
                                        hg->xp = 0;
391
                                        hg->yp = 0;
392
                                        hg->PRot = 0;
393
                                        hg->PtransX = 0;
394
                                        hg->PtransY = 0;
395
                                        Ptexti.append(hg);
396
                                }
268 Franz 397
                        }
30 Franz 398
                        tmpx = GetAttr(&pg, "TEXTCOOR","0 0");
399
                        QTextStream ft(&tmpx, IO_ReadOnly);
400
                        for (uint ct=0; ct<GetAttr(&pg, "NUMTEXT","0").toUInt(); ct++)
268 Franz 401
                        {
30 Franz 402
                                ft >> Ptexti.at(ct)->xp;
403
                                ft >> Ptexti.at(ct)->yp;
268 Franz 404
                        }
30 Franz 405
                        tmpx = "";
406
                        if ((OB.PType == 5) && (OB.Height != 0))
268 Franz 407
                        {
1795 cbradney 408
                                OB.Rot += atan2(OB.Height,OB.Width)*(180.0/M_PI);
30 Franz 409
                                OB.Width = sqrt(pow(OB.Width,2)+pow(OB.Height,2));
410
                                OB.Height = 0;
411
                                OB.Clip.setPoints(4, -1,-1, static_cast<int>(OB.Width+1),-1, static_cast<int>(OB.Width+1), static_cast<int>(OB.Height+1), -1, static_cast<int>(OB.Height+1));
268 Franz 412
                        }
30 Franz 413
                        OB.LayerNr = -1;
741 fschmid 414
                        OB.startArrowIndex =  arrowID[QStoInt(pg.attribute("startArrowIndex","0"))];
415
                        OB.endArrowIndex =  arrowID[QStoInt(pg.attribute("endArrowIndex","0"))];
68 Franz 416
                        pS->save();
417
                        pS->translate(OB.Xpos, OB.Ypos);
418
                        pS->rotate(static_cast<double>(OB.Rot));
30 Franz 419
                        if (OB.Pcolor != "None")
268 Franz 420
                        {
30 Franz 421
                                SetFarbe(&tmpfa, OB.Pcolor, OB.Shade);
68 Franz 422
                                pS->setBrush(tmpfa);
423
                                pS->setFillMode(1);
268 Franz 424
                        }
30 Franz 425
                        else
68 Franz 426
                                pS->setFillMode(0);
427
                        if (OB.GrType != 0)
268 Franz 428
                        {
68 Franz 429
                                pS->setFillMode(2);
430
                                pS->fill_gradient.clearStops();
2877 cbradney 431
                                if ((!OB.GrColor.isEmpty()) && (!OB.GrColor2.isEmpty()))
268 Franz 432
                                {
295 Franz 433
                                        if (OB.GrType == 5)
434
                                        {
2877 cbradney 435
                                                if ((OB.GrColor != "None") && (!OB.GrColor.isEmpty()))
295 Franz 436
                                                        SetFarbe(&tmpfa, OB.GrColor, OB.GrShade);
437
                                                pS->fill_gradient.addStop(tmpfa, 0.0, 0.5, 1.0);
2877 cbradney 438
                                                if ((OB.GrColor2 != "None") && (!OB.GrColor2.isEmpty()))
295 Franz 439
                                                        SetFarbe(&tmpfa, OB.GrColor2, OB.GrShade2);
440
                                                pS->fill_gradient.addStop(tmpfa, 1.0, 0.5, 1.0);
441
                                        }
442
                                        else
443
                                        {
2877 cbradney 444
                                                if ((OB.GrColor2 != "None") && (!OB.GrColor2.isEmpty()))
295 Franz 445
                                                        SetFarbe(&tmpfa, OB.GrColor2, OB.GrShade2);
446
                                                pS->fill_gradient.addStop(tmpfa, 0.0, 0.5, 1.0);
2877 cbradney 447
                                                if ((OB.GrColor != "None") && (!OB.GrColor.isEmpty()))
295 Franz 448
                                                        SetFarbe(&tmpfa, OB.GrColor, OB.GrShade);
449
                                                pS->fill_gradient.addStop(tmpfa, 1.0, 0.5, 1.0);
450
                                        }
268 Franz 451
                                }
68 Franz 452
                                else
295 Franz 453
                                        pS->fill_gradient = OB.fill_gradient;
68 Franz 454
                                QWMatrix grm;
455
                                grm.rotate(OB.Rot);
456
                                FPointArray gra;
457
                                switch (OB.GrType)
268 Franz 458
                                {
459
                                case 1:
460
                                        gra.setPoints(2, 0, 0, OB.Width, 0);
461
                                        gra.map(grm);
462
                                        pS->setGradient(VGradient::linear, gra.point(0), gra.point(1));
463
                                        break;
464
                                case 2:
465
                                        gra.setPoints(2, 0, 0, OB.Height, 0);
466
                                        grm.rotate(90);
467
                                        gra.map(grm);
468
                                        pS->setGradient(VGradient::linear, gra.point(0), gra.point(1));
469
                                        break;
470
                                case 3:
471
                                        gra.setPoints(2, 0, 0, OB.Width, OB.Height);
472
                                        gra.map(grm);
473
                                        pS->setGradient(VGradient::linear, gra.point(0), gra.point(1));
474
                                        break;
475
                                case 4:
476
                                        gra.setPoints(2, 0, OB.Height, OB.Width, 0);
477
                                        gra.map(grm);
478
                                        pS->setGradient(VGradient::linear, gra.point(0), gra.point(1));
479
                                        break;
480
                                case 5:
481
                                        if (OB.Width > OB.Height)
482
                                                gv = FPoint(OB.Width, OB.Height / 2.0);
483
                                        else
484
                                                gv = FPoint(OB.Width / 2.0, OB.Height);
485
                                        pS->setGradient(VGradient::radial, FPoint(OB.Width / 2.0,OB.Height / 2.0), gv, FPoint(OB.Width / 2.0,OB.Height / 2.0));
486
                                        break;
295 Franz 487
                                case 6:
488
                                        gra.setPoints(2, OB.GrStartX, OB.GrStartY, OB.GrEndX, OB.GrEndY);
489
                                        gra.map(grm);
490
                                        pS->setGradient(VGradient::linear, gra.point(0), gra.point(1));
491
                                        break;
68 Franz 492
                                }
268 Franz 493
                        }
30 Franz 494
                        if (OB.Pcolor2 != "None")
268 Franz 495
                        {
30 Franz 496
                                SetFarbe(&tmpfa, OB.Pcolor2, OB.Shade2);
68 Franz 497
                                if ((OB.Pwidth == 0) && (OB.PType != 5))
498
                                        pS->setLineWidth(0);
499
                                else
500
                                        pS->setPen(tmpfa, OB.Pwidth, Qt::PenStyle(OB.PLineArt), Qt::PenCapStyle(OB.PLineEnd), Qt::PenJoinStyle(OB.PLineJoin));
268 Franz 501
                        }
30 Franz 502
                        else
68 Franz 503
                                pS->setLineWidth(0);
504
                        pS->setBrushOpacity(1.0 - OB.Transparency);
505
                        pS->setPenOpacity(1.0 - OB.TranspStroke);
506
                        bool doStroke;
507
                        int mode;
508
                        doStroke = true;
30 Franz 509
                        switch (OB.PType)
268 Franz 510
                        {
1460 cbradney 511
                        case PageItem::ImageFrame:
268 Franz 512
                                if ((OB.Pcolor != "None") || (OB.GrType != 0))
30 Franz 513
                                {
268 Franz 514
                                        pS->setupPolygon(&OB.PoLine);
515
                                        pS->drawPolygon();
516
                                }
2877 cbradney 517
                                if (!OB.Pfile.isEmpty())
268 Franz 518
                                {
519
                                        QFileInfo fi = QFileInfo(OB.Pfile);
520
                                        if (fi.exists())
267 Franz 521
                                        {
522
                                                pS->setupPolygon(&OB.PoLine);
268 Franz 523
                                                pS->setClipPath();
68 Franz 524
                                                pS->save();
30 Franz 525
                                                if (OB.flippedH % 2 != 0)
268 Franz 526
                                                {
68 Franz 527
                                                        pS->translate(OB.Width, 0);
528
                                                        pS->scale(-1, 1);
268 Franz 529
                                                }
30 Franz 530
                                                if (OB.flippedV % 2 != 0)
268 Franz 531
                                                {
68 Franz 532
                                                        pS->translate(0, OB.Height);
533
                                                        pS->scale(1, -1);
268 Franz 534
                                                }
2004 fschmid 535
                                                ScImage pixm;
536
                                                pixm.LoadPicture(OB.Pfile, "", 0, false, false, 1, 72);
268 Franz 537
                                                pS->scale(OB.LocalScX, OB.LocalScY);
538
                                                pS->translate(static_cast<int>(OB.LocalX), static_cast<int>(OB.LocalY));
270 Franz 539
                                                pS->drawImage(&pixm);
268 Franz 540
                                                pS->restore();
541
                                        }
542
                                }
543
                                break;
1460 cbradney 544
                        case PageItem::TextFrame:
268 Franz 545
                                if (Ptexti.count() != 0)
546
                                {
547
                                        pS->save();
548
                                        if (OB.Pcolor != "None")
549
                                        {
550
                                                pS->setupPolygon(&OB.PoLine);
551
                                                pS->drawPolygon();
552
                                        }
553
                                        if (OB.flippedH % 2 != 0)
554
                                        {
555
                                                pS->translate(OB.Width, 0);
556
                                                pS->scale(-1, 1);
557
                                        }
558
                                        if (OB.flippedV % 2 != 0)
559
                                        {
560
                                                pS->translate(0, OB.Height);
561
                                                pS->scale(1, -1);
562
                                        }
563
                                        for (uint a = 0; a < Ptexti.count(); a++)
564
                                        {
565
                                                hl = Ptexti.at(a);
566
                                                if (hl->ch == QChar(13))
567
                                                        continue;
568
                                                chx = hl->ch;
569
                                                chs = hl->csize;
570
                                                if (hl->cstyle != 0)
571
                                                {
572
                                                        if (hl->cstyle & 1)
2889 cbradney 573
                                                                chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.scalingSuperScript / 100);
268 Franz 574
                                                        if (hl->cstyle & 2)
2889 cbradney 575
                                                                chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.scalingSubScript / 100);
268 Franz 576
                                                        if (hl->cstyle & 64)
30 Franz 577
                                                        {
268 Franz 578
                                                                if (chx.upper() != chx)
30 Franz 579
                                                                {
2889 cbradney 580
                                                                        chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.valueSmallCaps / 100);
268 Franz 581
                                                                        chx = chx.upper();
30 Franz 582
                                                                }
583
                                                        }
584
                                                }
268 Franz 585
                                                mode = 0;
586
                                                if (hl->ccolor != "None")
30 Franz 587
                                                {
268 Franz 588
                                                        SetFarbe(&tmpfa, hl->ccolor, hl->cshade);
589
                                                        pS->setBrush(tmpfa);
590
                                                        mode = 2;
30 Franz 591
                                                }
268 Franz 592
                                                if (hl->cstroke != "None")
30 Franz 593
                                                {
268 Franz 594
                                                        SetFarbe(&tmpfa, hl->cstroke, hl->cshade2);
595
                                                        pS->setPen(tmpfa, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
596
                                                        mode += 1;
30 Franz 597
                                                }
1789 fschmid 598
                                                DrawZeichenS(pS, hl->xp, hl->yp, chx, hl->cfont->SCName, OB.Reverse, hl->cstyle, mode, chs);
268 Franz 599
                                        }
600
                                        pS->restore();
601
                                }
602
                                break;
1460 cbradney 603
                        case PageItem::Line:
2877 cbradney 604
                                if (OB.NamedLStyle.isEmpty())
268 Franz 605
                                        pS->drawLine(FPoint(0, 0), FPoint(OB.Width, 0));
606
                                else
607
                                {
608
                                        multiLine ml = MLineStyles[OB.NamedLStyle];
609
                                        for (int it = ml.size()-1; it > -1; it--)
610
                                        {
611
                                                SetFarbe(&tmpfa, ml[it].Color, ml[it].Shade);
612
                                                pS->setPen(tmpfa,
613
                                                           QMAX(static_cast<int>(ml[it].Width), 1),
614
                                                           static_cast<Qt::PenStyle>(ml[it].Dash),
615
                                                           static_cast<Qt::PenCapStyle>(ml[it].LineEnd),
616
                                                           static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
617
                                                pS->drawLine(FPoint(0, 0), FPoint(OB.Width, 0));
618
                                        }
619
                                }
741 fschmid 620
                                if (OB.startArrowIndex != 0)
621
                                {
622
                                        QWMatrix arrowTrans;
760 fschmid 623
                                        FPointArray arrow = (*arrowStyles.at(OB.startArrowIndex-1)).points.copy();
741 fschmid 624
                                        arrowTrans.translate(0, 0);
625
                                        arrowTrans.scale(OB.Pwidth, OB.Pwidth);
626
                                        arrowTrans.scale(-1,1);
627
                                        arrow.map(arrowTrans);
628
                                        pS->setBrush(pS->pen());
629
                                        pS->setLineWidth(0);
630
                                        pS->setFillMode(ScPainter::Solid);
631
                                        pS->setupPolygon(&arrow);
632
                                        pS->drawPolygon();
633
                                }
634
                                if (OB.endArrowIndex != 0)
635
                                {
636
                                        QWMatrix arrowTrans;
760 fschmid 637
                                        FPointArray arrow = (*arrowStyles.at(OB.endArrowIndex-1)).points.copy();
741 fschmid 638
                                        arrowTrans.translate(OB.Width, 0);
639
                                        arrowTrans.scale(OB.Pwidth, OB.Pwidth);
640
                                        arrow.map(arrowTrans);
641
                                        pS->setBrush(pS->pen());
642
                                        pS->setLineWidth(0);
643
                                        pS->setFillMode(ScPainter::Solid);
644
                                        pS->setupPolygon(&arrow);
645
                                        pS->drawPolygon();
646
                                }
268 Franz 647
                                doStroke = false;
648
                                break;
1460 cbradney 649
                        /* OBSOLETE Craig R 2005-02-06
268 Franz 650
                        case 1:
651
                        case 3:
1460 cbradney 652
                        */
3232 cbradney 653
                        case PageItem::ItemType1:
654
                        case PageItem::ItemType3:
1460 cbradney 655
                        case PageItem::Polygon:
268 Franz 656
                                pS->setupPolygon(&OB.PoLine);
657
                                pS->drawPolygon();
658
                                break;
1460 cbradney 659
                        case PageItem::PolyLine:
268 Franz 660
                                pS->setupPolygon(&OB.PoLine);
2877 cbradney 661
                                if (OB.NamedLStyle.isEmpty())
268 Franz 662
                                        pS->drawPolyLine();
663
                                else
664
                                {
665
                                        multiLine ml = MLineStyles[OB.NamedLStyle];
666
                                        for (int it = ml.size()-1; it > -1; it--)
667
                                        {
668
                                                SetFarbe(&tmpfa, ml[it].Color, ml[it].Shade);
669
                                                pS->setPen(tmpfa, ml[it].Width,
670
                                                           static_cast<Qt::PenStyle>(ml[it].Dash),
671
                                                           static_cast<Qt::PenCapStyle>(ml[it].LineEnd),
672
                                                           static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
673
                                                pS->drawPolyLine();
674
                                        }
675
                                }
741 fschmid 676
                                if (OB.startArrowIndex != 0)
677
                                {
678
                                        FPoint Start = OB.PoLine.point(0);
679
                                        for (uint xx = 1; xx < OB.PoLine.size(); xx += 2)
680
                                        {
681
                                                FPoint Vector = OB.PoLine.point(xx);
682
                                                if ((Start.x() != Vector.x()) || (Start.y() != Vector.y()))
683
                                                {
1795 cbradney 684
                                                        double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI);
741 fschmid 685
                                                        QWMatrix arrowTrans;
760 fschmid 686
                                                        FPointArray arrow = (*arrowStyles.at(OB.startArrowIndex-1)).points.copy();
741 fschmid 687
                                                        arrowTrans.translate(Start.x(), Start.y());
688
                                                        arrowTrans.rotate(r);
689
                                                        arrowTrans.scale(OB.Pwidth, OB.Pwidth);
690
                                                        arrow.map(arrowTrans);
691
                                                        pS->setBrush(pS->pen());
692
                                                        pS->setLineWidth(0);
693
                                                        pS->setFillMode(ScPainter::Solid);
694
                                                        pS->setupPolygon(&arrow);
695
                                                        pS->drawPolygon();
696
                                                        break;
697
                                                }
698
                                        }
699
                                }
700
                                if (OB.endArrowIndex != 0)
701
                                {
702
                                        FPoint End = OB.PoLine.point(OB.PoLine.size()-2);
703
                                        for (uint xx = OB.PoLine.size()-1; xx > 0; xx -= 2)
704
                                        {
705
                                                FPoint Vector = OB.PoLine.point(xx);
706
                                                if ((End.x() != Vector.x()) || (End.y() != Vector.y()))
707
                                                {
1795 cbradney 708
                                                        double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI);
741 fschmid 709
                                                        QWMatrix arrowTrans;
760 fschmid 710
                                                        FPointArray arrow = (*arrowStyles.at(OB.endArrowIndex-1)).points.copy();
741 fschmid 711
                                                        arrowTrans.translate(End.x(), End.y());
712
                                                        arrowTrans.rotate(r);
713
                                                        arrowTrans.scale(OB.Pwidth, OB.Pwidth);
714
                                                        arrow.map(arrowTrans);
715
                                                        pS->setBrush(pS->pen());
716
                                                        pS->setLineWidth(0);
717
                                                        pS->setFillMode(ScPainter::Solid);
718
                                                        pS->setupPolygon(&arrow);
719
                                                        pS->drawPolygon();
720
                                                        break;
721
                                                }
722
                                        }
723
                                }
268 Franz 724
                                doStroke = false;
725
                                break;
1460 cbradney 726
                        case PageItem::PathText:
268 Franz 727
                                if (!OB.PoShow)
68 Franz 728
                                        doStroke = false;
268 Franz 729
                                cl = FlattenPath(OB.PoLine, Segments);
730
                                CurX = OB.Extra;
731
                                if (Ptexti.count() != 0)
2382 fschmid 732
                                        CurX += Ptexti.at(0)->csize * Ptexti.at(0)->cextra / 10000.0;
268 Franz 733
                                zae = 0;
504 cbradney 734
                                wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2.0)+pow(cl.point(zae+1).y()-cl.point(zae).y(),2.0));
268 Franz 735
                                while (wid < 1)
736
                                {
737
                                        zae++;
738
                                        if (zae == cl.size()-1)
739
                                                goto PfadEnd;
504 cbradney 740
                                        wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2.0)+pow(cl.point(zae+1).y()-cl.point(zae).y(),2.0));
268 Franz 741
                                }
742
                                rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),cl.point(zae+1).y()-cl.point(zae).y());
743
                                for (a = 0; a < Ptexti.count(); a++)
744
                                {
745
                                        CurY = 0;
746
                                        hl = Ptexti.at(a);
747
                                        chx = hl->ch;
748
                                        if ((chx == QChar(30)) || (chx == QChar(13)))
749
                                                continue;
750
                                        if (hl->ccolor != "None")
751
                                        {
752
                                                SetFarbe(&tmpfa, hl->ccolor, hl->cshade);
753
                                                pS->setPen(tmpfa);
754
                                        }
755
                                        chs = hl->csize;
2834 cbradney 756
                                        asce = prefsManager->appPrefs.AvailFonts[hl->cfont->SCName]->numAscent * (hl->csize / 10.0);
268 Franz 757
                                        int chst = hl->cstyle & 127;
758
                                        if (chst != 0)
759
                                        {
760
                                                if (chst & 1)
30 Franz 761
                                                {
2889 cbradney 762
                                                        CurY -= asce * prefsManager->appPrefs.typographicSettings.valueSuperScript / 100;
763
                                                        chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.scalingSuperScript / 100);
30 Franz 764
                                                }
268 Franz 765
                                                if (chst & 2)
30 Franz 766
                                                {
2889 cbradney 767
                                                        CurY += asce * prefsManager->appPrefs.typographicSettings.valueSubScript / 100;
768
                                                        chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.scalingSubScript / 100);
268 Franz 769
                                                }
770
                                                if (chst & 64)
771
                                                {
772
                                                        if (chx.upper() != chx)
30 Franz 773
                                                        {
2889 cbradney 774
                                                                chs = static_cast<int>(hl->csize * prefsManager->appPrefs.typographicSettings.valueSmallCaps / 100);
268 Franz 775
                                                                chx = chx.upper();
30 Franz 776
                                                        }
268 Franz 777
                                                }
778
                                        }
2834 cbradney 779
                                        wide = prefsManager->appPrefs.AvailFonts[hl->cfont->SCName]->CharWidth[chx[0].unicode()]*(chs / 10.0);
2382 fschmid 780
                                        if ((CurX+(wide+chs * hl->cextra / 10000.0)/2) >= wid)
268 Franz 781
                                        {
782
                                                if (zae < cl.size()-1)
783
                                                {
784
                                                        CurX = CurX - wid;
785
                                                        wid = 0;
786
                                                        EndX = CurX;
787
                                                        do
30 Franz 788
                                                        {
268 Franz 789
                                                                do
30 Franz 790
                                                                {
268 Franz 791
                                                                        zae++;
792
                                                                        if (zae == cl.size()-1)
793
                                                                                goto PfadEnd;
504 cbradney 794
                                                                        wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2.0)+pow(cl.point(zae+1).y()-cl.point(zae).y(),2.0));
268 Franz 795
                                                                        rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),cl.point(zae+1).y()-cl.point(zae).y());
30 Franz 796
                                                                }
268 Franz 797
                                                                while (wid == 0);
798
                                                                EndX -= wid;
30 Franz 799
                                                        }
268 Franz 800
                                                        while (wid < EndX);
801
                                                        CurX = EndX + wid;
30 Franz 802
                                                }
268 Franz 803
                                                else
804
                                                        goto PfadEnd;
805
                                        }
806
                                        pS->save();
807
                                        pS->translate(cl.point(zae).x(), cl.point(zae).y());
808
                                        pS->rotate(rota);
2382 fschmid 809
                                        DrawZeichenS(pS, CurX+chs * hl->cextra / 10000.0, CurY+OB.BaseOffs, chx, hl->cfont->SCName, OB.Reverse, hl->cstyle, 2, chs);
268 Franz 810
                                        pS->restore();
2382 fschmid 811
                                        CurX += wide+chs * hl->cextra / 10000.0;
30 Franz 812
                                }
268 Franz 813
                        PfadEnd:        break;
814
                        }
68 Franz 815
                        if (doStroke)
268 Franz 816
                        {
817
                                if (OB.Pcolor2 != "None")
68 Franz 818
                                {
819
                                        SetFarbe(&tmpfa, OB.Pcolor2, OB.Shade2);
820
                                        pS->setPen(tmpfa, OB.Pwidth, Qt::PenStyle(OB.PLineArt), Qt::PenCapStyle(OB.PLineEnd), Qt::PenJoinStyle(OB.PLineJoin));
268 Franz 821
                                        //                                      if (DashValues.count() != 0)
822
                                        //                                              pS->setDash(DashValues, DashOffset);
823
                                }
68 Franz 824
                                else
825
                                        pS->setLineWidth(0);
826
                                pS->setupPolygon(&OB.PoLine);
2877 cbradney 827
                                if (OB.NamedLStyle.isEmpty())
68 Franz 828
                                        pS->drawPolyLine();
829
                                else
268 Franz 830
                                {
68 Franz 831
                                        multiLine ml = MLineStyles[OB.NamedLStyle];
832
                                        for (int it = ml.size()-1; it > -1; it--)
268 Franz 833
                                        {
68 Franz 834
                                                SetFarbe(&tmpfa, ml[it].Color, ml[it].Shade);
835
                                                pS->setPen(tmpfa, ml[it].Width,
268 Franz 836
                                                           static_cast<Qt::PenStyle>(ml[it].Dash),
837
                                                           static_cast<Qt::PenCapStyle>(ml[it].LineEnd),
838
                                                           static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
68 Franz 839
                                                pS->drawPolyLine();
840
                                        }
841
                                }
268 Franz 842
                        }
68 Franz 843
                        pS->restore();
31 Franz 844
                        QDir::setCurrent(CurDirP);
268 Franz 845
                }
30 Franz 846
                DOC=DOC.nextSibling();
268 Franz 847
        }
68 Franz 848
        pS->end();
30 Franz 849
        QImage tmpi1 = tmp.convertToImage();
850
        QImage tmpi = tmpi1.smoothScale(static_cast<int>(tmp.width()*pmmax), static_cast<int>(tmp.height()*pmmax));
851
        tmp.convertFromImage(tmpi);
68 Franz 852
        delete pS;
853
        FT_Done_FreeType( library );
30 Franz 854
        return tmp;
855
}
856
 
857
void ScPreview::SetFarbe(QColor *tmp, QString farbe, int shad)
858
{
1488 fschmid 859
        *tmp = Farben[farbe].getShadeColorProof(shad);
30 Franz 860
}
861
 
80 Franz 862
void ScPreview::DrawZeichenS(ScPainter *p, double xco, double yco, QString ch, QString ZFo, bool Reverse, int Style, int mod, int Siz)
68 Franz 863
{
864
        if (mod == 0)
865
                return;
866
        QString ccx = ch;
867
        if (ccx == QChar(29))
868
                ccx = " ";
80 Franz 869
        double wide;
111 Franz 870
        double csi = static_cast<double>(Siz) / 100.0;
68 Franz 871
        uint chr = ccx[0].unicode();
2834 cbradney 872
        if (prefsManager->appPrefs.AvailFonts[ZFo]->CharWidth.contains(chr))
268 Franz 873
        {
2834 cbradney 874
                wide = prefsManager->appPrefs.AvailFonts[ZFo]->CharWidth[chr]*(Siz / 10.0);
68 Franz 875
                QWMatrix chma;
876
                chma.scale(csi, csi);
2834 cbradney 877
                FPointArray gly = prefsManager->appPrefs.AvailFonts[ZFo]->GlyphArray[chr].Outlines.copy();
68 Franz 878
                if (gly.size() < 4)
879
                        return;
880
                gly.map(chma);
881
                chma = QWMatrix();
882
                p->setFillMode(1);
883
                if (Reverse)
268 Franz 884
                {
68 Franz 885
                        chma.scale(-1, 1);
886
                        chma.translate(-wide, 0);
887
                        gly.map(chma);
888
                        chma = QWMatrix();
111 Franz 889
                        chma.translate(xco, yco-(Siz / 10.0));
268 Franz 890
                }
68 Franz 891
                else
111 Franz 892
                        chma.translate(xco, yco-(Siz / 10.0));
68 Franz 893
                gly.map(chma);
894
                p->setupPolygon(&gly);
895
                p->setFillMode(1);
896
                if (mod > 1)
897
                        p->fillPath();
898
                if ((Style & 4) && ((mod % 2) != 0))
268 Franz 899
                {
2834 cbradney 900
                        p->setLineWidth(prefsManager->appPrefs.AvailFonts[ZFo]->strokeWidth * Siz / 20);
68 Franz 901
                        p->strokePath();
268 Franz 902
                }
68 Franz 903
                if (Style & 16)
268 Franz 904
                {
2834 cbradney 905
                        double st = prefsManager->appPrefs.AvailFonts[ZFo]->strikeout_pos * (Siz / 10.0);
906
                        p->setLineWidth(QMAX(prefsManager->appPrefs.AvailFonts[ZFo]->strokeWidth * (Siz / 10.0), 1));
68 Franz 907
                        p->drawLine(FPoint(xco, yco-st), FPoint(xco+wide, yco-st));
268 Franz 908
                }
68 Franz 909
                if (Style & 8)
268 Franz 910
                {
2834 cbradney 911
                        double st = prefsManager->appPrefs.AvailFonts[ZFo]->underline_pos * (Siz / 10.0);
912
                        p->setLineWidth(QMAX(prefsManager->appPrefs.AvailFonts[ZFo]->strokeWidth * (Siz / 10.0), 1));
265 Franz 913
                        p->drawLine(FPoint(xco, yco-st), FPoint(xco+wide, yco-st));
68 Franz 914
                }
268 Franz 915
        }
68 Franz 916
        else
268 Franz 917
        {
68 Franz 918
                p->setLineWidth(1);
919
                p->setPen(Qt::black);
920
                p->setFillMode(0);
111 Franz 921
                p->drawRect(xco, yco-Siz, (Siz / 10.0), (Siz / 10.0));
268 Franz 922
        }
68 Franz 923
}