diff options
Diffstat (limited to 'scribus/scpreview.cpp')
| -rw-r--r-- | scribus/scpreview.cpp | 1116 |
1 files changed, 1116 insertions, 0 deletions
diff --git a/scribus/scpreview.cpp b/scribus/scpreview.cpp new file mode 100644 index 0000000..d6f7ff9 --- /dev/null +++ b/scribus/scpreview.cpp @@ -0,0 +1,1116 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +#include "scpreview.h" +#include <QDomDocument> +#include <QMap> +#include <QPainter> +#include <QRect> +#include <QImage> +#include <QRegion> +#include <QRegExp> +#include <QFileInfo> +#include <QBitmap> +#include <QDir> +#include <QList> +#include <QPolygon> +#include <QPixmap> +#include <QTemporaryFile> +#include <cstdlib> + +#include "cmsettings.h" +#include "missing.h" +#include "sccolor.h" +#include "scclocale.h" +#include "scribus.h" +#include "scribuscore.h" +#include "sctextstream.h" +#include "splash.h" +#include "util.h" +#include "util_math.h" +#include "prefsmanager.h" +#include "scpainter.h" +#include "commonstrings.h" +#include "sccolorengine.h" + + +using namespace std; + + +ScPreview::ScPreview() +{ + prefsManager = PrefsManager::instance(); + Farben.clear(); + MLineStyles.clear(); + Segments.clear(); +} + +QPixmap ScPreview::createPreview(QString data) +{ + int a; + struct CopyPasteBuffer OB; + ScText *hg, *hl; + QList<ScText*> Ptexti; + ScColor lf = ScColor(); + QFont fo; + QMap<QString,QString> DoFonts; + QMap<int,int> arrowID; + QString tmpf, tmpx, tmp2, tmp3; + int x, y, zae; + double xf, yf, asce, chs; + FPoint gv; + int currItem, fillBlendmode, strokeBlendmode; + QPolygon cl; + QColor tmpfa; + QString chstr; + double CurY, EndX, CurX, wide, rota, wid; + QList<ArrowDesc> arrowStyles; + QStack<int> groupStack; + arrowStyles = prefsManager->appPrefs.arrowStyles; + QDomDocument docu("scridoc"); + docu.setContent(data); + QDomElement elem=docu.documentElement(); + if ((elem.tagName() != "SCRIBUSELEM") && (elem.tagName() != "SCRIBUSELEMUTF8")) + { + QPixmap tmp = QPixmap(0, 0); + return tmp; + } + if (elem.hasAttribute("previewData")) + { + QString dat = elem.attribute("previewData", ""); + QByteArray inlineImageData; + inlineImageData.append(dat); + inlineImageData = QByteArray::fromBase64(inlineImageData); + QImage tmp; + tmp.loadFromData(inlineImageData); + return QPixmap::fromImage(tmp); + } + double GrX = ScCLocale::toDoubleC(elem.attribute("XP")); + double GrY = ScCLocale::toDoubleC(elem.attribute("YP")); + double GrW = ScCLocale::toDoubleC(elem.attribute("W")); + double GrH = ScCLocale::toDoubleC(elem.attribute("H")); + double pmmax = 60 / qMax(GrW+50, GrH+50); + QImage tmp = QImage(static_cast<int>(GrW)+50, static_cast<int>(GrH)+50, QImage::Format_ARGB32); + tmp.fill( qRgba(255, 255, 255, 0) ); + ScPainter *pS = new ScPainter(&tmp, tmp.width(), tmp.height(), 1.0, 0); + pS->beginLayer(1.0, 0); + pS->translate(25,25); + QDomNode DOC=elem.firstChild(); + DoFonts.clear(); + while(!DOC.isNull()) + { + QDomElement pg=DOC.toElement(); + if(pg.tagName()=="Arrows") + { + struct ArrowDesc arrow; + double xa, ya; + arrow.name = pg.attribute("Name"); + QString tmp = pg.attribute("Points"); + ScTextStream fp(&tmp, QIODevice::ReadOnly); + for (uint cx = 0; cx < pg.attribute("NumPoints").toUInt(); ++cx) + { + fp >> xa; + fp >> ya; + arrow.points.addPoint(xa, ya); + } + arrowStyles.append(arrow); + arrowID.insert(pg.attribute("Index").toInt(), arrowStyles.count()); + } + if(pg.tagName()=="FONT") + { + tmpf = GetAttr(&pg, "NAME"); + if ((!prefsManager->appPrefs.AvailFonts.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[tmpf].usable())) + { + if ((!prefsManager->appPrefs.GFontSub.contains(tmpf)) || (!prefsManager->appPrefs.AvailFonts[prefsManager->appPrefs.GFontSub[tmpf]].usable())) + { + ScCore->showSplash(false); + MissingFont *dia = new MissingFont(0, tmpf, 0); + dia->exec(); + tmpf = dia->getReplacementFont(); + delete dia; + ScCore->showSplash(true); + prefsManager->appPrefs.GFontSub[pg.attribute("NAME")] = tmpf; + } + else + tmpf = prefsManager->appPrefs.GFontSub[tmpf]; + } + if (!DoFonts.contains(tmpf)) + { +// FT_Face face; +// error = FT_New_Face( library, prefsManager->appPrefs.AvailFonts[tmpf].fontFilePath(), prefsManager->appPrefs.AvailFonts[tmpf].faceIndex(), &face ); + if ( prefsManager->appPrefs.AvailFonts[tmpf].usable() ) + tmpf = prefsManager->appPrefs.toolSettings.defFont; +/* if (prefsManager->appPrefs.AvailFonts[tmpf]->ReadMetrics()) { +//already done in ScFonts::addScalaableFont(): +// prefsManager->appPrefs.AvailFonts[tmpf]->CharWidth[13] = 0; + } + else + { + tmpf = prefsManager->appPrefs.toolSettings.defFont; +// prefsManager->appPrefs.AvailFonts[tmpf]->ReadMetrics(); +//already done in ScFonts::addScalaableFont(): +// prefsManager->appPrefs.AvailFonts[tmpf]->CharWidth[13] = 0; + } +*/ + } +// fo = prefsManager->appPrefs.AvailFonts[tmpf]->Font; +// fo.setPointSize(12); + DoFonts[GetAttr(&pg, "NAME")] = tmpf; +// DoFonts2[GetAttr(&pg, "NAME")] = fo; + } + if(pg.tagName()=="COLOR") + { + if (pg.hasAttribute("CMYK")) + lf.setNamedColor(GetAttr(&pg, "CMYK")); + else + lf.fromQColor(QColor(GetAttr(&pg, "RGB"))); + Farben[GetAttr(&pg, "NAME")] = lf; + } + if(pg.tagName()=="MultiLine") + { + multiLine ml; + QDomNode MuLn = DOC.firstChild(); + while(!MuLn.isNull()) + { + QDomElement MuL = MuLn.toElement(); + struct SingleLine sl; + sl.Color = MuL.attribute("Color"); + sl.Dash = MuL.attribute("Dash").toInt(); + sl.LineEnd = MuL.attribute("LineEnd").toInt(); + sl.LineJoin = MuL.attribute("LineJoin").toInt(); + sl.Shade = MuL.attribute("Shade").toInt(); + sl.Width = ScCLocale::toDoubleC(MuL.attribute("Width")); + ml.push_back(sl); + MuLn = MuLn.nextSibling(); + } + if (!MLineStyles.contains(pg.attribute("Name"))) + MLineStyles.insert(pg.attribute("Name"), ml); + } + DOC=DOC.nextSibling(); + } + DOC=elem.firstChild(); + currItem = -1; + while(!DOC.isNull()) + { + QDomElement pg=DOC.toElement(); + if(pg.tagName()=="ITEM") + { + currItem++; + QString CurDirP = QDir::currentPath(); + QDir::setCurrent(QDir::homePath()); + Segments.clear(); + // TODO: Nicer conversion + OB.PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt()); + OB.Xpos = ScCLocale::toDoubleC(pg.attribute("XPOS")) - GrX; + OB.Ypos = ScCLocale::toDoubleC(pg.attribute("YPOS")) - GrY; + OB.Width = ScCLocale::toDoubleC(pg.attribute("WIDTH")); + OB.Height = ScCLocale::toDoubleC(pg.attribute("HEIGHT")); + OB.RadRect = ScCLocale::toDoubleC(pg.attribute("RADRECT"), 0.0); + OB.ClipEdited = pg.attribute("CLIPEDIT", "0").toInt(); + OB.FrameType = pg.attribute("FRTYPE", "0").toInt(); + OB.Pwidth = ScCLocale::toDoubleC(pg.attribute("PWIDTH")); + OB.Pcolor = pg.attribute("PCOLOR"); + OB.Pcolor2 = pg.attribute("PCOLOR2"); + OB.NamedLStyle = pg.attribute("NAMEDLST", ""); + if (!MLineStyles.contains(OB.NamedLStyle)) + OB.NamedLStyle = ""; + OB.Shade = pg.attribute("SHADE").toInt(); + OB.Shade2 = pg.attribute("SHADE2").toInt(); + OB.TxtFill = pg.attribute("TXTFILL", "Black"); + OB.TxtStroke = pg.attribute("TXTSTROKE", CommonStrings::None); + OB.ShTxtFill = pg.attribute("TXTFILLSH", "100").toInt(); + OB.ShTxtStroke = pg.attribute("TXTSTRSH", "100").toInt(); + OB.TxtScale = qRound(ScCLocale::toDoubleC(pg.attribute("TXTSCALE"), 100.0) * 10); + OB.TxtScaleV = qRound(ScCLocale::toDoubleC(pg.attribute("TXTSCALEV"), 100.0) * 10); + OB.TxTBase = qRound(ScCLocale::toDoubleC(pg.attribute("TXTBASE"), 0.0) * 10); + OB.TxTStyle = pg.attribute("TXTSTYLE", "0").toInt(); + OB.GrType = pg.attribute("GRTYP", "0").toInt(); + OB.fill_gradient.clearStops(); + if (OB.GrType != 0) + { + OB.GrStartX = ScCLocale::toDoubleC(pg.attribute("GRSTARTX"), 0.0); + OB.GrStartY = ScCLocale::toDoubleC(pg.attribute("GRSTARTY"), 0.0); + OB.GrEndX = ScCLocale::toDoubleC(pg.attribute("GRENDX"), 0.0); + OB.GrEndY = ScCLocale::toDoubleC(pg.attribute("GRENDY"), 0.0); + OB.GrColor = pg.attribute("GRCOLOR",""); + if (!OB.GrColor.isEmpty()) + { + OB.GrColor2 = pg.attribute("GRCOLOR2",""); + OB.GrShade = pg.attribute("GRSHADE", "100").toInt(); + OB.GrShade2 = pg.attribute("GRSHADE2", "100").toInt(); + } + } + OB.Rot = ScCLocale::toDoubleC(pg.attribute("ROT")); + OB.PLineArt = Qt::PenStyle(pg.attribute("PLINEART").toInt()); + OB.PLineEnd = Qt::PenCapStyle(pg.attribute("PLINEEND", "0").toInt()); + OB.PLineJoin = Qt::PenJoinStyle(pg.attribute("PLINEJOIN", "0").toInt()); + OB.LineSp = ScCLocale::toDoubleC(pg.attribute("LINESP")); + OB.ExtraV = static_cast<int>(ScCLocale::toDoubleC(pg.attribute("EXTRAV"), 0.0)); // temporary compiler silencing + OB.LocalScX = ScCLocale::toDoubleC(pg.attribute("LOCALSCX")); + OB.LocalScY = ScCLocale::toDoubleC(pg.attribute("LOCALSCY")); + OB.LocalX = ScCLocale::toDoubleC(pg.attribute("LOCALX")); + OB.LocalY = ScCLocale::toDoubleC(pg.attribute("LOCALY")); + OB.PicArt = pg.attribute("PICART").toInt(); + OB.flippedH = pg.attribute("FLIPPEDH").toInt(); + OB.flippedV = pg.attribute("FLIPPEDV").toInt(); + OB.ScaleType = pg.attribute("SCALETYPE", "1").toInt(); + OB.AspectRatio = pg.attribute("RATIO", "0").toInt(); + OB.isPrintable = pg.attribute("PRINTABLE").toInt(); + OB.isBookmark = false; + OB.m_isAnnotation = pg.attribute("ANNOTATION", "0").toInt(); + if (pg.attribute("TRANSPARENT", "0").toInt() == 1) + OB.Pcolor = CommonStrings::None; + //OB.Textflow = pg.attribute("TEXTFLOW").toInt(); + //OB.Textflow2 = pg.attribute("TEXTFLOW2", "0").toInt(); + if ( pg.hasAttribute("TEXTFLOWMODE") ) + OB.TextflowMode = (PageItem::TextFlowMode) pg.attribute("TEXTFLOWMODE", "0").toInt(); + else if ( pg.attribute("TEXTFLOW").toInt() ) + { + if (pg.attribute("TEXTFLOW2", "0").toInt()) + OB.TextflowMode = PageItem::TextFlowUsesBoundingBox; + else if (pg.attribute("TEXTFLOW3", "0").toInt()) + OB.TextflowMode = PageItem::TextFlowUsesContourLine; + else + OB.TextflowMode = PageItem::TextFlowUsesFrameShape; + } + else + OB.TextflowMode = PageItem::TextFlowDisabled; + OB.Extra = ScCLocale::toDoubleC(pg.attribute("EXTRA")); + OB.TExtra = ScCLocale::toDoubleC(pg.attribute("TEXTRA"), 1.0); + OB.BExtra = ScCLocale::toDoubleC(pg.attribute("BEXTRA"), 1.0); + OB.RExtra = ScCLocale::toDoubleC(pg.attribute("REXTRA"), 1.0); + OB.PoShow = pg.attribute("PTLSHOW", "0").toInt(); + OB.BaseOffs = ScCLocale::toDoubleC(pg.attribute("BASEOF"), 0.0); + OB.textAlignment = pg.attribute("ALIGN", "0").toInt(); + OB.IFont = DoFonts[pg.attribute("IFONT")]; + OB.ISize = qRound(ScCLocale::toDoubleC(pg.attribute("ISIZE"), 12.0) * 10.0); + if (OB.PType == PageItem::LatexFrame) { + OB.Pfile = pg.attribute("LATEXTEMPFILE", ""); + //Hack to create a preview for latex frames + } else { + OB.Pfile = pg.attribute("PFILE"); + } + OB.Pfile2 = pg.attribute("PFILE2",""); + OB.Pfile3 = pg.attribute("PFILE3",""); + OB.IProfile = pg.attribute("PRFILE",""); + OB.EmProfile = pg.attribute("EPROF",""); + OB.IRender = (eRenderIntent) pg.attribute("IRENDER", "1").toInt(); + OB.UseEmbedded = pg.attribute("EMBEDDED", "1").toInt(); + OB.Locked = static_cast<bool>(pg.attribute("LOCK", "0").toInt()); + OB.Reverse = static_cast<bool>(pg.attribute("REVERS", "0").toInt()); + OB.Transparency = ScCLocale::toDoubleC(pg.attribute("TransValue"), 0.0); + if (pg.hasAttribute("TransValueS")) + OB.TranspStroke = ScCLocale::toDoubleC(pg.attribute("TransValueS"), 0.0); + else + OB.TranspStroke = OB.Transparency; + fillBlendmode = pg.attribute("TransBlend", "0").toInt(); + strokeBlendmode = pg.attribute("TransBlendS", "0").toInt(); + if (pg.hasAttribute("NUMCLIP")) + { + OB.Clip.resize(pg.attribute("NUMCLIP").toUInt()); + tmpx = pg.attribute("CLIPCOOR"); + ScTextStream f(&tmpx, QIODevice::ReadOnly); + for (uint c=0; c<pg.attribute("NUMCLIP").toUInt(); ++c) + { + f >> x; + f >> y; + OB.Clip.setPoint(c, x, y); + } + } + else + OB.Clip.resize(0); + if (pg.hasAttribute("NUMPO")) + { + OB.PoLine.resize(pg.attribute("NUMPO").toUInt()); + tmpx = pg.attribute("POCOOR"); + ScTextStream fp(&tmpx, QIODevice::ReadOnly); + for (uint cx=0; cx<pg.attribute("NUMPO").toUInt(); ++cx) + { + fp >> xf; + fp >> yf; + OB.PoLine.setPoint(cx, xf, yf); + } + } + else + OB.PoLine.resize(0); + OB.Groups.clear(); + if (OB.Clip.size() == 0) + OB.Clip = FlattenPath(OB.PoLine, Segments); + tmpx = ""; + QDomNode IT=DOC.firstChild(); + while(!IT.isNull()) + { + QDomElement it=IT.toElement(); + if (it.tagName()=="CSTOP") + { + QString name = it.attribute("NAME"); + double ramp = ScCLocale::toDoubleC(it.attribute("RAMP"), 0.0); + int shade = it.attribute("SHADE", "100").toInt(); + SetQColor(&tmpfa, name, shade); + OB.fill_gradient.addStop(tmpfa, ramp, 0.5, 1.0, name, shade); + } + if (it.tagName()=="ITEXT") + { + tmp2 = it.attribute("CH"); + tmp2.replace(QRegExp("\r"), QChar(5)); + tmp2.replace(QRegExp("\n"), QChar(5)); + tmp3 = "\t" + DoFonts[it.attribute("CFONT", OB.IFont)] + "\t"; + tmp3 += it.attribute("CSIZE" , QString::number(OB.ISize)) + "\t"; + tmp3 += it.attribute("CCOLOR", OB.TxtFill) + "\t"; +// tmp3 += it.attribute("CEXTRA") + "\t"; + tmp3 += "0\t"; + tmp3 += it.attribute("CSHADE", QString::number(OB.ShTxtFill)) + "\t"; + tmp3 += it.attribute("CSTYLE") + "\t"; + tmp3 += "0\t"; + tmp3 += it.attribute("CSTROKE",CommonStrings::None) + "\t"; + tmp3 += it.attribute("CSHADE2","100") + "\t"; + tmp3 += it.attribute("CSCALE","100") + "\n"; + for (int cxx=0; cxx<tmp2.length(); cxx++) + { + tmpx += tmp2.at(cxx)+tmp3; + } + } + if (it.tagName()=="PARA") + { + tmp2 = QChar(5); + tmp3 = "\t" + DoFonts[it.attribute("FONT", OB.IFont)] + "\t"; + tmp3 += it.attribute("FONTSIZE" , QString::number(OB.ISize)) + "\t"; + tmp3 += it.attribute("FCOLOR", OB.TxtFill) + "\t"; + tmp3 += "0\t"; + tmp3 += it.attribute("FSHADE", QString::number(OB.ShTxtFill)) + "\t"; + tmp3 += it.attribute("CSTYLE") + "\t"; + tmp3 += "0\t"; + tmp3 += it.attribute("SCOLOR",CommonStrings::None) + "\t"; + tmp3 += it.attribute("SSHADE","100") + "\t"; + tmp3 += it.attribute("SCALEH","100") + "\n"; + tmpx += tmp2+tmp3; + } + IT=IT.nextSibling(); + } + OB.itemText = tmpx; + if (!OB.itemText.isEmpty()) + { + ScTextStream t(&OB.itemText, QIODevice::ReadOnly); + QString cc; +#ifndef NLS_PROTO + while (!t.atEnd()) + { + cc = t.readLine(); + if (cc.isEmpty()) + continue; + QStringList wt; + QStringList::Iterator it; + wt = cc.split("\t", QString::SkipEmptyParts); + it = wt.begin(); + hg = new ScText; + hg->ch = it->at(0); + if (hg->ch == QChar(5)) + hg->ch = QChar(13); + it++; + hg->setFont(prefsManager->appPrefs.AvailFonts[*it]); + it++; + hg->setFontSize(qRound(ScCLocale::toDoubleC((*it)) * 10.0)); + it++; + hg->setFillColor(*it); + it++; + hg->setTracking((*it).toInt()); + it++; + hg->setFillShade((*it).toInt()); + it++; + // Qt4 if (it == NULL) + if (it == wt.end()) + hg->setFeatures(QStringList(CharStyle::INHERIT)); + else + hg->setFeatures(static_cast<StyleFlag>((*it).toInt()).featureList()); + it++; +// if (it == NULL) +// hg->cab = 0; +// else +// hg->cab = (*it).toInt(); + it++; + if (it == wt.end()) + hg->setStrokeColor(CommonStrings::None); + else + hg->setStrokeColor(*it); + it++; + if (it == wt.end()) + hg->setStrokeShade(100); + else + hg->setStrokeShade((*it).toInt()); + it++; + if (it == wt.end()) + hg->setScaleH(100); + else + hg->setScaleH((*it).toInt()); + + Ptexti.append(hg); + } +#endif + } + tmpx = GetAttr(&pg, "TEXTCOOR","0 0"); + ScTextStream ft(&tmpx, QIODevice::ReadOnly); + for (uint ct=0; ct<GetAttr(&pg, "NUMTEXT","0").toUInt(); ct++) + { +#ifndef NLS_PROTO + ft >> Ptexti.at(ct)->glyph.xoffset; + ft >> Ptexti.at(ct)->glyph.yoffset; +#endif + } + tmpx = ""; + if ((OB.PType == 5) && (OB.Height != 0)) + { + OB.Rot += atan2(OB.Height,OB.Width)*(180.0/M_PI); + OB.Width = sqrt(pow(OB.Width,2)+pow(OB.Height,2)); + OB.Height = 0; + 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)); + } + OB.LayerNr = -1; + OB.startArrowIndex = arrowID[pg.attribute("startArrowIndex", "0").toInt()]; + OB.endArrowIndex = arrowID[pg.attribute("endArrowIndex", "0").toInt()]; + if(static_cast<bool>(pg.attribute("isGroupControl", "0").toInt())) + { + pS->save(); + FPointArray cl = OB.PoLine.copy(); + QMatrix mm; + mm.translate(OB.Xpos, OB.Ypos); + mm.rotate(static_cast<double>(OB.Rot)); + cl.map( mm ); + pS->beginLayer(1.0 - OB.Transparency, pg.attribute("TransBlend", "0").toInt(), &cl); + groupStack.push(pg.attribute("groupsLastItem", "0").toInt() + currItem); + DOC=DOC.nextSibling(); + continue; + } + pS->save(); + if (fillBlendmode != 0) + pS->beginLayer(1.0 - OB.Transparency, fillBlendmode); + else + pS->setBrushOpacity(1.0 - OB.Transparency); + pS->translate(OB.Xpos, OB.Ypos); + pS->rotate(static_cast<double>(OB.Rot)); + if (OB.Pcolor != CommonStrings::None) + { + SetQColor(&tmpfa, OB.Pcolor, OB.Shade); + pS->setBrush(tmpfa); + pS->setFillMode(1); + } + else + pS->setFillMode(0); + if (OB.GrType != 0) + { + pS->setFillMode(2); + pS->fill_gradient.clearStops(); + if ((!OB.GrColor.isEmpty()) && (!OB.GrColor2.isEmpty())) + { + if (OB.GrType == 5) + { + if ((OB.GrColor != CommonStrings::None) && (!OB.GrColor.isEmpty())) + SetQColor(&tmpfa, OB.GrColor, OB.GrShade); + pS->fill_gradient.addStop(tmpfa, 0.0, 0.5, 1.0); + if ((OB.GrColor2 != CommonStrings::None) && (!OB.GrColor2.isEmpty())) + SetQColor(&tmpfa, OB.GrColor2, OB.GrShade2); + pS->fill_gradient.addStop(tmpfa, 1.0, 0.5, 1.0); + } + else + { + if ((OB.GrColor2 != CommonStrings::None) && (!OB.GrColor2.isEmpty())) + SetQColor(&tmpfa, OB.GrColor2, OB.GrShade2); + pS->fill_gradient.addStop(tmpfa, 0.0, 0.5, 1.0); + if ((OB.GrColor != CommonStrings::None) && (!OB.GrColor.isEmpty())) + SetQColor(&tmpfa, OB.GrColor, OB.GrShade); + pS->fill_gradient.addStop(tmpfa, 1.0, 0.5, 1.0); + } + } + else + pS->fill_gradient = OB.fill_gradient; + QMatrix grm; + grm.rotate(OB.Rot); + FPointArray gra; + switch (OB.GrType) + { + case 1: + gra.setPoints(2, 0, 0, OB.Width, 0); + gra.map(grm); + pS->setGradient(VGradient::linear, gra.point(0), gra.point(1)); + break; + case 2: + gra.setPoints(2, 0, 0, OB.Height, 0); + grm.rotate(90); + gra.map(grm); + pS->setGradient(VGradient::linear, gra.point(0), gra.point(1)); + break; + case 3: + gra.setPoints(2, 0, 0, OB.Width, OB.Height); + gra.map(grm); + pS->setGradient(VGradient::linear, gra.point(0), gra.point(1)); + break; + case 4: + gra.setPoints(2, 0, OB.Height, OB.Width, 0); + gra.map(grm); + pS->setGradient(VGradient::linear, gra.point(0), gra.point(1)); + break; + case 5: + if (OB.Width > OB.Height) + gv = FPoint(OB.Width, OB.Height / 2.0); + else + gv = FPoint(OB.Width / 2.0, OB.Height); + pS->setGradient(VGradient::radial, FPoint(OB.Width / 2.0,OB.Height / 2.0), gv, FPoint(OB.Width / 2.0,OB.Height / 2.0)); + break; + case 6: + gra.setPoints(2, OB.GrStartX, OB.GrStartY, OB.GrEndX, OB.GrEndY); + gra.map(grm); + pS->setGradient(VGradient::linear, gra.point(0), gra.point(1)); + break; + } + } + if (OB.Pcolor2 != CommonStrings::None) + { + SetQColor(&tmpfa, OB.Pcolor2, OB.Shade2); + if ((OB.Pwidth == 0) && (OB.PType != 5)) + pS->setLineWidth(0); + else + pS->setPen(tmpfa, OB.Pwidth, Qt::PenStyle(OB.PLineArt), Qt::PenCapStyle(OB.PLineEnd), Qt::PenJoinStyle(OB.PLineJoin)); + } + else + pS->setLineWidth(0); + bool doStroke; + int mode; + doStroke = true; + switch (OB.PType) + { + case PageItem::ImageFrame: + case PageItem::LatexFrame: + if ((OB.Pcolor != CommonStrings::None) || (OB.GrType != 0)) + { + pS->setupPolygon(&OB.PoLine); + pS->drawPolygon(); + } + if (!OB.Pfile.isEmpty()) + { + QFileInfo fi = QFileInfo(OB.Pfile); + if (fi.exists()) + { + pS->setupPolygon(&OB.PoLine); + pS->setClipPath(); + pS->save(); + if (OB.flippedH) + { + pS->translate(OB.Width, 0); + pS->scale(-1, 1); + } + if (OB.flippedV) + { + pS->translate(0, OB.Height); + pS->scale(1, -1); + } + ScImage pixm; + CMSettings cms(0, "", Intent_Perceptual); + pixm.LoadPicture(OB.Pfile, 1, cms, false, false, ScImage::RGBData, 72); //FIXME: OB doesnt know about pagenr + pS->scale(OB.LocalScX, OB.LocalScY); + pS->translate(static_cast<int>(OB.LocalX), static_cast<int>(OB.LocalY)); + QImage img(pixm.qImage()); + pS->drawImage(&img); + pS->restore(); + } + } + else + { + if (static_cast<bool>(pg.attribute("isInlineImage", "0").toInt())) + { + QByteArray inlineImageData; + QString dat = pg.attribute("ImageData", ""); + inlineImageData.append(dat); + QString inlineImageExt = pg.attribute("inlineImageExt", ""); + if (inlineImageData.size() > 0) + { + QTemporaryFile *tempImageFile = new QTemporaryFile(QDir::tempPath() + "/scribus_temp_XXXXXX." + inlineImageExt); + tempImageFile->open(); + QString fileName = getLongPathName(tempImageFile->fileName()); + tempImageFile->close(); + inlineImageData = qUncompress(QByteArray::fromBase64(inlineImageData)); + QFile outFil(fileName); + if (outFil.open(QIODevice::WriteOnly)) + { + outFil.write(inlineImageData); + outFil.close(); + pS->setupPolygon(&OB.PoLine); + pS->setClipPath(); + pS->save(); + if (OB.flippedH) + { + pS->translate(OB.Width, 0); + pS->scale(-1, 1); + } + if (OB.flippedV) + { + pS->translate(0, OB.Height); + pS->scale(1, -1); + } + ScImage pixm; + CMSettings cms(0, "", Intent_Perceptual); + pixm.LoadPicture(fileName, 1, cms, false, false, ScImage::RGBData, 72); //FIXME: OB doesnt know about pagenr + pS->scale(OB.LocalScX, OB.LocalScY); + pS->translate(static_cast<int>(OB.LocalX), static_cast<int>(OB.LocalY)); + QImage img(pixm.qImage()); + pS->drawImage(&img); + pS->restore(); + } + delete tempImageFile; + } + } + } + break; + case PageItem::TextFrame: +#ifndef NLS_PROTO + if (Ptexti.count() != 0) + { + pS->save(); + if (OB.Pcolor != CommonStrings::None) + { + pS->setupPolygon(&OB.PoLine); + pS->drawPolygon(); + } + if (OB.flippedH) + { + pS->translate(OB.Width, 0); + pS->scale(-1, 1); + } + if (OB.flippedV) + { + pS->translate(0, OB.Height); + pS->scale(1, -1); + } + if ((OB.Width < 4) || (OB.Height < 4)) + break; + for (int a = 0; a < Ptexti.count(); a++) + { + hl = Ptexti.at(a); + if (hl->ch == QChar(13)) + continue; + chstr = hl->ch; + chs = hl->fontSize(); + if (chs < 10) + continue; + if (hl->effects() != ScStyle_Default) + { + if (hl->effects() & 1) + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.scalingSuperScript / 100); + if (hl->effects() & 2) + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.scalingSubScript / 100); + if (hl->effects() & 64) + { + if (chstr.toUpper() != chstr) + { + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.valueSmallCaps / 100); + chstr = chstr.toUpper(); + } + } + } + mode = 0; + if (hl->fillColor() != CommonStrings::None) + { + SetQColor(&tmpfa, hl->fillColor(), hl->fillShade()); + pS->setBrush(tmpfa); + mode = 2; + } + if (hl->strokeColor() != CommonStrings::None) + { + SetQColor(&tmpfa, hl->strokeColor(), hl->strokeShade()); + pS->setPen(tmpfa, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + mode += 1; + } + DrawZeichenS(pS, hl->glyph.xoffset, hl->glyph.yoffset, chstr, hl->font().scName(), OB.Reverse, hl->effects(), mode, chs); + } + pS->restore(); + } + break; +#endif + case PageItem::Line: + if (OB.NamedLStyle.isEmpty()) + pS->drawLine(FPoint(0, 0), FPoint(OB.Width, 0)); + else + { + multiLine ml = MLineStyles[OB.NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + SetQColor(&tmpfa, ml[it].Color, ml[it].Shade); + pS->setPen(tmpfa, + qMax(static_cast<int>(ml[it].Width), 1), + static_cast<Qt::PenStyle>(ml[it].Dash), + static_cast<Qt::PenCapStyle>(ml[it].LineEnd), + static_cast<Qt::PenJoinStyle>(ml[it].LineJoin)); + pS->drawLine(FPoint(0, 0), FPoint(OB.Width, 0)); + } + } + if (OB.startArrowIndex != 0) + { + QMatrix arrowTrans; + FPointArray arrow = arrowStyles.at(OB.startArrowIndex-1).points.copy(); + arrowTrans.translate(0, 0); + arrowTrans.scale(OB.Pwidth, OB.Pwidth); + arrowTrans.scale(-1,1); + arrow.map(arrowTrans); + pS->setBrush(pS->pen()); + pS->setLineWidth(0); + pS->setFillMode(ScPainter::Solid); + pS->setupPolygon(&arrow); + pS->drawPolygon(); + } + if (OB.endArrowIndex != 0) + { + QMatrix arrowTrans; + FPointArray arrow = arrowStyles.at(OB.endArrowIndex-1).points.copy(); + arrowTrans.translate(OB.Width, 0); + arrowTrans.scale(OB.Pwidth, OB.Pwidth); + arrow.map(arrowTrans); + pS->setBrush(pS->pen()); + pS->setLineWidth(0); + pS->setFillMode(ScPainter::Solid); + pS->setupPolygon(&arrow); + pS->drawPolygon(); + } + doStroke = false; + break; + /* OBSOLETE Craig R 2005-02-06 + case 1: + case 3: + */ + case PageItem::ItemType1: + case PageItem::ItemType3: + case PageItem::Polygon: + pS->setupPolygon(&OB.PoLine); + pS->drawPolygon(); + break; + case PageItem::PolyLine: + if (OB.PoLine.size() < 4) + break; + if ((OB.Pcolor != CommonStrings::None) || (OB.GrType != 0)) + { + FPointArray cli; + FPoint Start; + bool firstp = true; + for (uint n = 0; n < OB.PoLine.size()-3; n += 4) + { + if (firstp) + { + Start = OB.PoLine.point(n); + firstp = false; + } + if (OB.PoLine.point(n).x() > 900000) + { + cli.addPoint(OB.PoLine.point(n-2)); + cli.addPoint(OB.PoLine.point(n-2)); + cli.addPoint(Start); + cli.addPoint(Start); + cli.setMarker(); + firstp = true; + continue; + } + cli.addPoint(OB.PoLine.point(n)); + cli.addPoint(OB.PoLine.point(n+1)); + cli.addPoint(OB.PoLine.point(n+2)); + cli.addPoint(OB.PoLine.point(n+3)); + } + if (cli.size() > 2) + { + FPoint l1 = cli.point(cli.size()-2); + cli.addPoint(l1); + cli.addPoint(l1); + cli.addPoint(Start); + cli.addPoint(Start); + } + pS->setupPolygon(&cli); + pS->fillPath(); + } + pS->setupPolygon(&OB.PoLine, false); + if (OB.NamedLStyle.isEmpty()) + pS->strokePath(); + else + { + multiLine ml = MLineStyles[OB.NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + SetQColor(&tmpfa, ml[it].Color, ml[it].Shade); + pS->setPen(tmpfa, ml[it].Width, + static_cast<Qt::PenStyle>(ml[it].Dash), + static_cast<Qt::PenCapStyle>(ml[it].LineEnd), + static_cast<Qt::PenJoinStyle>(ml[it].LineJoin)); + pS->drawPolyLine(); + } + } + if (OB.startArrowIndex != 0) + { + FPoint Start = OB.PoLine.point(0); + for (uint xx = 1; xx < OB.PoLine.size(); xx += 2) + { + FPoint Vector = OB.PoLine.point(xx); + if ((Start.x() != Vector.x()) || (Start.y() != Vector.y())) + { + double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI); + QMatrix arrowTrans; + FPointArray arrow = arrowStyles.at(OB.startArrowIndex-1).points.copy(); + arrowTrans.translate(Start.x(), Start.y()); + arrowTrans.rotate(r); + arrowTrans.scale(OB.Pwidth, OB.Pwidth); + arrow.map(arrowTrans); + pS->setBrush(pS->pen()); + pS->setLineWidth(0); + pS->setFillMode(ScPainter::Solid); + pS->setupPolygon(&arrow); + pS->drawPolygon(); + break; + } + } + } + if (OB.endArrowIndex != 0) + { + FPoint End = OB.PoLine.point(OB.PoLine.size()-2); + for (uint xx = OB.PoLine.size()-1; xx > 0; xx -= 2) + { + FPoint Vector = OB.PoLine.point(xx); + if ((End.x() != Vector.x()) || (End.y() != Vector.y())) + { + double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI); + QMatrix arrowTrans; + FPointArray arrow = arrowStyles.at(OB.endArrowIndex-1).points.copy(); + arrowTrans.translate(End.x(), End.y()); + arrowTrans.rotate(r); + arrowTrans.scale(OB.Pwidth, OB.Pwidth); + arrow.map(arrowTrans); + pS->setBrush(pS->pen()); + pS->setLineWidth(0); + pS->setFillMode(ScPainter::Solid); + pS->setupPolygon(&arrow); + pS->drawPolygon(); + break; + } + } + } + doStroke = false; + break; + case PageItem::PathText: +#ifndef NLS_PROTO + if (!OB.PoShow) + doStroke = false; + cl = FlattenPath(OB.PoLine, Segments); + CurX = OB.Extra; + if (Ptexti.count() != 0) + CurX += Ptexti.at(0)->fontSize() * Ptexti.at(0)->tracking() / 10000.0; + zae = 0; + 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)); + while (wid < 1) + { + zae++; + if (zae == cl.size()-1) + goto PfadEnd; + 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)); + } + rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),cl.point(zae+1).y()-cl.point(zae).y()); + for (a = 0; a < Ptexti.count(); a++) + { + CurY = 0; + hl = Ptexti.at(a); + chstr = hl->ch; + if ((chstr == QChar(30)) || (chstr == QChar(13))) + continue; + if (hl->fillColor() != CommonStrings::None) + { + SetQColor(&tmpfa, hl->fillColor(), hl->fillShade()); + pS->setPen(tmpfa); + } + chs = hl->fontSize(); + asce = hl->font().ascent(hl->fontSize() / 10.0); + int chst = hl->effects() & 127; + if (chst != 0) + { + if (chst & 1) + { + CurY -= asce * prefsManager->appPrefs.typographicSettings.valueSuperScript / 100; + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.scalingSuperScript / 100); + } + if (chst & 2) + { + CurY += asce * prefsManager->appPrefs.typographicSettings.valueSubScript / 100; + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.scalingSubScript / 100); + } + if (chst & 64) + { + if (chstr.toUpper() != chstr) + { + chs = static_cast<int>(hl->fontSize() * prefsManager->appPrefs.typographicSettings.valueSmallCaps / 100); + chstr = chstr.toUpper(); + } + } + } + wide = hl->font().charWidth(chstr[0], chs / 10.0); + if ((CurX+(wide+chs * hl->tracking() / 10000.0)/2) >= wid) + { + if (zae < cl.size()-1) + { + CurX = CurX - wid; + wid = 0; + EndX = CurX; + do + { + do + { + zae++; + if (zae == cl.size()-1) + goto PfadEnd; + 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)); + rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),cl.point(zae+1).y()-cl.point(zae).y()); + } + while (wid == 0); + EndX -= wid; + } + while (wid < EndX); + CurX = EndX + wid; + } + else + goto PfadEnd; + } + pS->save(); + pS->translate(cl.point(zae).x(), cl.point(zae).y()); + pS->rotate(rota); + DrawZeichenS(pS, CurX+chs * hl->tracking() / 10000.0, CurY+OB.BaseOffs, chstr, hl->font().scName(), OB.Reverse, hl->effects(), 2, chs); + pS->restore(); + CurX += wide+chs * hl->tracking() / 10000.0; + } +#endif + PfadEnd: break; + case PageItem::Multiple: + Q_ASSERT(false); + break; + } + if (fillBlendmode != 0) + pS->endLayer(); + if (doStroke) + { + if (strokeBlendmode != 0) + pS->beginLayer(1.0 - OB.TranspStroke, strokeBlendmode); + else + pS->setPenOpacity(1.0 - OB.TranspStroke); + if (OB.Pcolor2 != CommonStrings::None) + { + SetQColor(&tmpfa, OB.Pcolor2, OB.Shade2); + pS->setPen(tmpfa, OB.Pwidth, Qt::PenStyle(OB.PLineArt), Qt::PenCapStyle(OB.PLineEnd), Qt::PenJoinStyle(OB.PLineJoin)); + // if (DashValues.count() != 0) + // pS->setDash(DashValues, DashOffset); + } + else + pS->setLineWidth(0); + pS->setupPolygon(&OB.PoLine); + if (OB.NamedLStyle.isEmpty()) + pS->drawPolyLine(); + else + { + multiLine ml = MLineStyles[OB.NamedLStyle]; + for (int it = ml.size()-1; it > -1; it--) + { + SetQColor(&tmpfa, ml[it].Color, ml[it].Shade); + pS->setPen(tmpfa, ml[it].Width, + static_cast<Qt::PenStyle>(ml[it].Dash), + static_cast<Qt::PenCapStyle>(ml[it].LineEnd), + static_cast<Qt::PenJoinStyle>(ml[it].LineJoin)); + pS->drawPolyLine(); + } + } + if (strokeBlendmode != 0) + pS->endLayer(); + } + pS->restore(); + if (groupStack.count() != 0) + { + while (currItem == groupStack.top()) + { + pS->endLayer(); + pS->restore(); + groupStack.pop(); + if (groupStack.count() == 0) + break; + } + } + QDir::setCurrent(CurDirP); + } + DOC=DOC.nextSibling(); + } + pS->endLayer(); + pS->end(); + QImage tmpi = tmp.scaled(static_cast<int>(tmp.width()*pmmax), static_cast<int>(tmp.height()*pmmax), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + QPixmap ret; + ret=QPixmap::fromImage(tmpi); + delete pS; +// FT_Done_FreeType( library ); + return ret; +} + +void ScPreview::SetQColor(QColor *tmp, const QString& farbe, double shad) +{ + *tmp = ScColorEngine::getShadeColorProof(Farben[farbe], NULL, shad); +} + +void ScPreview::DrawZeichenS(ScPainter *p, double xco, double yco, QString ch, QString ZFo, bool Reverse, int Style, int mod, double Siz) +{ + if (mod == 0) + return; + QString ccx = ch; + if (ccx == QChar(29)) + ccx = " "; + double wide; + double csi = Siz / 100.0; +// uint chr = ccx[0].unicode(); + if (prefsManager->appPrefs.AvailFonts[ZFo].canRender(ccx[0])) + { + wide = prefsManager->appPrefs.AvailFonts[ZFo].charWidth(ccx[0])*(Siz / 10.0); + QMatrix chma; + chma.scale(csi, csi); + uint gl = prefsManager->appPrefs.AvailFonts[ZFo].char2CMap(ccx[0]); + FPointArray gly = prefsManager->appPrefs.AvailFonts[ZFo].glyphOutline(gl); + if (gly.size() < 4) + return; + gly.map(chma); + chma = QMatrix(); + p->setFillMode(1); + if (Reverse) + { + chma.scale(-1, 1); + chma.translate(-wide, 0); + gly.map(chma); + chma = QMatrix(); + chma.translate(xco, yco-(Siz / 10.0)); + } + else + chma.translate(xco, yco-(Siz / 10.0)); + gly.map(chma); + p->setupPolygon(&gly); + p->setFillMode(1); + if (mod > 1) + p->fillPath(); + if ((Style & 4) && ((mod % 2) != 0)) + { + p->setLineWidth(prefsManager->appPrefs.AvailFonts[ZFo].strokeWidth() * Siz / 20); + p->strokePath(); + } + if (Style & 16) + { + double st = prefsManager->appPrefs.AvailFonts[ZFo].strikeoutPos() * (Siz / 10.0); + p->setLineWidth(qMax(prefsManager->appPrefs.AvailFonts[ZFo].strokeWidth() * (Siz / 10.0), 1.0)); + p->drawLine(FPoint(xco, yco-st), FPoint(xco+wide, yco-st)); + } + if (Style & 8) + { + double st = prefsManager->appPrefs.AvailFonts[ZFo].underlinePos() * (Siz / 10.0); + p->setLineWidth(qMax(prefsManager->appPrefs.AvailFonts[ZFo].strokeWidth() * (Siz / 10.0), 1.0)); + p->drawLine(FPoint(xco, yco-st), FPoint(xco+wide, yco-st)); + } + } + else + { + p->setLineWidth(1); + p->setPen(Qt::black); + p->setFillMode(0); + p->drawRect(xco, yco-Siz, (Siz / 10.0), (Siz / 10.0)); + } +} |
