Krita Source Code Documentation
Loading...
Searching...
No Matches
KisXCFImport Class Reference

#include <kis_xcf_import.h>

+ Inheritance diagram for KisXCFImport:

Public Member Functions

KisImportExportErrorCode convert (KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
 
 KisXCFImport (QObject *parent, const QVariantList &)
 
 ~KisXCFImport () override
 
- Public Member Functions inherited from KisImportExportFilter
virtual KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const QByteArray &from="", const QByteArray &to="") const
 createConfigurationWidget creates a widget that can be used to define the settings for a given import/export filter
 
virtual KisPropertiesConfigurationSP defaultConfiguration (const QByteArray &from="", const QByteArray &to="") const
 defaultConfiguration defines the default settings for the given import export filter
 
virtual QMap< QString, KisExportCheckBase * > exportChecks ()
 generate and return the list of capabilities of this export filter. The list
 
virtual bool exportSupportsGuides () const
 exportSupportsGuides Because guides are in the document and not the image, checking for guides cannot be made an exportCheck.
 
KisPropertiesConfigurationSP lastSavedConfiguration (const QByteArray &from="", const QByteArray &to="") const
 lastSavedConfiguration return the last saved configuration for this filter
 
 Private ()
 
void setBatchMode (bool batchmode)
 
void setFilename (const QString &filename)
 
void setImportUserFeedBackInterface (KisImportUserFeedbackInterface *interface)
 
void setMimeType (const QString &mime)
 
void setRealFilename (const QString &filename)
 
void setUpdater (QPointer< KoUpdater > updater)
 
virtual bool supportsIO () const
 Override and return false for the filters that use a library that cannot handle file handles, only file names.
 
QPointer< KoUpdaterupdater ()
 
virtual QString verify (const QString &fileName) const
 Verify whether the given file is correct and readable.
 
 ~KisImportExportFilter () override
 
 ~Private ()
 

Additional Inherited Members

- Public Attributes inherited from KisImportExportFilter
bool batchmode
 
QMap< QString, KisExportCheckBase * > capabilities
 
QString filename
 
KisImportUserFeedbackInterfaceimportUserFeedBackInterface {nullptr}
 
QByteArray mime
 
QString realFilename
 
QPointer< KoUpdaterupdater
 
- Static Public Attributes inherited from KisImportExportFilter
static const QString CICPPrimariesTag = "CICPCompatiblePrimaries"
 
static const QString CICPTransferCharacteristicsTag = "CICPCompatibleTransferFunction"
 
static const QString ColorDepthIDTag = "ColorDepthID"
 
static const QString ColorModelIDTag = "ColorModelID"
 
static const QString HDRTag = "HDRSupported"
 
static const QString ImageContainsTransparencyTag = "ImageContainsTransparency"
 
static const QString sRGBTag = "sRGB"
 
- Protected Member Functions inherited from KisImportExportFilter
void addCapability (KisExportCheckBase *capability)
 
void addSupportedColorModels (QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
 
bool batchMode () const
 
QString filename () const
 
KisImportUserFeedbackInterfaceimportUserFeedBackInterface () const
 
virtual void initializeCapabilities ()
 
 KisImportExportFilter (QObject *parent=0)
 
QByteArray mimeType () const
 
QString realFilename () const
 
void setProgress (int value)
 
QString verifyZiPBasedFiles (const QString &fileName, const QStringList &filesToCheck) const
 

Detailed Description

Definition at line 17 of file kis_xcf_import.h.

Constructor & Destructor Documentation

◆ KisXCFImport()

KisXCFImport::KisXCFImport ( QObject * parent,
const QVariantList &  )

Definition at line 134 of file kis_xcf_import.cpp.

134 : KisImportExportFilter(parent)
135{
136}
KisImportExportFilter(QObject *parent=0)

◆ ~KisXCFImport()

KisXCFImport::~KisXCFImport ( )
override

Definition at line 138 of file kis_xcf_import.cpp.

139{
140}

Member Function Documentation

◆ convert()

KisImportExportErrorCode KisXCFImport::convert ( KisDocument * document,
QIODevice * io,
KisPropertiesConfigurationSP configuration = 0 )
overridevirtual

The filter chain calls this method to perform the actual conversion. The passed mimetypes should be a pair of those you specified in your .desktop file. You have to implement this method to make the filter work.

Returns
The error status, see the #ConversionStatus enum. KisImportExportFilter::OK means that everything is alright.

Implements KisImportExportFilter.

Definition at line 142 of file kis_xcf_import.cpp.

143{
144 int errorStatus;
145
146 dbgFile << "Start decoding file";
147 QByteArray data = io->readAll();
148 xcf_file = (uint8_t*)data.data();
149 xcf_length = data.size();
150 io->close();
151
152 // Decode the data
153 if (getBasicXcfInfo() != XCF_OK) {
154 if (XCF.version < 0 || XCF.version > 2) {
155 document->setErrorMessage(i18n("This XCF file is too new; Krita cannot support XCF files written by GIMP 2.9 or newer."));
157 }
159 }
160
161 if(initColormap() != XCF_OK) {
163 }
164
165 dbgFile << XCF.version << "width = " << XCF.width << "height = " << XCF.height << "layers = " << XCF.numLayers;
166
167 // Create the image
168 KisImageSP image = new KisImage(document->createUndoStore(), XCF.width, XCF.height, KoColorSpaceRegistry::instance()->rgb8(), "built image");
169
170 QVector<Layer> layers;
171 uint maxDepth = 0;
172
173 // Read layers
174 for (int i = 0; i < XCF.numLayers; ++i) {
175
176 Layer layer;
177
178 xcfLayer& xcflayer = XCF.layers[i];
179 dbgFile << i << " name = " << xcflayer.name << " opacity = " << xcflayer.opacity << "group:" << xcflayer.isGroup << xcflayer.pathLength;
180 dbgFile << ppVar(xcflayer.dim.width) << ppVar(xcflayer.dim.height) << ppVar(xcflayer.dim.tilesx) << ppVar(xcflayer.dim.tilesy) << ppVar(xcflayer.dim.ntiles) << ppVar(xcflayer.dim.c.t) << ppVar(xcflayer.dim.c.l) << ppVar(xcflayer.dim.c.r) << ppVar(xcflayer.dim.c.b);
181
182 maxDepth = qMax(maxDepth, xcflayer.pathLength);
183
184 bool isRgbA = false;
185 // Select the color space
186 const KoColorSpace* colorSpace = 0;
187 switch (xcflayer.type) {
190 case GIMP_RGB_IMAGE:
191 case GIMP_RGBA_IMAGE:
192 colorSpace = KoColorSpaceRegistry::instance()->rgb8();
193 isRgbA = true;
194 break;
195 case GIMP_GRAY_IMAGE:
196 case GIMP_GRAYA_IMAGE:
198 isRgbA = false;
199 break;
200 }
201
202 // Create the layer
203 KisLayerSP kisLayer;
204 if (xcflayer.isGroup) {
205 kisLayer = new KisGroupLayer(image, QString::fromUtf8(xcflayer.name), xcflayer.opacity);
206 }
207 else {
208 kisLayer = new KisPaintLayer(image, QString::fromUtf8(xcflayer.name), xcflayer.opacity, colorSpace);
209 }
210
211 // Set some properties
212 kisLayer->setCompositeOpId(layerModeG2K(xcflayer.mode));
213 kisLayer->setVisible(xcflayer.isVisible);
214 kisLayer->disableAlphaChannel(xcflayer.mode != GIMP_NORMAL_MODE);
215
216 layer.layer = kisLayer;
217 layer.depth = xcflayer.pathLength;
218
219 // Copy the data in the image
220 if ((errorStatus = initLayer(&xcflayer)) != XCF_OK) {
222 }
223
224 int left = xcflayer.dim.c.l;
225 int top = xcflayer.dim.c.t;
226
227 if (!xcflayer.isGroup) {
228
229 // Copy the data;
230 for (unsigned int x = 0; x < xcflayer.dim.width; x += TILE_WIDTH) {
231 for (unsigned int y = 0; y < xcflayer.dim.height; y += TILE_HEIGHT) {
232 rect want;
233 want.l = x + left;
234 want.t = y + top;
235 want.b = want.t + TILE_HEIGHT;
236 want.r = want.l + TILE_WIDTH;
237 Tile* tile = getMaskOrLayerTile(&xcflayer.dim, &xcflayer.pixels, want);
238 if (tile == XCF_PTR_EMPTY) {
240 }
242 rgba* data = tile->pixels;
243 for (int v = 0; v < TILE_HEIGHT; ++v) {
244 if (isRgbA) {
245 // RGB image
246 do {
247 KoBgrTraits<quint8>::setRed(it->rawData(), GET_RED(*data));
248 KoBgrTraits<quint8>::setGreen(it->rawData(), GET_GREEN(*data));
249 KoBgrTraits<quint8>::setBlue(it->rawData(), GET_BLUE(*data));
250 KoBgrTraits<quint8>::setOpacity(it->rawData(), quint8(GET_ALPHA(*data)), 1);
251 ++data;
252 } while (it->nextPixel());
253 } else {
254 // Grayscale image
255 do {
256 it->rawData()[0] = GET_RED(*data);
257 it->rawData()[1] = GET_ALPHA(*data);
258 ++data;
259 } while (it->nextPixel());
260 }
261 it->nextRow();
262 }
263 freeTile(tile);
264 }
265 }
266
267 // Move the layer to its position
268 kisLayer->paintDevice()->setX(left);
269 kisLayer->paintDevice()->setY(top);
270 }
271 // Create the mask
272 if (xcflayer.hasMask) {
273 KisTransparencyMaskSP mask = new KisTransparencyMask(image, i18n("Transparency Mask"));
274 layer.mask = mask;
275
276 mask->initSelection(kisLayer);
277 for (unsigned int x = 0; x < xcflayer.dim.width; x += TILE_WIDTH) {
278 for (unsigned int y = 0; y < xcflayer.dim.height; y += TILE_HEIGHT) {
279 rect want;
280 want.l = x + left;
281 want.t = y + top;
282 want.b = want.t + TILE_HEIGHT;
283 want.r = want.l + TILE_WIDTH;
284 Tile* tile = getMaskOrLayerTile(&xcflayer.dim, &xcflayer.mask, want);
285 if (tile == XCF_PTR_EMPTY) {
286 free(tile);
288 }
290 rgba* data = tile->pixels;
291 for (int v = 0; v < TILE_HEIGHT; ++v) {
292 do {
293 it->rawData()[0] = GET_ALPHA(*data);
294 ++data;
295 } while (it->nextPixel());
296 it->nextRow();
297 }
298 freeTile(tile);
299 }
300 }
301 mask->paintDevice()->setX(left);
302 mask->paintDevice()->setY(top);
303 }
304
305 dbgFile << xcflayer.pixels.tileptrs;
306 layers.append(layer);
307 }
308
309 for (uint i = 0; i <= maxDepth; ++i) {
310 addLayers(layers, image, i);
311 }
312
313 document->setCurrentImage(image);
315
316}
qreal v
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
unsigned int uint
void setX(qint32 x)
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
void setY(qint32 y)
QString id() const
Definition KoID.cpp:63
@ GIMP_NORMAL_MODE
Definition enums.h:9
@ GIMP_RGB_IMAGE
Definition enums.h:49
@ GIMP_INDEXED_IMAGE
Definition enums.h:53
@ GIMP_GRAYA_IMAGE
Definition enums.h:52
@ GIMP_INDEXEDA_IMAGE
Definition enums.h:54
@ GIMP_GRAY_IMAGE
Definition enums.h:51
@ GIMP_RGBA_IMAGE
Definition enums.h:50
#define ppVar(var)
Definition kis_debug.h:155
#define dbgFile
Definition kis_debug.h:53
#define GET_RED(x)
#define GET_GREEN(x)
void addLayers(const QVector< Layer > &layers, KisImageSP image, int depth)
#define GET_BLUE(x)
QString layerModeG2K(GimpLayerModeEffects mode)
#define GET_ALPHA(x)
int initColormap(void)
Definition pixels.c:199
int initLayer(struct xcfLayer *layer)
Definition pixels.c:167
void freeTile(struct Tile *tile)
Definition pixels.c:255
struct Tile * getMaskOrLayerTile(struct tileDimensions *dim, struct xcfTiles *tiles, struct rect want)
Definition pixels.c:427
uint32_t rgba
Definition pixels.h:44
virtual void setVisible(bool visible, bool loading=false)
virtual KisPaintDeviceSP paintDevice() const =0
void setCompositeOpId(const QString &compositeOpId)
void disableAlphaChannel(bool disable)
Definition kis_layer.cc:319
void initSelection(KisSelectionSP copyFrom, KisLayerSP parentLayer)
initSelection initializes the selection for the mask from the given selection's projection.
Definition kis_mask.cc:157
KisPaintDeviceSP paintDevice() const override
Definition kis_mask.cc:223
static void setRed(quint8 *data, channels_type nv)
Set the red component.
static void setGreen(quint8 *data, channels_type nv)
Set the green component.
static void setBlue(quint8 *data, channels_type nv)
Set the blue component.
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())
static void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels)
KisMaskSP mask
KisLayerSP layer
Definition pixels.h:97
rgba pixels[TILE_WIDTH *TILE_HEIGHT]
Definition pixels.h:101
int l
Definition xcftools.h:130
int r
Definition xcftools.h:130
int t
Definition xcftools.h:130
int b
Definition xcftools.h:130
struct rect c
Definition xcftools.h:166
unsigned tilesx
Definition xcftools.h:168
unsigned height
Definition xcftools.h:167
unsigned tilesy
Definition xcftools.h:168
unsigned width
Definition xcftools.h:167
unsigned ntiles
Definition xcftools.h:169
unsigned height
Definition xcftools.h:197
unsigned width
Definition xcftools.h:197
int numLayers
Definition xcftools.h:200
struct xcfLayer * layers
Definition xcftools.h:201
int version
Definition xcftools.h:196
unsigned int opacity
Definition xcftools.h:185
unsigned pathLength
Definition xcftools.h:191
int isVisible
Definition xcftools.h:186
GimpLayerModeEffects mode
Definition xcftools.h:183
struct xcfTiles pixels
Definition xcftools.h:188
int isGroup
Definition xcftools.h:190
int hasMask
Definition xcftools.h:186
struct tileDimensions dim
Definition xcftools.h:181
const char * name
Definition xcftools.h:182
GimpImageType type
Definition xcftools.h:184
struct xcfTiles mask
Definition xcftools.h:189
uint32_t * tileptrs
Definition xcftools.h:176
int getBasicXcfInfo(void)
struct xcfImage XCF
size_t xcf_length
Definition xcf-general.c:30
uint8_t * xcf_file
Definition xcf-general.c:29
#define TILE_HEIGHT
Definition xcftools.h:155
#define TILE_WIDTH
Definition xcftools.h:154
#define XCF_OK
Definition xcftools.h:106
#define XCF_PTR_EMPTY
Definition xcftools.h:107

References addLayers(), rect::b, tileDimensions::c, KoColorSpaceRegistry::colorSpace(), KisPaintDevice::createHLineIteratorNG(), dbgFile, Layer::depth, xcfLayer::dim, KisLayer::disableAlphaChannel(), ImportExportCodes::FileFormatIncorrect, ImportExportCodes::FormatFeaturesUnsupported, freeTile(), GET_ALPHA, GET_BLUE, GET_GREEN, GET_RED, getBasicXcfInfo(), getMaskOrLayerTile(), GIMP_GRAY_IMAGE, GIMP_GRAYA_IMAGE, GIMP_INDEXED_IMAGE, GIMP_INDEXEDA_IMAGE, GIMP_NORMAL_MODE, GIMP_RGB_IMAGE, GIMP_RGBA_IMAGE, GrayAColorModelID, xcfLayer::hasMask, tileDimensions::height, xcfImage::height, KoID::id(), initColormap(), initLayer(), KisMask::initSelection(), KoColorSpaceRegistry::instance(), Integer8BitsColorDepthID, xcfLayer::isGroup, xcfLayer::isVisible, rect::l, Layer::layer, layerModeG2K(), xcfImage::layers, xcfLayer::mask, Layer::mask, xcfLayer::mode, xcfLayer::name, tileDimensions::ntiles, xcfImage::numLayers, ImportExportCodes::OK, xcfLayer::opacity, KisBaseNode::paintDevice(), KisMask::paintDevice(), xcfLayer::pathLength, Tile::pixels, xcfLayer::pixels, ppVar, rect::r, KoColorSpaceRegistry::rgb8(), KoBgrTraits< _channels_type_ >::setBlue(), KisBaseNode::setCompositeOpId(), KoBgrTraits< _channels_type_ >::setGreen(), KoColorSpaceTrait< _channels_type_, 4, 3 >::setOpacity(), KoBgrTraits< _channels_type_ >::setRed(), KisBaseNode::setVisible(), KisPaintDevice::setX(), KisPaintDevice::setY(), rect::t, TILE_HEIGHT, TILE_WIDTH, xcfTiles::tileptrs, tileDimensions::tilesx, tileDimensions::tilesy, xcfLayer::type, v, xcfImage::version, tileDimensions::width, xcfImage::width, XCF, xcf_file, xcf_length, XCF_OK, and XCF_PTR_EMPTY.


The documentation for this class was generated from the following files: