/* * Copyright (c) 2006 Cyrille Berger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef _KIS_TIFF_READER_H_ #define _KIS_TIFF_READER_H_ // On some platforms, tiffio.h #defines NULL in a bad // way for C++, as (void *)0 instead of using the correct // C++ value 0. Include stdio.h first to get the right one. #include #include // #include // #include // #include #include #include "kis_types.h" #include "kis_global.h" // #include "kis_annotation.h" #include #include #define TQ_UINT32_MAX 4294967295u class TIFFStreamBase; class KisTIFFPostProcessor { public: KisTIFFPostProcessor(uint8 nbcolorssamples) : m_nbcolorssamples(nbcolorssamples) { } public: virtual void postProcess8bit( TQ_UINT8* ) { }; virtual void postProcess16bit( TQ_UINT16* ) { }; virtual void postProcess32bit( TQ_UINT32* ) { }; protected: inline uint8 nbColorsSamples() { return m_nbcolorssamples; } private: uint8 m_nbcolorssamples; }; class KisTIFFPostProcessorInvert : public KisTIFFPostProcessor { public: KisTIFFPostProcessorInvert(uint8 nbcolorssamples) : KisTIFFPostProcessor(nbcolorssamples) {} public: virtual void postProcess8bit( TQ_UINT8* data ) { for(int i = 0; i < nbColorsSamples(); i++) { data[i] = TQ_UINT8_MAX - data[i]; } } virtual void postProcess16bit( TQ_UINT16* data ) { TQ_UINT16* d = (TQ_UINT16*) data; for(int i = 0; i < nbColorsSamples(); i++) { d[i] = TQ_UINT16_MAX - d[i]; } } virtual void postProcess32bit( TQ_UINT32* data ) { TQ_UINT32* d = (TQ_UINT32*) data; for(int i = 0; i < nbColorsSamples(); i++) { d[i] = TQ_UINT32_MAX - d[i]; } } }; class KisTIFFPostProcessorICCLABtoCIELAB : public KisTIFFPostProcessor { public: KisTIFFPostProcessorICCLABtoCIELAB(uint8 nbcolorssamples) : KisTIFFPostProcessor(nbcolorssamples) {} public: void postProcess8bit(TQ_UINT8* data) { TQ_INT8* ds = (TQ_INT8*) data; for(int i = 1; i < nbColorsSamples(); i++) { ds[i] = data[i] - TQ_UINT8_MAX/2; } } void postProcess16bit(TQ_UINT16* data) { TQ_UINT16* d = (TQ_UINT16*) data; TQ_INT16* ds = (TQ_INT16*) data; for(int i = 1; i < nbColorsSamples(); i++) { ds[i] = d[i] - TQ_UINT16_MAX /2; } } void postProcess32bit(TQ_UINT32* data) { TQ_UINT32* d = (TQ_UINT32*) data; TQ_INT32* ds = (TQ_INT32*) data; for(int i = 1; i < nbColorsSamples(); i++) { ds[i] = d[i] - TQ_UINT32_MAX /2; } } }; class KisTIFFReaderBase { public: KisTIFFReaderBase( KisPaintDeviceSP device, TQ_UINT8* poses, int8 alphapos, uint8 sourceDepth, uint8 nbcolorssamples, uint8 extrasamplescount, cmsHTRANSFORM transformProfile, KisTIFFPostProcessor* postprocessor) : m_device(device), m_alphapos(alphapos), m_sourceDepth(sourceDepth), m_nbcolorssamples(nbcolorssamples), m_nbextrasamples(extrasamplescount), m_poses(poses), m_transformProfile(transformProfile), m_postprocess(postprocessor) { } public: /** * This function copy data from the tiff stream to the paint device starting at the given position. * @param x horizontal start position * @param y vertical start position * @param dataWidth width of the data to copy * @param tiffstream source of data * * @return the number of line which were copied */ virtual uint copyDataToChannels( TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 dataWidth, TIFFStreamBase* tiffstream) =0; /** * This function is called when all data has been read and should be used for any postprocessing. */ virtual void finalize() { }; protected: inline KisPaintDeviceSP paintDevice() { return m_device; } inline TQ_UINT8 alphaPos() { return m_alphapos; } inline TQ_UINT8 sourceDepth() { return m_sourceDepth; } inline TQ_UINT8 nbColorsSamples() { return m_nbcolorssamples; } inline TQ_UINT8 nbExtraSamples() { return m_nbextrasamples; } inline TQ_UINT8* poses() { return m_poses; } inline cmsHTRANSFORM transform() { return m_transformProfile; } inline KisTIFFPostProcessor* postProcessor() { return m_postprocess; } private: KisPaintDeviceSP m_device; TQ_UINT8 m_alphapos; TQ_UINT8 m_sourceDepth; TQ_UINT8 m_nbcolorssamples; TQ_UINT8 m_nbextrasamples; TQ_UINT8* m_poses; cmsHTRANSFORM m_transformProfile; KisTIFFPostProcessor* m_postprocess; TQ_UINT32 m_tiffDataWidth; }; class KisTIFFReaderTarget8bit : public KisTIFFReaderBase { public: KisTIFFReaderTarget8bit( KisPaintDeviceSP device, TQ_UINT8* poses, int8 alphapos, uint8 sourceDepth, uint8 nbcolorssamples, uint8 extrasamplescount, cmsHTRANSFORM transformProfile, KisTIFFPostProcessor* postprocessor) : KisTIFFReaderBase(device, poses, alphapos, sourceDepth, nbcolorssamples, extrasamplescount, transformProfile, postprocessor ) { } public: virtual uint copyDataToChannels( TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 dataWidth, TIFFStreamBase* tiffstream); }; class KisTIFFReaderTarget16bit : public KisTIFFReaderBase { public: KisTIFFReaderTarget16bit( KisPaintDeviceSP device, TQ_UINT8* poses, int8 alphapos, uint8 sourceDepth, uint8 nbcolorssamples, uint8 extrasamplescount, cmsHTRANSFORM transformProfile, KisTIFFPostProcessor* postprocessor) : KisTIFFReaderBase(device, poses, alphapos, sourceDepth, nbcolorssamples, extrasamplescount, transformProfile, postprocessor ) { } public: virtual uint copyDataToChannels( TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 dataWidth, TIFFStreamBase* tiffstream) ; }; class KisTIFFReaderTarget32bit : public KisTIFFReaderBase { public: KisTIFFReaderTarget32bit( KisPaintDeviceSP device, TQ_UINT8* poses, int8 alphapos, uint8 sourceDepth, uint8 nbcolorssamples, uint8 extrasamplescount, cmsHTRANSFORM transformProfile, KisTIFFPostProcessor* postprocessor) : KisTIFFReaderBase(device, poses, alphapos, sourceDepth, nbcolorssamples, extrasamplescount, transformProfile, postprocessor ) { } public: virtual uint copyDataToChannels( TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 dataWidth, TIFFStreamBase* tiffstream) ; }; class KisTIFFReaderFromPalette : public KisTIFFReaderBase { public: KisTIFFReaderFromPalette( KisPaintDeviceSP device, uint16 *red, uint16 *green, uint16 *blue, TQ_UINT8* poses, int8 alphapos, uint8 sourceDepth, uint8 nbcolorssamples, uint8 extrasamplescount, cmsHTRANSFORM transformProfile, KisTIFFPostProcessor* postprocessor) : KisTIFFReaderBase(device, poses, alphapos, sourceDepth, nbcolorssamples, extrasamplescount, transformProfile, postprocessor ), m_red(red), m_green(green), m_blue(blue) { } public: virtual uint copyDataToChannels( TQ_UINT32 x, TQ_UINT32 y, TQ_UINT32 dataWidth, TIFFStreamBase* tiffstream) ; private: uint16 *m_red, *m_green, *m_blue; }; #endif