Subversion Repositories Scribus

Rev

Rev 4512 | Rev 5184 | 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
*/
2111 cbradney 7
/***************************************************************************
8
        begin                : 2005
9
        copyright            : (C) 2005 by Franz Schmid
10
        email                : Franz.Schmid@altmuehlnet.de
11
        copyright            : (C) 2005 by Craig Bradney
12
        email                : cbradney@zip.com.au
13
***************************************************************************/
14
 
15
/***************************************************************************
16
*                                                                         *
4026 craig 17
*   ScMW program is free software; you can redistribute it and/or modify  *
2111 cbradney 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 "documentchecker.h"
25
#include "pageitem.h"
26
#include "scribusstructs.h"
27
#include "scribusdoc.h"
2714 craig 28
#include "page.h"
2111 cbradney 29
 
30
void DocumentChecker::checkDocument(ScribusDoc *currDoc)
31
{
32
        PageItem* currItem;
33
        QString chx;
34
        struct checkerPrefs checkerSettings;
35
        checkerSettings.ignoreErrors = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreErrors;
36
        checkerSettings.autoCheck = currDoc->checkerProfiles[currDoc->curCheckProfile].autoCheck;
37
        checkerSettings.checkGlyphs = currDoc->checkerProfiles[currDoc->curCheckProfile].checkGlyphs;
38
        checkerSettings.checkOrphans = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOrphans;
39
        checkerSettings.checkOverflow = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOverflow;
40
        checkerSettings.checkPictures = currDoc->checkerProfiles[currDoc->curCheckProfile].checkPictures;
41
        checkerSettings.checkResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].checkResolution;
42
        checkerSettings.checkTransparency = currDoc->checkerProfiles[currDoc->curCheckProfile].checkTransparency;
43
        checkerSettings.minResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].minResolution;
44
        checkerSettings.checkAnnotations = currDoc->checkerProfiles[currDoc->curCheckProfile].checkAnnotations;
45
        checkerSettings.checkRasterPDF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkRasterPDF;
46
        currDoc->docItemErrors.clear();
47
        currDoc->masterItemErrors.clear();
48
        errorCodes itemError;
49
        for (uint d = 0; d < currDoc->MasterItems.count(); ++d)
50
        {
51
                currItem = currDoc->MasterItems.at(d);
4698 cbradney 52
                if (!currItem->printEnabled())
4509 fschmid 53
                        continue;
2111 cbradney 54
                itemError.clear();
4084 cbradney 55
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 56
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 57
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 58
                        itemError.insert(Transparency, 0);
3866 fschmid 59
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
60
                {
61
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
62
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
63
                        {
64
                                if (colorStops[offset]->opacity != 1.0)
65
                                {
4512 cbradney 66
                                        itemError.insert(Transparency, 0);
3866 fschmid 67
                                        break;
68
                                }
69
                        }
70
                }
2111 cbradney 71
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 72
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 73
                if (currItem->asImageFrame())
2111 cbradney 74
                {
75
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 76
                                itemError.insert(MissingImage, 0);
2111 cbradney 77
                        else
78
                        {
3985 cbradney 79
                                if  (((qRound(72.0 / currItem->imageXScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 80
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 81
                                        itemError.insert(ImageDPITooLow, 0);
2111 cbradney 82
                                QFileInfo fi = QFileInfo(currItem->Pfile);
83
                                QString ext = fi.extension(false).lower();
84
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 85
                                        itemError.insert(PlacedPDF, 0);
2111 cbradney 86
                        }
87
                }
3625 avox 88
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 89
                {
90
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 91
                                itemError.insert(TextOverflow, 0);
2111 cbradney 92
                        for (uint e = 0; e < currItem->itemText.count(); ++e)
93
                        {
94
                                uint chr = currItem->itemText.at(e)->ch[0].unicode();
2447 fschmid 95
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 96
                                        continue;
2285 fschmid 97
                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
2111 cbradney 98
                                {
99
                                        chx = currItem->itemText.at(e)->ch;
100
                                        if (chx.upper() != currItem->itemText.at(e)->ch)
101
                                                chx = chx.upper();
102
                                        chr = chx[0].unicode();
103
                                }
2285 fschmid 104
                                if (chr == 9)
105
                                {
106
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues.count(); t1++)
107
                                        {
108
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar.isNull())
109
                                                        continue;
110
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar);
111
                                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
112
                                                {
113
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar))
114
                                                                chx = chx.upper();
115
                                                }
116
                                                chr = chx[0].unicode();
117
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 118
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 119
                                        }
120
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
121
                                        {
122
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
123
                                                        continue;
124
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
125
                                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
126
                                                {
127
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
128
                                                                chx = chx.upper();
129
                                                }
130
                                                chr = chx[0].unicode();
131
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 132
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 133
                                        }
134
                                        continue;
135
                                }
2111 cbradney 136
                                if (chr == 30)
137
                                {
138
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
139
                                        {
140
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 141
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 142
                                        }
143
                                        continue;
144
                                }
145
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 146
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 147
                        }
148
                }
149
                if (itemError.count() != 0)
150
                        currDoc->masterItemErrors.insert(currItem->ItemNr, itemError);
151
        }
152
        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
153
        {
154
                currItem = currDoc->DocItems.at(d);
4698 cbradney 155
                if (!currItem->printEnabled())
4509 fschmid 156
                        continue;
2111 cbradney 157
                itemError.clear();
158
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 159
                        itemError.insert(Transparency, 0);
3866 fschmid 160
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
161
                {
162
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
163
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
164
                        {
165
                                if (colorStops[offset]->opacity != 1.0)
166
                                {
4512 cbradney 167
                                        itemError.insert(Transparency, 0);
3866 fschmid 168
                                        break;
169
                                }
170
                        }
171
                }
4084 cbradney 172
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 173
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 174
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 175
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 176
                if (currItem->asImageFrame())
2111 cbradney 177
                {
178
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 179
                                itemError.insert(MissingImage, 0);
2111 cbradney 180
                        else
181
                        {
3985 cbradney 182
                                if  (((qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 183
                                           && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 184
                                        itemError.insert(ImageDPITooLow, 0);
2111 cbradney 185
                                QFileInfo fi = QFileInfo(currItem->Pfile);
186
                                QString ext = fi.extension(false).lower();
187
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 188
                                        itemError.insert(PlacedPDF, 0);
2111 cbradney 189
                        }
190
                }
3625 avox 191
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 192
                {
193
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 194
                                itemError.insert(TextOverflow, 0);
2111 cbradney 195
                        for (uint e = 0; e < currItem->itemText.count(); ++e)
196
                        {
197
                                uint chr = currItem->itemText.at(e)->ch[0].unicode();
2447 fschmid 198
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 199
                                        continue;
2285 fschmid 200
                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
2111 cbradney 201
                                {
202
                                        chx = currItem->itemText.at(e)->ch;
203
                                        if (chx.upper() != currItem->itemText.at(e)->ch)
204
                                                chx = chx.upper();
205
                                        chr = chx[0].unicode();
206
                                }
2285 fschmid 207
                                if (chr == 9)
208
                                {
209
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues.count(); t1++)
210
                                        {
211
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar.isNull())
212
                                                        continue;
213
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar);
214
                                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
215
                                                {
216
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].TabValues[t1].tabFillChar))
217
                                                                chx = chx.upper();
218
                                                }
219
                                                chr = chx[0].unicode();
220
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 221
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 222
                                        }
223
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
224
                                        {
225
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
226
                                                        continue;
227
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
228
                                                if ((currItem->itemText.at(e)->cstyle & 64) || (currItem->itemText.at(e)->cstyle & 32))
229
                                                {
230
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
231
                                                                chx = chx.upper();
232
                                                }
233
                                                chr = chx[0].unicode();
234
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 235
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 236
                                        }
237
                                        continue;
238
                                }
2111 cbradney 239
                                if (chr == 30)
240
                                {
241
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
242
                                        {
243
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 244
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 245
                                        }
246
                                        continue;
247
                                }
248
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 249
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 250
                        }
251
                }
252
                if (itemError.count() != 0)
253
                        currDoc->docItemErrors.insert(currItem->ItemNr, itemError);
254
        }
255
}