00001 #ifndef XCF_H
00002 #define XCF_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qimage.h>
00025 #include <qiodevice.h>
00026 #include <qvaluestack.h>
00027 #include <qvaluevector.h>
00028
00029 #include "gimp.h"
00030
00031
00032 extern "C" {
00033 void kimgio_xcf_read(QImageIO *);
00034 void kimgio_xcf_write(QImageIO *);
00035 }
00036
00037 const float INCHESPERMETER = (100.0 / 2.54);
00038
00046 typedef QValueVector<QValueVector<QImage> > Tiles;
00047
00048
00049
00050 class XCFImageFormat {
00051 public:
00052 XCFImageFormat();
00053 void readXCF(QImageIO* image_io);
00054
00055
00056 private:
00065 class Layer {
00066 public:
00067 Q_UINT32 width;
00068 Q_UINT32 height;
00069 Q_INT32 type;
00070 char* name;
00071 Q_UINT32 hierarchy_offset;
00072 Q_UINT32 mask_offset;
00073
00074 uint nrows;
00075 uint ncols;
00076
00077 Tiles image_tiles;
00078
00079
00080 Tiles alpha_tiles;
00081 Tiles mask_tiles;
00082
00084 struct {
00085 Q_UINT32 opacity;
00086 Q_UINT32 visible;
00087 Q_UINT32 show_masked;
00088 uchar red, green, blue;
00089 Q_UINT32 tattoo;
00090 } mask_channel;
00091
00092 bool active;
00093 Q_UINT32 opacity;
00094 Q_UINT32 visible;
00095 Q_UINT32 linked;
00096 Q_UINT32 preserve_transparency;
00097 Q_UINT32 apply_mask;
00098 Q_UINT32 edit_mask;
00099 Q_UINT32 show_mask;
00100 Q_INT32 x_offset;
00101 Q_INT32 y_offset;
00102 Q_UINT32 mode;
00103 Q_UINT32 tattoo;
00104
00106 uchar tile[TILE_WIDTH * TILE_HEIGHT * sizeof(QRgb)];
00107
00112 void (*assignBytes)(Layer& layer, uint i, uint j);
00113
00114 Layer(void) : name(0) {}
00115 ~Layer(void) { delete[] name; }
00116 };
00117
00118
00123 class XCFImage {
00124 public:
00125 Q_UINT32 width;
00126 Q_UINT32 height;
00127 Q_INT32 type;
00128
00129 Q_UINT8 compression;
00130 float x_resolution;
00131 float y_resolution;
00132 Q_INT32 tattoo;
00133 Q_UINT32 unit;
00134 Q_INT32 num_colors;
00135 QValueVector<QRgb> palette;
00136
00137 int num_layers;
00138 Layer layer;
00139
00140 bool initialized;
00141 QImage image;
00142
00143 XCFImage(void) : initialized(false) {}
00144 };
00145
00146
00152 static int random_table[RANDOM_TABLE_SIZE];
00153
00155
00156 static int add_lut( int, int );
00157
00160 typedef void (*PixelCopyOperation)(Layer& layer, uint i, uint j, int k, int l,
00161 QImage& image, int m, int n);
00162
00164 typedef void (*PixelMergeOperation)(Layer& layer, uint i, uint j, int k, int l,
00165 QImage& image, int m, int n);
00166
00168 typedef struct {
00169 bool affect_alpha;
00170 } LayerModes;
00171
00174 static const LayerModes layer_modes[];
00175
00176 bool loadImageProperties(QDataStream& xcf_io, XCFImage& image);
00177 bool loadProperty(QDataStream& xcf_io, PropType& type, QByteArray& bytes);
00178 bool loadLayer(QDataStream& xcf_io, XCFImage& xcf_image);
00179 bool loadLayerProperties(QDataStream& xcf_io, Layer& layer);
00180 bool composeTiles(XCFImage& xcf_image);
00181 void setGrayPalette(QImage& image);
00182 void setPalette(XCFImage& xcf_image, QImage& image);
00183 static void assignImageBytes(Layer& layer, uint i, uint j);
00184 bool loadHierarchy(QDataStream& xcf_io, Layer& layer);
00185 bool loadLevel(QDataStream& xcf_io, Layer& layer, Q_INT32 bpp);
00186 static void assignMaskBytes(Layer& layer, uint i, uint j);
00187 bool loadMask(QDataStream& xcf_io, Layer& layer);
00188 bool loadChannelProperties(QDataStream& xcf_io, Layer& layer);
00189 bool initializeImage(XCFImage& xcf_image);
00190 bool loadTileRLE(QDataStream& xcf_io, uchar* tile, int size,
00191 int data_length, Q_INT32 bpp);
00192 static void copyLayerToImage(XCFImage& xcf_image);
00193 static void copyRGBToRGB(Layer& layer, uint i, uint j, int k, int l,
00194 QImage& image, int m, int n);
00195
00196 static void copyGrayToGray(Layer& layer, uint i, uint j, int k, int l,
00197 QImage& image, int m, int n);
00198 static void copyGrayToRGB(Layer& layer, uint i, uint j, int k, int l,
00199 QImage& image, int m, int n);
00200 static void copyGrayAToRGB(Layer& layer, uint i, uint j, int k, int l,
00201 QImage& image, int m, int n);
00202 static void copyIndexedToIndexed(Layer& layer, uint i, uint j, int k, int l,
00203 QImage& image, int m, int n);
00204 static void copyIndexedAToIndexed(Layer& layer, uint i, uint j, int k, int l,
00205 QImage& image, int m, int n);
00206 static void copyIndexedAToRGB(Layer& layer, uint i, uint j, int k, int l,
00207 QImage& image, int m, int n);
00208
00209 static void mergeLayerIntoImage(XCFImage& xcf_image);
00210 static void mergeRGBToRGB(Layer& layer, uint i, uint j, int k, int l,
00211 QImage& image, int m, int n);
00212 static void mergeGrayToGray(Layer& layer, uint i, uint j, int k, int l,
00213 QImage& image, int m, int n);
00214 static void mergeGrayAToGray(Layer& layer, uint i, uint j, int k, int l,
00215 QImage& image, int m, int n);
00216 static void mergeGrayToRGB(Layer& layer, uint i, uint j, int k, int l,
00217 QImage& image, int m, int n);
00218 static void mergeGrayAToRGB(Layer& layer, uint i, uint j, int k, int l,
00219 QImage& image, int m, int n);
00220 static void mergeIndexedToIndexed(Layer& layer, uint i, uint j, int k, int l,
00221 QImage& image, int m, int n);
00222 static void mergeIndexedAToIndexed(Layer& layer, uint i, uint j, int k, int l,
00223 QImage& image, int m, int n);
00224 static void mergeIndexedAToRGB(Layer& layer, uint i, uint j, int k, int l,
00225 QImage& image, int m, int n);
00226
00227 static void dissolveRGBPixels(QImage& image, int x, int y);
00228 static void dissolveAlphaPixels(QImage& image, int x, int y);
00229 };
00230
00231 #endif