r24647 by jghali - #13132: 16bit CMYK tiff image does not show correctly in scribus (and doesn't report why)
scribus-commit
scribus-commit at lists.scribus.net
Sun May 23 20:15:03 UTC 2021
Author: jghali
Date: Sun May 23 20:15:03 2021
New Revision: 24647
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=24647
Log:
#13132: 16bit CMYK tiff image does not show correctly in scribus (and doesn't report why)
Added:
trunk/Scribus/scribus/util_image.h
Modified:
trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.cpp
trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.h
trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj
trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj.filters
trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj
trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj.filters
trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj
trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj.filters
Modified: trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.cpp
==============================================================================
--- trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.cpp (original)
+++ trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.cpp Sun May 23 20:15:03 2021
@@ -14,6 +14,7 @@
#include "scimgdataloader_tiff.h"
#include "scribuscore.h"
#include "util_color.h"
+#include "util_image.h"
static void TagExtender(TIFF *tiff)
{
@@ -27,7 +28,7 @@
ScImgDataLoader_TIFF::ScImgDataLoader_TIFF()
{
m_photometric = PHOTOMETRIC_MINISBLACK;
- m_samplesperpixel = 72;
+ m_samplesPerPixel = 72;
initSupportedFormatList();
}
@@ -248,118 +249,115 @@
}
}
-bool ScImgDataLoader_TIFF::getImageData(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, uint16_t photometric, uint16_t bitspersample, uint16_t samplesperpixel, bool &bilevel, bool &isCMYK)
+bool ScImgDataLoader_TIFF::getImageData(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, const SampleFormatInfo& sampleInfo, bool &bilevel, bool &isCMYK)
{
- uint32_t *bits = nullptr;
- if (photometric == PHOTOMETRIC_SEPARATED)
- {
- if (samplesperpixel > 5)
- {
- if (!getImageData_RGBA(tif, image, widtht, heightt, size, bitspersample, samplesperpixel))
- return false;
- if (bitspersample == 1)
- bilevel = true;
- isCMYK = false;
- m_pixelFormat = Format_RGBA_8;
- }
- else
- {
- if (TIFFIsTiled(tif))
- {
- uint32_t columns, rows;
- uint32_t *tile_buf;
- uint32_t xt, yt;
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &columns);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &rows);
- tile_buf = (uint32_t*) _TIFFmalloc(columns * rows * sizeof(uint32_t));
- if (tile_buf == nullptr)
- {
- TIFFClose(tif);
- return false;
- }
- uint32_t tileW = columns, tileH = rows;
- for (yt = 0; yt < (uint32_t) image->height(); yt += rows)
- {
- if (yt > (uint) image->height())
- break;
- if (image->height()-yt < rows)
- tileH = image->height() - yt;
- tileW = columns;
- uint32_t yi;
- int chans = image->channels();
- for (xt = 0; xt < (uint) image->width(); xt += columns)
- {
- TIFFReadTile(tif, tile_buf, xt, yt, 0, 0);
- for (yi = 0; yi < tileH; yi++)
- {
- _TIFFmemcpy(image->scanLine(yt + (tileH - 1 - yi)) + xt, tile_buf + tileW * yi, tileW * chans);
- }
- }
- }
- _TIFFfree(tile_buf);
- }
- else
- {
- tsize_t bytesperrow = TIFFScanlineSize(tif);
- bits = (uint32_t *) _TIFFmalloc(bytesperrow);
- int chans = image->channels();
- if (bits)
- {
- for (unsigned int y = 0; y < heightt; y++)
- {
- if (TIFFReadScanline(tif, bits, y, 0))
- {
- /* The code below allows loading of CMYK TIFFs generated by ImageMagick,
- currently commented out because its an ugly hack atm
- When converting 8-bit PNGs with an alpha channel to CMYK Tiff, ImageMagick
- creates a 16-bit CMYK Tiff !?!??
- if (bitspersample > 8)
- {
- uchar *ptrT = image->scanLine(y);
- uchar *ptrS = (uchar*)bits;
- for (unsigned int x = 0; x < widtht; x++)
- {
- ptrT[0] = ptrS[1];
- ptrT[1] = ptrS[3];
- ptrT[2] = ptrS[5];
- ptrT[3] = ptrS[7];
- if (samplesperpixel > 4)
- ptrT[4] = ptrS[9];
- ptrT += chans;
- ptrS += chans * 2;
- }
- }
- else */
- memcpy(image->scanLine(y), bits, chans * widtht);
- }
- }
- _TIFFfree(bits);
- }
- }
- isCMYK = true;
- m_pixelFormat = (image->channels() == 5) ? Format_CMYKA_8 : Format_CMYK_8;
- }
- }
- else
- {
- if (!getImageData_RGBA(tif, image, widtht, heightt, size, bitspersample, samplesperpixel))
+ if (sampleInfo.photometric != PHOTOMETRIC_SEPARATED)
+ {
+ if (!getImageData_RGBA(tif, image, widtht, heightt, size, sampleInfo))
return false;
- if (bitspersample == 1)
+ if (sampleInfo.bitsPerSample == 1)
bilevel = true;
m_pixelFormat = Format_RGBA_8;
- }
+ return true;
+ }
+
+ // Now we are in the PHOTOMETRIC_SEPARATED case
+ if (sampleInfo.samplesPerPixel > 5)
+ {
+ if (!getImageData_RGBA(tif, image, widtht, heightt, size, sampleInfo))
+ return false;
+ if (sampleInfo.bitsPerSample == 1)
+ bilevel = true;
+ isCMYK = false;
+ m_pixelFormat = Format_RGBA_8;
+ return true;
+ }
+
+ if (sampleInfo.samplesFormat != SAMPLEFORMAT_UINT && sampleInfo.samplesFormat != SAMPLEFORMAT_INT)
+ {
+ m_message = QObject::tr("This image uses an unsupported non integer sample format");
+ m_msgType = errorMsg;
+ return false;
+ }
+
+ if (sampleInfo.bitsPerSample > 16)
+ {
+ m_message = QObject::tr("This image uses an unsupported bit depth: %1 bits per sample.").arg(sampleInfo.bitsPerSample);
+ m_msgType = errorMsg;
+ return false;
+ }
+
+ if (TIFFIsTiled(tif))
+ {
+ uint32_t columns, rows;
+ uint32_t *tile_buf;
+ uint32_t xt, yt;
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &columns);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &rows);
+ tile_buf = (uint32_t*) _TIFFmalloc(columns * rows * sizeof(uint32_t));
+ if (tile_buf == nullptr)
+ {
+ TIFFClose(tif);
+ return false;
+ }
+ uint32_t tileW = columns, tileH = rows;
+ for (yt = 0; yt < (uint32_t) image->height(); yt += rows)
+ {
+ if (yt > (uint) image->height())
+ break;
+ if (image->height() - yt < rows)
+ tileH = image->height() - yt;
+ tileW = columns;
+ uint32_t yi;
+ int chans = image->channels();
+ for (xt = 0; xt < (uint) image->width(); xt += columns)
+ {
+ TIFFReadTile(tif, tile_buf, xt, yt, 0, 0);
+ for (yi = 0; yi < tileH; yi++)
+ {
+ _TIFFmemcpy(image->scanLine(yt + (tileH - 1 - yi)) + xt, tile_buf + tileW * yi, tileW * chans);
+ }
+ }
+ }
+ _TIFFfree(tile_buf);
+ }
+ else
+ {
+ int chans = image->channels();
+ tsize_t bytesperrow = TIFFScanlineSize(tif);
+ uint32_t *bits = (uint32_t *) _TIFFmalloc(bytesperrow);
+ if (bits)
+ {
+ for (unsigned int y = 0; y < heightt; y++)
+ {
+ if (!TIFFReadScanline(tif, bits, y, 0))
+ break;
+
+ if (sampleInfo.bitsPerSample == 16 && sampleInfo.samplesFormat == SAMPLEFORMAT_UINT)
+ convertImageData((uint16_t*) bits, (uint8_t*) image->scanLine(y), chans * widtht);
+ else if (sampleInfo.bitsPerSample == 16 && sampleInfo.samplesFormat == SAMPLEFORMAT_INT)
+ convertImageData((int16_t*) bits, (uint8_t*) image->scanLine(y), chans * widtht);
+ else
+ memcpy(image->scanLine(y), bits, chans * widtht);
+ }
+ _TIFFfree(bits);
+ }
+ }
+ isCMYK = true;
+ m_pixelFormat = (image->channels() == 5) ? Format_CMYKA_8 : Format_CMYK_8;
+
return true;
}
-bool ScImgDataLoader_TIFF::getImageData_RGBA(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, uint16_t bitspersample, uint16_t samplesperpixel)
+bool ScImgDataLoader_TIFF::getImageData_RGBA(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, const SampleFormatInfo& sampleInfo)
{
uint32_t* bits = (uint32_t *) _TIFFmalloc(size * sizeof(uint32_t));
if (!bits)
return false;
- uint16_t extrasamples(0), *extratypes(nullptr);
- if (!TIFFGetField (tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &extratypes))
- extrasamples = 0;
+ uint16_t extraSamples(0), *extraTypes(nullptr);
+ if (!TIFFGetField (tif, TIFFTAG_EXTRASAMPLES, &extraSamples, &extraTypes))
+ extraSamples = 0;
bool gotData = false;
if (TIFFReadRGBAImage(tif, widtht, heightt, bits, 0))
@@ -369,7 +367,7 @@
memcpy(image->scanLine(heightt - 1 - y), bits + y * widtht, widtht * image->channels());
if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
{
- unsigned char *s = image->scanLine( heightt - 1 - y );
+ unsigned char *s = image->scanLine(heightt - 1 - y);
unsigned char r, g, b, a;
for (uint xi = 0; xi < widtht; ++xi)
{
@@ -385,7 +383,7 @@
}
}
}
- if (extrasamples > 0 && extratypes[0] == EXTRASAMPLE_ASSOCALPHA)
+ if (extraSamples > 0 && extraTypes[0] == EXTRASAMPLE_ASSOCALPHA)
unmultiplyRGBA(image);
gotData = true;
}
@@ -652,7 +650,7 @@
bool bilevel = false;
bool failedPS = false;
bool foundPS = false;
- short resolutionunit = RESUNIT_INCH; // Default unit is inch
+ short resolutionUnit = RESUNIT_INCH; // Default unit is inch
float xres = 72.0, yres = 72.0;
if (!QFile::exists(fn))
return false;
@@ -693,18 +691,22 @@
bool isCMYK = false;
unsigned int widtht, heightt, size;
char *description=nullptr, *copyright=nullptr, *datetime=nullptr, *artist=nullptr, *scannerMake=nullptr, *scannerModel=nullptr;
- uint16_t bitspersample, fillorder, planar;
+ uint16_t bitsPerSample = 1;
+ uint16_t sampleFormat = SAMPLEFORMAT_UINT;
+ uint16_t fillorder = FILLORDER_MSB2LSB;
+ uint16_t planar = PLANARCONFIG_CONTIG;
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &widtht);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &heightt);
TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres);
TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres);
- TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT , &resolutionunit);
+ TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT , &resolutionUnit);
size = widtht * heightt;
TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &m_photometric);
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planar);
- TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &m_samplesperpixel);
+ TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitsPerSample);
+ TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &m_samplesPerPixel);
+ TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &sampleFormat);
TIFFGetField(tif, TIFFTAG_FILLORDER, &fillorder);
TIFFGetField(tif, TIFFTAG_MAKE, &scannerMake);
@@ -713,6 +715,14 @@
TIFFGetField(tif, TIFFTAG_COPYRIGHT, ©right);
TIFFGetField(tif, TIFFTAG_DATETIME, &datetime);
TIFFGetField(tif, TIFFTAG_ARTIST, &artist);
+
+ SampleFormatInfo sampleInfo;
+ sampleInfo.photometric = m_photometric;
+ sampleInfo.bitsPerSample = bitsPerSample;
+ sampleInfo.samplesPerPixel = m_samplesPerPixel;
+ sampleInfo.samplesFormat = sampleFormat;
+ sampleInfo.fillOrder = fillorder;
+
m_imageInfoRecord.exifInfo.cameraName = QString(scannerModel);
m_imageInfoRecord.exifInfo.cameraVendor = QString(scannerMake);
m_imageInfoRecord.exifInfo.comment = QString(description);
@@ -764,14 +774,14 @@
isCMYK = true;
m_imageInfoRecord.colorspace = ColorSpaceCMYK;
}
- else if (m_samplesperpixel == 1)
+ else if (m_samplesPerPixel == 1)
{
m_imageInfoRecord.colorspace = ColorSpaceGray;
isCMYK = false;
}
else
m_imageInfoRecord.colorspace = ColorSpaceRGB;
- if (bitspersample == 1)
+ if (bitsPerSample == 1)
bilevel = true;
if (!m_imageInfoRecord.exifInfo.thumbnail.isNull())
{
@@ -855,7 +865,7 @@
fakeHeader.color_mode = CM_CMYK;
chans = 5;
}
- else if (m_samplesperpixel == 1)
+ else if (m_samplesPerPixel == 1)
{
fakeHeader.color_mode = CM_GRAYSCALE;
isCMYK = false;
@@ -900,10 +910,10 @@
int chans = 4;
if (m_photometric == PHOTOMETRIC_SEPARATED)
{
- if (m_samplesperpixel > 5)
+ if (m_samplesPerPixel > 5)
chans = 4;
else
- chans = m_samplesperpixel;
+ chans = m_samplesPerPixel;
}
else
chans = 4;
@@ -924,7 +934,7 @@
}
tmpImg.fill(0);
- if (!getImageData(tif, &tmpImg, widtht, heightt, size, m_photometric, bitspersample, m_samplesperpixel, bilevel, isCMYK))
+ if (!getImageData(tif, &tmpImg, widtht, heightt, size, sampleInfo, bilevel, isCMYK))
{
TIFFClose(tif);
return false;
@@ -987,14 +997,14 @@
while (test == 1);
TIFFClose(tif);
}
- if (resolutionunit == RESUNIT_INCH)
+ if (resolutionUnit == RESUNIT_INCH)
{
m_image.setDotsPerMeterX ((int) (xres / 0.0254));
m_image.setDotsPerMeterY ((int) (yres / 0.0254));
m_imageInfoRecord.xres = qRound(xres);
m_imageInfoRecord.yres = qRound(yres);
}
- else if (resolutionunit == RESUNIT_CENTIMETER)
+ else if (resolutionUnit == RESUNIT_CENTIMETER)
{
m_image.setDotsPerMeterX ((int) (xres * 100.0));
m_image.setDotsPerMeterY ((int) (yres * 100.0));
@@ -1006,10 +1016,10 @@
m_imageInfoRecord.colorspace = ColorSpaceCMYK;
m_pixelFormat = (r_image.channels() == 5) ? Format_CMYKA_8 : Format_CMYK_8;
}
- else if (m_samplesperpixel == 1)
+ else if (m_samplesPerPixel == 1)
{
// Do not set m_pixelFormat here as the real pixel format is most probably different than gray
- if (bitspersample == 1)
+ if (bitsPerSample == 1)
m_imageInfoRecord.colorspace = ColorSpaceMonochrome;
else
m_imageInfoRecord.colorspace = ColorSpaceGray;
Modified: trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.h
==============================================================================
--- trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.h (original)
+++ trunk/Scribus/scribus/imagedataloaders/scimgdataloader_tiff.h Sun May 23 20:15:03 2021
@@ -10,9 +10,9 @@
#include <cstdint>
#include <tiffio.h>
+#include <QList>
+
#include "scimgdataloader.h"
-//Added by qt3to4:
-#include <QList>
class ScImgDataLoader_TIFF : public ScImgDataLoader
{
@@ -39,10 +39,20 @@
CM_DUOTONE = 8,
CM_LABCOLOR = 9
};
+
+ struct SampleFormatInfo
+ {
+ uint16_t photometric;
+ uint16_t bitsPerSample;
+ uint16_t samplesPerPixel;
+ uint16_t samplesFormat;
+ uint16_t fillOrder;
+ };
+
void initSupportedFormatList();
int getLayers(const QString& fn, int page);
- bool getImageData(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, uint16_t m_photometric, uint16_t bitspersample, uint16_t m_samplesperpixel, bool &bilevel, bool &isCMYK);
- bool getImageData_RGBA(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, uint16_t bitspersample, uint16_t m_samplesperpixel);
+ bool getImageData(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, const SampleFormatInfo& sampleInfo, bool &bilevel, bool &isCMYK);
+ bool getImageData_RGBA(TIFF* tif, RawImage *image, uint widtht, uint heightt, uint size, const SampleFormatInfo& sampleInfo);
void blendOntoTarget(RawImage *tmp, int layOpa, const QString& layBlend, bool cmyk, bool useMask);
QString getLayerString(QDataStream & s);
bool loadChannel( QDataStream & s, const PSDHeader & header, QList<PSDLayer> &layerInfo, uint layer, int channel, int component, RawImage &tmpImg);
@@ -53,7 +63,8 @@
void unmultiplyRGBA(RawImage *image);
int m_random_table[4096];
- uint16_t m_photometric, m_samplesperpixel;
+ uint16_t m_photometric;
+ uint16_t m_samplesPerPixel;
};
#endif
Modified: trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj
==============================================================================
--- trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj (original)
+++ trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj Sun May 23 20:15:03 2021
@@ -819,6 +819,7 @@
<ClInclude Include="..\..\..\scribus\util_file.h" />
<ClInclude Include="..\..\..\scribus\util_formats.h" />
<ClInclude Include="..\..\..\scribus\util_ghostscript.h" />
+ <ClInclude Include="..\..\..\scribus\util_image.h" />
<ClInclude Include="..\..\..\scribus\util_layer.h" />
<ClInclude Include="..\..\..\scribus\util_math.h" />
<ClInclude Include="..\..\..\scribus\util_printer.h" />
Modified: trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj.filters
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj.filters
==============================================================================
--- trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj.filters (original)
+++ trunk/Scribus/win32/msvc2015/scribus-main/Scribus.vcxproj.filters Sun May 23 20:15:03 2021
@@ -548,6 +548,9 @@
<ClInclude Include="..\..\..\scribus\util_ghostscript.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\scribus\util_image.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\scribus\util_layer.h">
<Filter>Header Files</Filter>
</ClInclude>
Modified: trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj
==============================================================================
--- trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj (original)
+++ trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj Sun May 23 20:15:03 2021
@@ -819,6 +819,7 @@
<ClInclude Include="..\..\..\scribus\util_file.h" />
<ClInclude Include="..\..\..\scribus\util_formats.h" />
<ClInclude Include="..\..\..\scribus\util_ghostscript.h" />
+ <ClInclude Include="..\..\..\scribus\util_image.h" />
<ClInclude Include="..\..\..\scribus\util_layer.h" />
<ClInclude Include="..\..\..\scribus\util_math.h" />
<ClInclude Include="..\..\..\scribus\util_printer.h" />
Modified: trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj.filters
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj.filters
==============================================================================
--- trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj.filters (original)
+++ trunk/Scribus/win32/msvc2017/scribus-main/Scribus.vcxproj.filters Sun May 23 20:15:03 2021
@@ -548,6 +548,9 @@
<ClInclude Include="..\..\..\scribus\util_ghostscript.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\scribus\util_image.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\scribus\util_layer.h">
<Filter>Header Files</Filter>
</ClInclude>
Modified: trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj
==============================================================================
--- trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj (original)
+++ trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj Sun May 23 20:15:03 2021
@@ -820,6 +820,7 @@
<ClInclude Include="..\..\..\scribus\util_file.h" />
<ClInclude Include="..\..\..\scribus\util_formats.h" />
<ClInclude Include="..\..\..\scribus\util_ghostscript.h" />
+ <ClInclude Include="..\..\..\scribus\util_image.h" />
<ClInclude Include="..\..\..\scribus\util_layer.h" />
<ClInclude Include="..\..\..\scribus\util_math.h" />
<ClInclude Include="..\..\..\scribus\util_printer.h" />
Modified: trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj.filters
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=24647&path=/trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj.filters
==============================================================================
--- trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj.filters (original)
+++ trunk/Scribus/win32/msvc2019/scribus-main/Scribus.vcxproj.filters Sun May 23 20:15:03 2021
@@ -548,6 +548,9 @@
<ClInclude Include="..\..\..\scribus\util_ghostscript.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\scribus\util_image.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\scribus\util_layer.h">
<Filter>Header Files</Filter>
</ClInclude>
More information about the scribus-commit
mailing list