Subversion Repositories Scribus

Rev

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