Subversion Repositories Scribus

Rev

Rev 8437 | 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"
5184 avox 29
#include "text/nlsconfig.h"
5674 fschmid 30
#include "util.h"
2111 cbradney 31
 
6715 cbradney 32
bool DocumentChecker::checkDocument(ScribusDoc *currDoc)
2111 cbradney 33
{
34
        PageItem* currItem;
5721 avox 35
        QString chstr;
2111 cbradney 36
        struct checkerPrefs checkerSettings;
37
        checkerSettings.ignoreErrors = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreErrors;
38
        checkerSettings.autoCheck = currDoc->checkerProfiles[currDoc->curCheckProfile].autoCheck;
39
        checkerSettings.checkGlyphs = currDoc->checkerProfiles[currDoc->curCheckProfile].checkGlyphs;
40
        checkerSettings.checkOrphans = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOrphans;
41
        checkerSettings.checkOverflow = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOverflow;
42
        checkerSettings.checkPictures = currDoc->checkerProfiles[currDoc->curCheckProfile].checkPictures;
43
        checkerSettings.checkResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].checkResolution;
44
        checkerSettings.checkTransparency = currDoc->checkerProfiles[currDoc->curCheckProfile].checkTransparency;
45
        checkerSettings.minResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].minResolution;
5239 fschmid 46
        checkerSettings.maxResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].maxResolution;
2111 cbradney 47
        checkerSettings.checkAnnotations = currDoc->checkerProfiles[currDoc->curCheckProfile].checkAnnotations;
48
        checkerSettings.checkRasterPDF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkRasterPDF;
5270 subik 49
        checkerSettings.checkForGIF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkForGIF;
6619 fschmid 50
        checkerSettings.ignoreOffLayers = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreOffLayers;
2111 cbradney 51
        currDoc->docItemErrors.clear();
52
        currDoc->masterItemErrors.clear();
5674 fschmid 53
        currDoc->docLayerErrors.clear();
2111 cbradney 54
        errorCodes itemError;
5674 fschmid 55
        errorCodes layerError;
56
        int Lnr;
57
        struct Layer ll;
58
        ll.LNr = 0;
59
        Lnr = 0;
60
        uint layerCount= currDoc->layerCount();
61
        for (uint la = 0; la < layerCount; ++la)
62
        {
63
                layerError.clear();
64
                Level2Layer(currDoc, &ll, Lnr);
6619 fschmid 65
                if ((!ll.isViewable) && (checkerSettings.ignoreOffLayers))
66
                        continue;
67
                if ((!ll.isPrintable) && (checkerSettings.ignoreOffLayers))
68
                        continue;
5674 fschmid 69
                if ((ll.transparency != 1.0) && (checkerSettings.checkTransparency))
70
                        layerError.insert(Transparency, 0);
71
                if ((ll.blendMode != 0) && (checkerSettings.checkTransparency))
72
                        layerError.insert(BlendMode, 1);
73
                Lnr++;
74
                if (layerError.count() != 0)
75
                        currDoc->docLayerErrors.insert(ll.LNr, layerError);
76
        }
2111 cbradney 77
        for (uint d = 0; d < currDoc->MasterItems.count(); ++d)
78
        {
79
                currItem = currDoc->MasterItems.at(d);
4698 cbradney 80
                if (!currItem->printEnabled())
4509 fschmid 81
                        continue;
6619 fschmid 82
                if (!(currDoc->layerPrintable(currItem->LayerNr)) && (checkerSettings.ignoreOffLayers))
83
                        continue;
2111 cbradney 84
                itemError.clear();
4084 cbradney 85
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 86
                        itemError.insert(PDFAnnotField, 0);
5748 fschmid 87
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0) || (currItem->fillBlendmode() != 0) || (currItem->lineBlendmode() != 0)) && (checkerSettings.checkTransparency))
4512 cbradney 88
                        itemError.insert(Transparency, 0);
3866 fschmid 89
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
90
                {
91
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
92
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
93
                        {
94
                                if (colorStops[offset]->opacity != 1.0)
95
                                {
4512 cbradney 96
                                        itemError.insert(Transparency, 0);
3866 fschmid 97
                                        break;
98
                                }
99
                        }
100
                }
2111 cbradney 101
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 102
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 103
                if (currItem->asImageFrame())
2111 cbradney 104
                {
105
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 106
                                itemError.insert(MissingImage, 0);
2111 cbradney 107
                        else
108
                        {
3985 cbradney 109
                                if  (((qRound(72.0 / currItem->imageXScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 110
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 111
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 112
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
113
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
114
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 115
                                QFileInfo fi = QFileInfo(currItem->Pfile);
116
                                QString ext = fi.extension(false).lower();
117
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 118
                                        itemError.insert(PlacedPDF, 0);
5269 subik 119
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
120
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 121
                        }
122
                }
3625 avox 123
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 124
                {
5184 avox 125
#ifndef NLS_PROTO
8437 fschmid 126
                        if ( currItem->frameOverflows() && (checkerSettings.checkOverflow) && (!((currItem->isAnnotation()) && ((currItem->annotation().Type() == 5) || (currItem->annotation().Type() == 6)))))
4512 cbradney 127
                                itemError.insert(TextOverflow, 0);
8474 fschmid 128
                        if (currItem->isAnnotation())
129
                        {
130
                                ScFace::FontFormat fformat = currItem->itemText.defaultStyle().charStyle().font().format();
131
                                if (!(fformat == ScFace::SFNT || fformat == ScFace::TTCF))
132
                                        itemError.insert(WrongFontInAnnotation, 0);
133
                        }
5721 avox 134
                        for (int e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 135
                        {
5184 avox 136
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 137
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 138
                                        continue;
5691 avox 139
                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2111 cbradney 140
                                {
5721 avox 141
                                        chstr = currItem->itemText.text(e);
142
                                        if (chstr.upper() != currItem->itemText.text(e))
143
                                                chstr = chstr.upper();
144
                                        chr = chstr[0].unicode();
2111 cbradney 145
                                }
2285 fschmid 146
                                if (chr == 9)
147
                                {
5721 avox 148
                                        for (uint t1 = 0; t1 < currItem->itemText.paragraphStyle(e).tabValues().count(); t1++)
2285 fschmid 149
                                        {
5721 avox 150
                                                if (currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar.isNull())
2285 fschmid 151
                                                        continue;
5721 avox 152
                                                chstr = QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar);
5691 avox 153
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 154
                                                {
5721 avox 155
                                                        if (chstr.upper() != QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar))
156
                                                                chstr = chstr.upper();
2285 fschmid 157
                                                }
5721 avox 158
                                                chr = chstr[0].unicode();
5980 avox 159
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 160
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 161
                                        }
7994 avox 162
                                        for (uint t1 = 0; t1 < currItem->itemText.defaultStyle().tabValues().count(); t1++)
2285 fschmid 163
                                        {
7994 avox 164
                                                if (currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar.isNull())
2285 fschmid 165
                                                        continue;
7994 avox 166
                                                chstr = QString(currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar);
5691 avox 167
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 168
                                                {
7994 avox 169
                                                        if (chstr.upper() != QString(currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar))
5721 avox 170
                                                                chstr = chstr.upper();
2285 fschmid 171
                                                }
5721 avox 172
                                                chr = chstr[0].unicode();
5980 avox 173
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 174
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 175
                                        }
176
                                        continue;
177
                                }
2111 cbradney 178
                                if (chr == 30)
179
                                {
180
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
181
                                        {
5980 avox 182
                                                if ((!currItem->itemText.charStyle(e).font().canRender(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 183
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 184
                                        }
185
                                        continue;
186
                                }
5980 avox 187
                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 188
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 189
                        }
5184 avox 190
#endif
2111 cbradney 191
                }
192
                if (itemError.count() != 0)
193
                        currDoc->masterItemErrors.insert(currItem->ItemNr, itemError);
194
        }
195
        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
196
        {
197
                currItem = currDoc->DocItems.at(d);
4698 cbradney 198
                if (!currItem->printEnabled())
4509 fschmid 199
                        continue;
6619 fschmid 200
                if (!(currDoc->layerPrintable(currItem->LayerNr)) && (checkerSettings.ignoreOffLayers))
201
                        continue;
2111 cbradney 202
                itemError.clear();
5748 fschmid 203
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0) || (currItem->fillBlendmode() != 0) || (currItem->lineBlendmode() != 0)) && (checkerSettings.checkTransparency))
4512 cbradney 204
                        itemError.insert(Transparency, 0);
3866 fschmid 205
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
206
                {
207
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
208
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
209
                        {
210
                                if (colorStops[offset]->opacity != 1.0)
211
                                {
4512 cbradney 212
                                        itemError.insert(Transparency, 0);
3866 fschmid 213
                                        break;
214
                                }
215
                        }
216
                }
4084 cbradney 217
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 218
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 219
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 220
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 221
                if (currItem->asImageFrame())
2111 cbradney 222
                {
223
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 224
                                itemError.insert(MissingImage, 0);
2111 cbradney 225
                        else
226
                        {
3985 cbradney 227
                                if  (((qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 228
                                           && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 229
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 230
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
231
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
232
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 233
                                QFileInfo fi = QFileInfo(currItem->Pfile);
234
                                QString ext = fi.extension(false).lower();
235
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 236
                                        itemError.insert(PlacedPDF, 0);
5269 subik 237
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
238
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 239
                        }
240
                }
3625 avox 241
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 242
                {
5184 avox 243
#ifndef NLS_PROTO
8437 fschmid 244
                        if ( currItem->frameOverflows() && (checkerSettings.checkOverflow) && (!((currItem->isAnnotation()) && ((currItem->annotation().Type() == 5) || (currItem->annotation().Type() == 6)))))
4512 cbradney 245
                                itemError.insert(TextOverflow, 0);
8474 fschmid 246
                        if (currItem->isAnnotation())
247
                        {
248
                                ScFace::FontFormat fformat = currItem->itemText.defaultStyle().charStyle().font().format();
249
                                if (!(fformat == ScFace::SFNT || fformat == ScFace::TTCF))
250
                                        itemError.insert(WrongFontInAnnotation, 0);
251
                        }
5753 jghali 252
                        for (int e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 253
                        {
5184 avox 254
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 255
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 256
                                        continue;
5691 avox 257
                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2111 cbradney 258
                                {
5721 avox 259
                                        chstr = currItem->itemText.text(e,1);
260
                                        if (chstr.upper() != currItem->itemText.text(e,1))
261
                                                chstr = chstr.upper();
262
                                        chr = chstr[0].unicode();
2111 cbradney 263
                                }
2285 fschmid 264
                                if (chr == 9)
265
                                {
5721 avox 266
                                        for (uint t1 = 0; t1 < currItem->itemText.paragraphStyle(e).tabValues().count(); t1++)
2285 fschmid 267
                                        {
5721 avox 268
                                                if (currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar.isNull())
2285 fschmid 269
                                                        continue;
5721 avox 270
                                                chstr = QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar);
5691 avox 271
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 272
                                                {
5721 avox 273
                                                        if (chstr.upper() != QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar))
274
                                                                chstr = chstr.upper();
2285 fschmid 275
                                                }
5721 avox 276
                                                chr = chstr[0].unicode();
5980 avox 277
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 278
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 279
                                        }
7994 avox 280
                                        for (uint t1 = 0; t1 < currItem->itemText.defaultStyle().tabValues().count(); t1++)
2285 fschmid 281
                                        {
7994 avox 282
                                                if (currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar.isNull())
2285 fschmid 283
                                                        continue;
7994 avox 284
                                                chstr = QString(currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar);
5691 avox 285
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 286
                                                {
7994 avox 287
                                                        if (chstr.upper() != QString(currItem->itemText.defaultStyle().tabValues()[t1].tabFillChar))
5721 avox 288
                                                                chstr = chstr.upper();
2285 fschmid 289
                                                }
5721 avox 290
                                                chr = chstr[0].unicode();
5980 avox 291
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 292
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 293
                                        }
294
                                        continue;
295
                                }
2111 cbradney 296
                                if (chr == 30)
297
                                {
298
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
299
                                        {
5980 avox 300
                                                if ((!currItem->itemText.charStyle(e).font().canRender(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 301
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 302
                                        }
303
                                        continue;
304
                                }
5980 avox 305
                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 306
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 307
                        }
5184 avox 308
#endif
2111 cbradney 309
                }
310
                if (itemError.count() != 0)
311
                        currDoc->docItemErrors.insert(currItem->ItemNr, itemError);
312
        }
6715 cbradney 313
 
314
        return ((currDoc->docItemErrors.count() != 0) || (currDoc->masterItemErrors.count() != 0) || (currDoc->docLayerErrors.count() != 0));
2111 cbradney 315
}