Subversion Repositories Scribus

Rev

Rev 5721 | Rev 5980 | 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 <ft2build.h>
53
#include FT_GLYPH_H
54
 
55
#include "scfontmetrics.h"
56
#include "util.h"
57
 
5184 avox 58
#include "text/nlsconfig.h"
59
 
3614 cbradney 60
using namespace std;
61
 
62
PageItem_PathText::PageItem_PathText(ScribusDoc *pa, double x, double y, double w, double h, double w2, QString fill, QString outline)
63
        : PageItem(pa, PageItem::PathText, x, y, w, h, w2, fill, outline)
64
{
65
}
66
 
5350 avox 67
void PageItem_PathText::DrawObj_Item(ScPainter *p, QRect /*e*/, double sc)
3614 cbradney 68
{
5753 jghali 69
        int a;
3614 cbradney 70
        int chs;
71
        double wide;
5721 avox 72
        QString chstr, chstr2, chstr3;
4689 mrdocs 73
        ScText *hl;
3614 cbradney 74
        struct ZZ *Zli;
75
        double dx;
76
        double sp = 0;
77
        double oldSp = 0;
78
        double oCurX = 0;
79
        FPoint point = FPoint(0, 0);
80
        FPoint normal = FPoint(0, 0);
81
        FPoint tangent = FPoint(0, 0);
82
        FPoint extPoint = FPoint(0, 0);
83
        bool ext = false;
84
        bool first = true;
85
        double fsx = 0;
86
        uint seg = 0;
87
        double segLen = 0;
88
        double distCurX;
89
        CurX = Extra;
5619 fschmid 90
        if (!m_Doc->layerOutline(LayerNr))
3614 cbradney 91
        {
5572 fschmid 92
                if (lineColor() != CommonStrings::None && PoShow)
93
                {
94
                        p->setupPolygon(&PoLine, false);
95
                        p->strokePath();
96
                }
3614 cbradney 97
        }
5184 avox 98
        if (itemText.length() != 0)
5691 avox 99
                CurX += itemText.charStyle(0).fontSize() * itemText.charStyle(0).tracking() / 10000.0;
3614 cbradney 100
        segLen = PoLine.lenPathSeg(seg);
5184 avox 101
#ifndef NLS_PROTO
102
        for (a = 0; a < itemText.length(); ++a)
3614 cbradney 103
        {
104
                CurY = 0;
5721 avox 105
                hl = itemText.item(a);
106
                chstr = hl->ch;
107
                if ((chstr == QChar(30)) || (chstr == QChar(13)) || (chstr == QChar(9)) || (chstr == QChar(28)))
3614 cbradney 108
                        continue;
5691 avox 109
                chs = hl->fontSize();
5721 avox 110
                SetZeichAttr(*hl, &chs, &chstr);
111
                if (chstr == QChar(29))
112
                        chstr2 = " ";
113
                else if (chstr == QChar(24))
114
                        chstr2 = "-";
3614 cbradney 115
                else
5721 avox 116
                        chstr2 = chstr;
117
                if (a < itemText.length()-1)
3614 cbradney 118
                {
5721 avox 119
                        if (itemText.text(a+1) == QChar(29))
120
                                chstr3 = " ";
121
                        else if (itemText.text(a+1) == QChar(24))
122
                                chstr3 = "-";
3614 cbradney 123
                        else
5721 avox 124
                                chstr3 = itemText.text(a+1, 1);
125
                        wide = Cwidth(m_Doc, hl->font(), chstr2, chs, chstr3);
3614 cbradney 126
                }
127
                else
5721 avox 128
                        wide = Cwidth(m_Doc, hl->font(), chstr2, chs);
5691 avox 129
                wide = wide * (hl->scaleH() / 1000.0);
3614 cbradney 130
                dx = wide / 2.0;
131
                CurX += dx;
132
                ext = false;
133
                while ( (seg < PoLine.size()-3) && (CurX > fsx + segLen))
134
                {
135
                        fsx += segLen;
136
                        seg += 4;
137
                        if (seg > PoLine.size()-3)
138
                                break;
139
                        segLen = PoLine.lenPathSeg(seg);
140
                        ext = true;
141
                }
142
                if (seg > PoLine.size()-3)
143
                        break;
144
                if (CurX > fsx + segLen)
145
                        break;
146
                if (ext)
147
                {
148
                        sp = 0;
149
                        distCurX = PoLine.lenPathDist(seg, 0, sp);
150
                        while (distCurX <= ((CurX - oCurX) - (fsx - oCurX)))
151
                        {
152
                                sp += 0.001;
153
                                distCurX = PoLine.lenPathDist(seg, 0, sp);
154
                        }
155
                        PoLine.pointTangentNormalAt(seg, sp, &point, &tangent, &normal );
156
                        CurX = (CurX - (CurX - fsx)) + distCurX;
157
                        oldSp = sp;
158
                        ext = false;
159
                }
160
                else
161
                {
162
                        if( seg < PoLine.size()-3 )
163
                        {
164
                                if (CurX > fsx + segLen)
165
                                        break;
166
                                distCurX = PoLine.lenPathDist(seg, oldSp, sp);
167
                                while (distCurX <= (CurX - oCurX))
168
                                {
169
                                        sp += 0.001;
170
                                        if (sp >= 1.0)
171
                                        {
172
                                                sp = 0.9999;
173
                                                break;
174
                                        }
175
                                        distCurX = PoLine.lenPathDist(seg, oldSp, sp);
176
                                }
177
                                PoLine.pointTangentNormalAt(seg, sp, &point, &tangent, &normal );
178
                                CurX = oCurX + distCurX;
179
                                oldSp = sp;
180
                        }
181
                        else
182
                                break;
183
                }
5691 avox 184
                hl->glyph.xoffset = point.x();
185
                hl->glyph.yoffset = point.y();
3614 cbradney 186
                hl->PtransX = tangent.x();
187
                hl->PtransY = tangent.y();
188
                hl->PRot = dx;
189
                QWMatrix trafo = QWMatrix( 1, 0, 0, -1, -dx*sc, 0 );
190
                trafo *= QWMatrix( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x()*sc, point.y()*sc );
191
                QWMatrix sca = p->worldMatrix();
192
                trafo *= sca;
193
                p->save();
194
                QWMatrix savWM = p->worldMatrix();
195
                p->setWorldMatrix(trafo);
196
                Zli = new ZZ;
5721 avox 197
                Zli->Zeich = chstr;
5691 avox 198
                if (hl->fillColor() != CommonStrings::None)
3614 cbradney 199
                {
200
                        QColor tmp;
5691 avox 201
                        SetFarbe(&tmp, hl->fillColor(), hl->fillShade());
3614 cbradney 202
                        p->setBrush(tmp);
203
                }
5691 avox 204
                if (hl->strokeColor() != CommonStrings::None)
3614 cbradney 205
                {
206
                        QColor tmp;
5691 avox 207
                        SetFarbe(&tmp, hl->strokeColor(), hl->strokeShade());
3614 cbradney 208
                        p->setPen(tmp, 1, SolidLine, FlatCap, MiterJoin);
209
                }
5691 avox 210
                Zli->Farb = hl->fillColor();
211
                Zli->Farb2 = hl->strokeColor();
212
                Zli->shade = hl->fillShade();
213
                Zli->shade2 = hl->strokeShade();
3614 cbradney 214
                Zli->xco = 0;
215
                Zli->yco = BaseOffs;
5721 avox 216
                Zli->Sele = itemText.selected(a);
3614 cbradney 217
                Zli->Siz = chs;
5691 avox 218
                Zli->realSiz = hl->fontSize();
219
                Zli->Style = hl->effects();
220
                Zli->ZFo = hl->font();
3614 cbradney 221
                Zli->wide = wide;
5691 avox 222
                Zli->kern = hl->fontSize() * hl->tracking() / 10000.0;
223
                Zli->scale = hl->scaleH();
224
                Zli->scalev = hl->scaleV();
225
                Zli->base = hl->baselineOffset();
226
                Zli->shadowX = hl->shadowXOffset();
227
                Zli->shadowY = hl->shadowYOffset();
228
                Zli->outline = hl->outlineWidth();
229
                Zli->underpos = hl->underlineOffset();
230
                Zli->underwidth = hl->underlineWidth();
231
                Zli->strikepos = hl->strikethruOffset();
232
                Zli->strikewidth = hl->strikethruWidth();
3614 cbradney 233
                Zli->embedded = 0;
4084 cbradney 234
                if (!m_Doc->RePos)
3614 cbradney 235
                        DrawZeichenS(p, Zli);
236
                delete Zli;
237
                p->setWorldMatrix(savWM);
238
                p->restore();
239
                p->setZoomFactor(sc);
240
                MaxChars = a+1;
241
                oCurX = CurX;
242
                CurX -= dx;
5691 avox 243
                CurX += wide+hl->fontSize() * hl->tracking() / 10000.0;
3614 cbradney 244
                first = false;
245
        }
5184 avox 246
#endif
3614 cbradney 247
}