Subversion Repositories Scribus

Rev

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