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, &copyright);
 	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