Changeset 561 for trunk/src/plugins/imageformats/tiff
- Timestamp:
- Feb 11, 2010, 11:19:06 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/vendor/nokia/qt/4.6.1 merged eligible /branches/vendor/nokia/qt/current merged eligible /branches/vendor/trolltech/qt/current 3-149
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
trunk/src/plugins/imageformats/tiff/main.cpp
r2 r561 2 2 ** 3 3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 4 ** Contact: Qt Software Information (qt-info@nokia.com) 4 ** All rights reserved. 5 ** Contact: Nokia Corporation (qt-info@nokia.com) 5 6 ** 6 7 ** This file is part of the plugins of the Qt Toolkit. … … 21 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 22 23 ** 23 ** In addition, as a special exception, Nokia gives you certain 24 ** additional rights. These rights are described in the Nokia Qt LGPL 25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this 26 ** package. 24 ** In addition, as a special exception, Nokia gives you certain additional 25 ** rights. These rights are described in the Nokia Qt LGPL Exception 26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 27 27 ** 28 28 ** GNU General Public License Usage … … 34 34 ** met: http://www.gnu.org/copyleft/gpl.html. 35 35 ** 36 ** If you are unsure which license is appropriate for your use, please37 ** contact the sales department at qt-sales@nokia.com.36 ** If you have questions regarding the use of this file, please contact 37 ** Nokia at qt-info@nokia.com. 38 38 ** $QT_END_LICENSE$ 39 39 ** -
trunk/src/plugins/imageformats/tiff/qtiffhandler.cpp
r2 r561 2 2 ** 3 3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 4 ** Contact: Qt Software Information (qt-info@nokia.com) 4 ** All rights reserved. 5 ** Contact: Nokia Corporation (qt-info@nokia.com) 5 6 ** 6 7 ** This file is part of the plugins of the Qt Toolkit. … … 21 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 22 23 ** 23 ** In addition, as a special exception, Nokia gives you certain 24 ** additional rights. These rights are described in the Nokia Qt LGPL 25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this 26 ** package. 24 ** In addition, as a special exception, Nokia gives you certain additional 25 ** rights. These rights are described in the Nokia Qt LGPL Exception 26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 27 27 ** 28 28 ** GNU General Public License Usage … … 34 34 ** met: http://www.gnu.org/copyleft/gpl.html. 35 35 ** 36 ** If you are unsure which license is appropriate for your use, please37 ** contact the sales department at qt-sales@nokia.com.36 ** If you have questions regarding the use of this file, please contact 37 ** Nokia at qt-info@nokia.com. 38 38 ** $QT_END_LICENSE$ 39 39 ** … … 99 99 } 100 100 101 // for 32 bits images 102 inline void rotate_right_mirror_horizontal(QImage *const image)// rotate right->mirrored horizontal 103 { 104 const int height = image->height(); 105 const int width = image->width(); 106 QImage generated(/* width = */ height, /* height = */ width, image->format()); 107 const uint32 *originalPixel = reinterpret_cast<const uint32*>(image->bits()); 108 uint32 *const generatedPixels = reinterpret_cast<uint32*>(generated.bits()); 109 for (int row=0; row < height; ++row) { 110 for (int col=0; col < width; ++col) { 111 int idx = col * height + row; 112 generatedPixels[idx] = *originalPixel; 113 ++originalPixel; 114 } 115 } 116 *image = generated; 117 } 118 119 inline void rotate_right_mirror_vertical(QImage *const image) // rotate right->mirrored vertical 120 { 121 const int height = image->height(); 122 const int width = image->width(); 123 QImage generated(/* width = */ height, /* height = */ width, image->format()); 124 const int lastCol = width - 1; 125 const int lastRow = height - 1; 126 const uint32 *pixel = reinterpret_cast<const uint32*>(image->bits()); 127 uint32 *const generatedBits = reinterpret_cast<uint32*>(generated.bits()); 128 for (int row=0; row < height; ++row) { 129 for (int col=0; col < width; ++col) { 130 int idx = (lastCol - col) * height + (lastRow - row); 131 generatedBits[idx] = *pixel; 132 ++pixel; 133 } 134 } 135 *image = generated; 136 } 137 101 138 QTiffHandler::QTiffHandler() : QImageIOHandler() 102 139 { … … 132 169 return false; 133 170 134 TIFF *tiff = TIFFClientOpen("foo", 135 "r", 136 this, 137 qtiffReadProc, 138 qtiffWriteProc, 139 qtiffSeekProc, 140 qtiffCloseProc, 141 qtiffSizeProc, 142 qtiffMapProc, 143 qtiffUnmapProc); 144 145 if (tiff) { 146 uint32 width = 0; 147 uint32 height = 0; 148 TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width); 149 TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height); 150 if (image->size() != QSize(width, height) || image->format() != QImage::Format_ARGB32) 151 *image = QImage(width, height, QImage::Format_ARGB32); 171 TIFF *const tiff = TIFFClientOpen("foo", 172 "r", 173 this, 174 qtiffReadProc, 175 qtiffWriteProc, 176 qtiffSeekProc, 177 qtiffCloseProc, 178 qtiffSizeProc, 179 qtiffMapProc, 180 qtiffUnmapProc); 181 182 if (!tiff) { 183 return false; 184 } 185 uint32 width; 186 uint32 height; 187 uint16 photometric; 188 if (!TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width) 189 || !TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height) 190 || !TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric)) { 191 TIFFClose(tiff); 192 return false; 193 } 194 195 // BitsPerSample defaults to 1 according to the TIFF spec. 196 uint16 bitPerSample; 197 if (!TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitPerSample)) 198 bitPerSample = 1; 199 200 bool grayscale = photometric == PHOTOMETRIC_MINISBLACK || photometric == PHOTOMETRIC_MINISWHITE; 201 if (grayscale && bitPerSample == 1) { 202 if (image->size() != QSize(width, height) || image->format() != QImage::Format_Mono) 203 *image = QImage(width, height, QImage::Format_Mono); 204 QVector<QRgb> colortable(2); 205 if (photometric == PHOTOMETRIC_MINISBLACK) { 206 colortable[0] = 0xff000000; 207 colortable[1] = 0xffffffff; 208 } else { 209 colortable[0] = 0xffffffff; 210 colortable[1] = 0xff000000; 211 } 212 image->setColorTable(colortable); 213 152 214 if (!image->isNull()) { 153 if (TIFFReadRGBAImageOriented(tiff, width, height, reinterpret_cast<uint32 *>(image->bits()), ORIENTATION_TOPLEFT, 0)) { 154 uint16 resUnit = RESUNIT_NONE; 155 float resX = 0; 156 float resY = 0; 157 TIFFGetField(tiff, TIFFTAG_RESOLUTIONUNIT, &resUnit); 158 TIFFGetField(tiff, TIFFTAG_XRESOLUTION, &resX); 159 TIFFGetField(tiff, TIFFTAG_YRESOLUTION, &resY); 160 switch(resUnit) { 161 case RESUNIT_CENTIMETER: 162 image->setDotsPerMeterX(qRound(resX * 100)); 163 image->setDotsPerMeterY(qRound(resY * 100)); 164 break; 165 case RESUNIT_INCH: 166 image->setDotsPerMeterX(qRound(resX * (100 / 2.54))); 167 image->setDotsPerMeterY(qRound(resY * (100 / 2.54))); 168 break; 169 default: 170 // do nothing as defaults have already 171 // been set within the QImage class 172 break; 173 } 174 for (uint32 y=0; y<height; ++y) 175 convert32BitOrder(image->scanLine(y), width); 176 } else { 177 *image = QImage(); 178 } 179 } 215 for (uint32 y=0; y<height; ++y) { 216 if (TIFFReadScanline(tiff, image->scanLine(y), y, 0) < 0) { 217 TIFFClose(tiff); 218 return false; 219 } 220 } 221 } 222 } else { 223 if ((grayscale || photometric == PHOTOMETRIC_PALETTE) && bitPerSample == 8) { 224 if (image->size() != QSize(width, height) || image->format() != QImage::Format_Indexed8) 225 *image = QImage(width, height, QImage::Format_Indexed8); 226 if (!image->isNull()) { 227 const uint16 tableSize = 256; 228 QVector<QRgb> qtColorTable(tableSize); 229 if (grayscale) { 230 for (int i = 0; i<tableSize; ++i) { 231 const int c = (photometric == PHOTOMETRIC_MINISBLACK) ? i : (255 - i); 232 qtColorTable[i] = qRgb(c, c, c); 233 } 234 } else { 235 // create the color table 236 uint16 *redTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); 237 uint16 *greenTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); 238 uint16 *blueTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); 239 if (!redTable || !greenTable || !blueTable) { 240 TIFFClose(tiff); 241 return false; 242 } 243 if (!TIFFGetField(tiff, TIFFTAG_COLORMAP, &redTable, &greenTable, &blueTable)) { 244 TIFFClose(tiff); 245 return false; 246 } 247 248 for (int i = 0; i<tableSize ;++i) { 249 const int red = redTable[i] / 257; 250 const int green = greenTable[i] / 257; 251 const int blue = blueTable[i] / 257; 252 qtColorTable[i] = qRgb(red, green, blue); 253 } 254 } 255 256 image->setColorTable(qtColorTable); 257 for (uint32 y=0; y<height; ++y) { 258 if (TIFFReadScanline(tiff, image->scanLine(y), y, 0) < 0) { 259 TIFFClose(tiff); 260 return false; 261 } 262 } 263 264 // free redTable, greenTable and greenTable done by libtiff 265 } 266 } else { 267 if (image->size() != QSize(width, height) || image->format() != QImage::Format_ARGB32) 268 *image = QImage(width, height, QImage::Format_ARGB32); 269 if (!image->isNull()) { 270 const int stopOnError = 1; 271 if (TIFFReadRGBAImageOriented(tiff, width, height, reinterpret_cast<uint32 *>(image->bits()), ORIENTATION_TOPLEFT, stopOnError)) { 272 for (uint32 y=0; y<height; ++y) 273 convert32BitOrder(image->scanLine(y), width); 274 } else { 275 TIFFClose(tiff); 276 return false; 277 } 278 } 279 } 280 } 281 282 if (image->isNull()) { 180 283 TIFFClose(tiff); 181 } 182 183 if (image->isNull()) 184 return false; 185 284 return false; 285 } 286 287 float resX = 0; 288 float resY = 0; 289 uint16 resUnit = RESUNIT_NONE; 290 if (TIFFGetField(tiff, TIFFTAG_RESOLUTIONUNIT, &resUnit) 291 && TIFFGetField(tiff, TIFFTAG_XRESOLUTION, &resX) 292 && TIFFGetField(tiff, TIFFTAG_YRESOLUTION, &resY)) { 293 294 switch(resUnit) { 295 case RESUNIT_CENTIMETER: 296 image->setDotsPerMeterX(qRound(resX * 100)); 297 image->setDotsPerMeterY(qRound(resY * 100)); 298 break; 299 case RESUNIT_INCH: 300 image->setDotsPerMeterX(qRound(resX * (100 / 2.54))); 301 image->setDotsPerMeterY(qRound(resY * (100 / 2.54))); 302 break; 303 default: 304 // do nothing as defaults have already 305 // been set within the QImage class 306 break; 307 } 308 } 309 310 // rotate the image if the orientation is defined in the file 311 uint16 orientationTag; 312 if (TIFFGetField(tiff, TIFFTAG_ORIENTATION, &orientationTag)) { 313 if (image->format() == QImage::Format_ARGB32) { 314 // TIFFReadRGBAImageOriented() flip the image but does not rotate them 315 switch (orientationTag) { 316 case 5: 317 rotate_right_mirror_horizontal(image); 318 break; 319 case 6: 320 rotate_right_mirror_vertical(image); 321 break; 322 case 7: 323 rotate_right_mirror_horizontal(image); 324 break; 325 case 8: 326 rotate_right_mirror_vertical(image); 327 break; 328 } 329 } else { 330 switch (orientationTag) { 331 case 1: // default orientation 332 break; 333 case 2: // mirror horizontal 334 *image = image->mirrored(true, false); 335 break; 336 case 3: // mirror both 337 *image = image->mirrored(true, true); 338 break; 339 case 4: // mirror vertical 340 *image = image->mirrored(false, true); 341 break; 342 case 5: // rotate right mirror horizontal 343 { 344 QMatrix transformation; 345 transformation.rotate(90); 346 *image = image->transformed(transformation); 347 *image = image->mirrored(true, false); 348 break; 349 } 350 case 6: // rotate right 351 { 352 QMatrix transformation; 353 transformation.rotate(90); 354 *image = image->transformed(transformation); 355 break; 356 } 357 case 7: // rotate right, mirror vertical 358 { 359 QMatrix transformation; 360 transformation.rotate(90); 361 *image = image->transformed(transformation); 362 *image = image->mirrored(false, true); 363 break; 364 } 365 case 8: // rotate left 366 { 367 QMatrix transformation; 368 transformation.rotate(270); 369 *image = image->transformed(transformation); 370 break; 371 } 372 } 373 } 374 } 375 376 377 TIFFClose(tiff); 186 378 return true; 187 379 } 188 380 381 static bool checkGrayscale(const QVector<QRgb> &colorTable) 382 { 383 if (colorTable.size() != 256) 384 return false; 385 386 const bool increasing = (colorTable.at(0) == 0xff000000); 387 for (int i = 0; i < 256; ++i) { 388 if (increasing && colorTable.at(i) != qRgb(i, i, i) 389 || !increasing && colorTable.at(i) != qRgb(255 - i, 255 - i, 255 - i)) 390 return false; 391 } 392 return true; 393 } 394 189 395 bool QTiffHandler::write(const QImage &image) 190 396 { … … 192 398 return false; 193 399 194 TIFF *tiff = TIFFClientOpen("foo", 195 "w", 196 this, 197 qtiffReadProc, 198 qtiffWriteProc, 199 qtiffSeekProc, 200 qtiffCloseProc, 201 qtiffSizeProc, 202 qtiffMapProc, 203 qtiffUnmapProc); 204 205 if (tiff) { 206 int width = image.width(); 207 int height = image.height(); 208 int depth = 32; 209 210 if (!TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, width) 211 || !TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, height) 212 || !TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB) 213 || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW) 214 || !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, depth/8) 215 || !TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG) 216 || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8)) { 400 TIFF *const tiff = TIFFClientOpen("foo", 401 "w", 402 this, 403 qtiffReadProc, 404 qtiffWriteProc, 405 qtiffSeekProc, 406 qtiffCloseProc, 407 qtiffSizeProc, 408 qtiffMapProc, 409 qtiffUnmapProc); 410 if (!tiff) 411 return false; 412 413 const int width = image.width(); 414 const int height = image.height(); 415 416 if (!TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, width) 417 || !TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, height) 418 || !TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) { 419 TIFFClose(tiff); 420 return false; 421 } 422 423 // set the resolution 424 bool resolutionSet = false; 425 const int dotPerMeterX = image.dotsPerMeterX(); 426 const int dotPerMeterY = image.dotsPerMeterY(); 427 if ((dotPerMeterX % 100) == 0 428 && (dotPerMeterY % 100) == 0) { 429 resolutionSet = TIFFSetField(tiff, TIFFTAG_RESOLUTIONUNIT, RESUNIT_CENTIMETER) 430 && TIFFSetField(tiff, TIFFTAG_XRESOLUTION, dotPerMeterX/100.0) 431 && TIFFSetField(tiff, TIFFTAG_YRESOLUTION, dotPerMeterY/100.0); 432 } else { 433 resolutionSet = TIFFSetField(tiff, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH) 434 && TIFFSetField(tiff, TIFFTAG_XRESOLUTION, static_cast<float>(image.logicalDpiX())) 435 && TIFFSetField(tiff, TIFFTAG_YRESOLUTION, static_cast<float>(image.logicalDpiY())); 436 } 437 if (!resolutionSet) { 438 TIFFClose(tiff); 439 return false; 440 } 441 442 // configure image depth 443 const QImage::Format format = image.format(); 444 if (format == QImage::Format_Mono || format == QImage::Format_MonoLSB) { 445 uint16 photometric = PHOTOMETRIC_MINISBLACK; 446 if (image.colorTable().at(0) == 0xffffffff) 447 photometric = PHOTOMETRIC_MINISWHITE; 448 if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, photometric) 449 || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_CCITTRLE) 450 || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 1)) { 217 451 TIFFClose(tiff); 218 452 return false; 219 453 } 220 454 455 // try to do the conversion in chunks no greater than 16 MB 456 int chunks = (width * height / (1024 * 1024 * 16)) + 1; 457 int chunkHeight = qMax(height / chunks, 1); 458 459 int y = 0; 460 while (y < height) { 461 QImage chunk = image.copy(0, y, width, qMin(chunkHeight, height - y)).convertToFormat(QImage::Format_Mono); 462 463 int chunkStart = y; 464 int chunkEnd = y + chunk.height(); 465 while (y < chunkEnd) { 466 if (TIFFWriteScanline(tiff, reinterpret_cast<uint32 *>(chunk.scanLine(y - chunkStart)), y) != 1) { 467 TIFFClose(tiff); 468 return false; 469 } 470 ++y; 471 } 472 } 473 TIFFClose(tiff); 474 } else if (format == QImage::Format_Indexed8) { 475 const QVector<QRgb> colorTable = image.colorTable(); 476 bool isGrayscale = checkGrayscale(colorTable); 477 if (isGrayscale) { 478 uint16 photometric = PHOTOMETRIC_MINISBLACK; 479 if (image.colorTable().at(0) == 0xffffffff) 480 photometric = PHOTOMETRIC_MINISWHITE; 481 if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, photometric) 482 || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_PACKBITS) 483 || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8)) { 484 TIFFClose(tiff); 485 return false; 486 } 487 } else { 488 if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE) 489 || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_PACKBITS) 490 || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8)) { 491 TIFFClose(tiff); 492 return false; 493 } 494 //// write the color table 495 // allocate the color tables 496 uint16 *redTable = static_cast<uint16 *>(qMalloc(256 * sizeof(uint16))); 497 uint16 *greenTable = static_cast<uint16 *>(qMalloc(256 * sizeof(uint16))); 498 uint16 *blueTable = static_cast<uint16 *>(qMalloc(256 * sizeof(uint16))); 499 if (!redTable || !greenTable || !blueTable) { 500 TIFFClose(tiff); 501 return false; 502 } 503 504 // set the color table 505 const int tableSize = colorTable.size(); 506 Q_ASSERT(tableSize <= 256); 507 for (int i = 0; i<tableSize; ++i) { 508 const QRgb color = colorTable.at(i); 509 redTable[i] = qRed(color) * 257; 510 greenTable[i] = qGreen(color) * 257; 511 blueTable[i] = qBlue(color) * 257; 512 } 513 514 const bool setColorTableSuccess = TIFFSetField(tiff, TIFFTAG_COLORMAP, redTable, greenTable, blueTable); 515 516 qFree(redTable); 517 qFree(greenTable); 518 qFree(blueTable); 519 520 if (!setColorTableSuccess) { 521 TIFFClose(tiff); 522 return false; 523 } 524 } 525 526 //// write the data 527 // try to do the conversion in chunks no greater than 16 MB 528 int chunks = (width * height/ (1024 * 1024 * 16)) + 1; 529 int chunkHeight = qMax(height / chunks, 1); 530 531 int y = 0; 532 while (y < height) { 533 QImage chunk = image.copy(0, y, width, qMin(chunkHeight, height - y)); 534 535 int chunkStart = y; 536 int chunkEnd = y + chunk.height(); 537 while (y < chunkEnd) { 538 if (TIFFWriteScanline(tiff, reinterpret_cast<uint32 *>(chunk.scanLine(y - chunkStart)), y) != 1) { 539 TIFFClose(tiff); 540 return false; 541 } 542 ++y; 543 } 544 } 545 TIFFClose(tiff); 546 547 } else { 548 if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB) 549 || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW) 550 || !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4) 551 || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8)) { 552 TIFFClose(tiff); 553 return false; 554 } 221 555 // try to do the ARGB32 conversion in chunks no greater than 16 MB 222 556 int chunks = (width * height * 4 / (1024 * 1024 * 16)) + 1; … … 243 577 } 244 578 TIFFClose(tiff); 245 } else { 246 return false; 247 } 579 } 580 248 581 return true; 249 582 } -
trunk/src/plugins/imageformats/tiff/qtiffhandler.h
r2 r561 2 2 ** 3 3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 4 ** Contact: Qt Software Information (qt-info@nokia.com) 4 ** All rights reserved. 5 ** Contact: Nokia Corporation (qt-info@nokia.com) 5 6 ** 6 7 ** This file is part of the plugins of the Qt Toolkit. … … 21 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 22 23 ** 23 ** In addition, as a special exception, Nokia gives you certain 24 ** additional rights. These rights are described in the Nokia Qt LGPL 25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this 26 ** package. 24 ** In addition, as a special exception, Nokia gives you certain additional 25 ** rights. These rights are described in the Nokia Qt LGPL Exception 26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 27 27 ** 28 28 ** GNU General Public License Usage … … 34 34 ** met: http://www.gnu.org/copyleft/gpl.html. 35 35 ** 36 ** If you are unsure which license is appropriate for your use, please37 ** contact the sales department at qt-sales@nokia.com.36 ** If you have questions regarding the use of this file, please contact 37 ** Nokia at qt-info@nokia.com. 38 38 ** $QT_END_LICENSE$ 39 39 ** -
trunk/src/plugins/imageformats/tiff/tiff.pro
r165 r561 60 60 SOURCES += ../../../corelib/kernel/qfunctions_wince.cpp 61 61 } 62 symbian*: { 63 SOURCES += ../../../3rdparty/libtiff/port/lfind.c 64 } 62 65 } 63 66 … … 72 75 target.path += $$[QT_INSTALL_PLUGINS]/imageformats 73 76 INSTALLS += target 77 78 symbian:TARGET.UID3=0x2001E617
Note:
See TracChangeset
for help on using the changeset viewer.