Subversion Repositories Scribus

Rev

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

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