Subversion Repositories Scribus

Rev

Rev 7956 | Rev 7964 | 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
*/
3614 cbradney 7
/***************************************************************************
8
                          pageitem.cpp  -  description
9
                             -------------------
10
    begin                : Sat Apr 7 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
24
#include "pageitem_pathtext.h"
25
#include "pageitem_pathtext.moc"
26
#include <qpainter.h>
27
#include <qpen.h>
28
#include <qfont.h>
29
#include <qregion.h>
30
#include <qpoint.h>
31
#include <qfileinfo.h>
32
#include <qdrawutil.h>
33
#include <qbitmap.h>
34
#include <qregexp.h>
35
#include <qmessagebox.h>
36
#include <cmath>
37
#include <cassert>
38
 
39
#include "mpalette.h"
40
#include "page.h"
41
#include "pageitem.h"
42
#include "prefsmanager.h"
43
#include "scpaths.h"
44
#include "scribus.h"
45
#include "scribusstructs.h"
46
#include "scribusdoc.h"
4546 subik 47
#include "commonstrings.h"
3614 cbradney 48
#include "undomanager.h"
49
#include "undostate.h"
50
#include "scconfig.h"
51
 
52
#include "util.h"
53
 
5184 avox 54
#include "text/nlsconfig.h"
55
 
3614 cbradney 56
using namespace std;
57
 
58
PageItem_PathText::PageItem_PathText(ScribusDoc *pa, double x, double y, double w, double h, double w2, QString fill, QString outline)
59
        : PageItem(pa, PageItem::PathText, x, y, w, h, w2, fill, outline)
60
{
7939 fschmid 61
        firstChar = 0;
62
        MaxChars = itemText.length();
3614 cbradney 63
}
64
 
5350 avox 65
void PageItem_PathText::DrawObj_Item(ScPainter *p, QRect /*e*/, double sc)
3614 cbradney 66
{
7956 avox 67
//      itemText.setDefaultStyle(ParagraphStyle(itemText.defaultStyle()));
68
//      m_Doc->AdjustItemSize(this);
7914 fschmid 69
        firstChar = 0;
5753 jghali 70
        int a;
3614 cbradney 71
        int chs;
5721 avox 72
        QString chstr, chstr2, chstr3;
4689 mrdocs 73
        ScText *hl;
3614 cbradney 74
        double dx;
75
        double sp = 0;
76
        double oldSp = 0;
77
        double oCurX = 0;
78
        FPoint point = FPoint(0, 0);
79
        FPoint normal = FPoint(0, 0);
80
        FPoint tangent = FPoint(0, 0);
81
        FPoint extPoint = FPoint(0, 0);
82
        bool ext = false;
83
        bool first = true;
84
        double fsx = 0;
85
        uint seg = 0;
86
        double segLen = 0;
87
        double distCurX;
7912 fschmid 88
        QColor tmp;
3614 cbradney 89
        CurX = Extra;
7930 fschmid 90
        QString cachedStroke = "";
91
        QString cachedFill = "";
92
        int cachedFillShade = -1;
93
        int cachedStrokeShade = -1;
7937 fschmid 94
        QString actStroke = "";
95
        QString actFill = "";
96
        int actFillShade = -1;
97
        int actStrokeShade = -1;
7930 fschmid 98
        QColor cachedFillQ;
99
        QColor cachedStrokeQ;
5619 fschmid 100
        if (!m_Doc->layerOutline(LayerNr))
3614 cbradney 101
        {
6568 fschmid 102
                if (PoShow)
5572 fschmid 103
                {
6568 fschmid 104
                        if (lineColor() != CommonStrings::None && PoShow)
105
                        {
106
                                p->setupPolygon(&PoLine, false);
107
                                p->strokePath();
108
                        }
109
                        else
110
                        {
111
                                if (NamedLStyle.isEmpty())
112
                                        p->drawLine(FPoint(0, 0), FPoint(Width, 0));
113
                                else
114
                                {
115
                                        multiLine ml = m_Doc->MLineStyles[NamedLStyle];
116
                                        for (int it = ml.size()-1; it > -1; it--)
117
                                        {
118
                                                if ((ml[it].Color != CommonStrings::None) && (ml[it].Width != 0))
119
                                                {
120
                                                        SetFarbe(&tmp, ml[it].Color, ml[it].Shade);
121
                                                        p->setPen(tmp, ml[it].Width, static_cast<PenStyle>(ml[it].Dash), static_cast<PenCapStyle>(ml[it].LineEnd), static_cast<PenJoinStyle>(ml[it].LineJoin));
122
                                                        p->drawLine(FPoint(0, 0), FPoint(Width, 0));
123
                                                }
124
                                        }
125
                                }
126
                        }
5572 fschmid 127
                }
3614 cbradney 128
        }
5184 avox 129
        if (itemText.length() != 0)
5691 avox 130
                CurX += itemText.charStyle(0).fontSize() * itemText.charStyle(0).tracking() / 10000.0;
3614 cbradney 131
        segLen = PoLine.lenPathSeg(seg);
5184 avox 132
#ifndef NLS_PROTO
7956 avox 133
        for (a = firstChar; a < itemText.length(); ++a)
3614 cbradney 134
        {
135
                CurY = 0;
5721 avox 136
                hl = itemText.item(a);
137
                chstr = hl->ch;
7956 avox 138
                if (chstr[0] == SpecialChars::PAGENUMBER || chstr[0] == SpecialChars::PARSEP
139
                        || chstr[0] == SpecialChars::TAB || chstr == SpecialChars::LINEBREAK)
3614 cbradney 140
                        continue;
5691 avox 141
                chs = hl->fontSize();
7912 fschmid 142
                if (a < itemText.length()-1)
143
                        chstr += itemText.text(a+1, 1);
7956 avox 144
                hl->glyph.yadvance = 0;
7442 avox 145
                layoutGlyphs(itemText.charStyle(a), chstr, hl->glyph);
7956 avox 146
                hl->glyph.shrink();                                                           // HACK
7912 fschmid 147
                dx = hl->glyph.wide() / 2.0;
7956 avox 148
//              qDebug(QString("pathtext-draw: parent %1 parentc %2").arg((uint)itemText.paragraphStyle(a).parentStyle()).arg((uint)itemText.charStyle(a).parentStyle()));
149
                qDebug(QString("pathtext-draw: co %1 %2 %3 %4").arg(itemText.charStyle(a).fillColor()).arg(itemText.charStyle(a).fillShade()).arg(itemText.charStyle(a).strokeColor()).arg(itemText.charStyle(a).strokeShade()));
150
//              qDebug(QString("pathtext-draw: fo %1 %2").arg(itemText.charStyle(a).font().scName()).arg(hl->glyph.glyph));
3614 cbradney 151
                CurX += dx;
152
                ext = false;
153
                while ( (seg < PoLine.size()-3) && (CurX > fsx + segLen))
154
                {
155
                        fsx += segLen;
156
                        seg += 4;
157
                        if (seg > PoLine.size()-3)
158
                                break;
159
                        segLen = PoLine.lenPathSeg(seg);
160
                        ext = true;
161
                }
162
                if (seg > PoLine.size()-3)
163
                        break;
164
                if (CurX > fsx + segLen)
165
                        break;
166
                if (ext)
167
                {
168
                        sp = 0;
169
                        distCurX = PoLine.lenPathDist(seg, 0, sp);
170
                        while (distCurX <= ((CurX - oCurX) - (fsx - oCurX)))
171
                        {
172
                                sp += 0.001;
173
                                distCurX = PoLine.lenPathDist(seg, 0, sp);
174
                        }
175
                        PoLine.pointTangentNormalAt(seg, sp, &point, &tangent, &normal );
176
                        CurX = (CurX - (CurX - fsx)) + distCurX;
177
                        oldSp = sp;
178
                        ext = false;
179
                }
180
                else
181
                {
182
                        if( seg < PoLine.size()-3 )
183
                        {
184
                                if (CurX > fsx + segLen)
185
                                        break;
186
                                distCurX = PoLine.lenPathDist(seg, oldSp, sp);
187
                                while (distCurX <= (CurX - oCurX))
188
                                {
189
                                        sp += 0.001;
190
                                        if (sp >= 1.0)
191
                                        {
192
                                                sp = 0.9999;
193
                                                break;
194
                                        }
195
                                        distCurX = PoLine.lenPathDist(seg, oldSp, sp);
196
                                }
197
                                PoLine.pointTangentNormalAt(seg, sp, &point, &tangent, &normal );
198
                                CurX = oCurX + distCurX;
199
                                oldSp = sp;
200
                        }
201
                        else
202
                                break;
203
                }
7912 fschmid 204
                hl->glyph.xoffset = 0;
205
                hl->glyph.yoffset = BaseOffs;
3614 cbradney 206
                hl->PtransX = tangent.x();
207
                hl->PtransY = tangent.y();
208
                hl->PRot = dx;
7956 avox 209
                qDebug(QString("'%1' (%2,%3) %4+%5").arg(itemText.text(a)).arg(point.x()).arg(point.y()).arg(CurX).arg(dx));
7912 fschmid 210
#ifdef HAVE_CAIRO
211
                QWMatrix trafo = QWMatrix( 1, 0, 0, -1, -dx, 0 );
7926 fschmid 212
                if (textPathFlipped)
213
                        trafo *= QWMatrix(1, 0, 0, -1, 0, 0);
214
                if (textPathType == 0)
215
                        trafo *= QWMatrix( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x(), point.y() ); // ID's Rainbow mode
216
                else if (textPathType == 1)
217
                        trafo *= QWMatrix( 1, 0, 0, -1, point.x(), point.y() ); // ID's Stair Step mode
7961 fschmid 218
                else if (textPathType == 2)
219
                {
220
                        double a = 1;
221
                        if (tangent.x() < 0)
222
                                a = -1;
223
                        if (fabs(tangent.x()) > 0.1)
224
                                trafo *= QWMatrix( a, (tangent.y() / tangent.x()) * a, 0, -1, point.x(), point.y() ); // ID's Skew mode
225
                        else
226
                                trafo *= QWMatrix( a, 4 * a, 0, -1, point.x(), point.y() );
227
                }
7912 fschmid 228
#else
3614 cbradney 229
                QWMatrix trafo = QWMatrix( 1, 0, 0, -1, -dx*sc, 0 );
7926 fschmid 230
                if (textPathFlipped)
231
                        trafo *= QWMatrix(1, 0, 0, -1, 0, 0);
232
                if (textPathType == 0)
233
                        trafo *= QWMatrix( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x()*sc, point.y()*sc ); // ID's Rainbow mode
234
                else if (textPathType == 1)
235
                        trafo *= QWMatrix( 1, 0, 0, -1, point.x()*sc, point.y()*sc ); // ID's Stair Step mode
7961 fschmid 236
                else if (textPathType == 2)
237
                {
238
                        double a = 1;
239
                        if (tangent.x() < 0)
240
                                a = -1;
241
                        if (fabs(tangent.x()) > 0.1)
242
                                trafo *= QWMatrix( a, (tangent.y() / tangent.x()) * a, 0, -1, point.x()*sc, point.y()*sc ); // ID's Skew mode
243
                        else
244
                                trafo *= QWMatrix( a, 4 * a, 0, -1, point.x()*sc, point.y()*sc );
245
                }
7912 fschmid 246
#endif
3614 cbradney 247
                QWMatrix sca = p->worldMatrix();
248
                trafo *= sca;
249
                p->save();
250
                QWMatrix savWM = p->worldMatrix();
251
                p->setWorldMatrix(trafo);
7442 avox 252
                if (!m_Doc->RePos)
7912 fschmid 253
                {
7937 fschmid 254
                        actFill = itemText.charStyle(a).fillColor();
255
                        actFillShade = itemText.charStyle(a).fillShade();
256
                        if (actFill != CommonStrings::None)
7912 fschmid 257
                        {
7937 fschmid 258
                                if ((cachedFillShade != actFillShade) || (cachedFill != actFill))
7930 fschmid 259
                                {
7937 fschmid 260
                                        SetFarbe(&tmp, actFill, actFillShade);
7930 fschmid 261
                                        p->setBrush(tmp);
262
                                        cachedFillQ = tmp;
7937 fschmid 263
                                        cachedFill = actFill;
264
                                        cachedFillShade = actFillShade;
7930 fschmid 265
                                }
7937 fschmid 266
                                else
267
                                        p->setBrush(cachedFillQ);
7930 fschmid 268
                        }
7937 fschmid 269
                        actStroke = itemText.charStyle(a).strokeColor();
270
                        actStrokeShade = itemText.charStyle(a).strokeShade();
271
                        if (actStroke != CommonStrings::None)
7930 fschmid 272
                        {
7937 fschmid 273
                                if ((cachedStrokeShade != actStrokeShade) || (cachedStroke != actStroke))
7930 fschmid 274
                                {
7937 fschmid 275
                                        SetFarbe(&tmp, actStroke, actStrokeShade);
7930 fschmid 276
                                        p->setPen(tmp, 1, SolidLine, FlatCap, MiterJoin);
277
                                        cachedStrokeQ = tmp;
7937 fschmid 278
                                        cachedStroke = actStroke;
279
                                        cachedStrokeShade = actStrokeShade;
7930 fschmid 280
                                }
7937 fschmid 281
                                else
282
                                        p->setPen(cachedStrokeQ, 1, SolidLine, FlatCap, MiterJoin);
7930 fschmid 283
                        }
7442 avox 284
                        drawGlyphs(p, itemText.charStyle(a), hl->glyph);
7912 fschmid 285
                }
286
                hl->glyph.xoffset = point.x();
287
                hl->glyph.yoffset = point.y();
7937 fschmid 288
                p->setWorldMatrix(savWM);
3614 cbradney 289
                p->restore();
7141 fschmid 290
#ifndef HAVE_CAIRO
3614 cbradney 291
                p->setZoomFactor(sc);
7141 fschmid 292
#endif
3614 cbradney 293
                MaxChars = a+1;
294
                oCurX = CurX;
295
                CurX -= dx;
7912 fschmid 296
                CurX += hl->glyph.wide()+hl->fontSize() * hl->tracking() / 10000.0;
3614 cbradney 297
                first = false;
298
        }
5184 avox 299
#endif
7956 avox 300
        qDebug(QString("PageItem_PathText::DrawObj_Item repos=%1, %2 chars, [%3 %4 %5 %6 %7 %8] with %9").arg(m_Doc->RePos).arg(MaxChars)
301
                   .arg(p->worldMatrix().m11()).arg(p->worldMatrix().m12()).arg(p->worldMatrix().m21()).arg(p->worldMatrix().m22()).arg(p->worldMatrix().dx()).arg(p->worldMatrix().dy())
302
                   .arg(QString("pen %1 brush%2 device%3 isPainting=%4").arg(p->pen().rgb()).arg(p->brush().rgb()).arg(p->device()? p->device()->paintingActive() : -999))
303
                   );
3614 cbradney 304
}