00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef KOCOLORSPACE_H
00020 #define KOCOLORSPACE_H
00021
00022 #include <config.h>
00023 #include <lcms.h>
00024 #include <limits.h>
00025
00026 #include <QImage>
00027 #include <QBitArray>
00028 #include <QHash>
00029
00030 #include <Q3MemArray>
00031 #include <q3valuevector.h>
00032 #include <q3valuelist.h>
00033
00034 #include <KoCompositeOp.h>
00035 #include <KoChannelInfo.h>
00036 #include <KoID.h>
00037
00038
00039 class KoColorProfile;
00040 class KoColorSpaceRegistry;
00041 class KisMathToolbox;
00042 class KisFilter;
00043
00044 const quint8 OPACITY_TRANSPARENT = 0;
00045 const quint8 OPACITY_OPAQUE = UCHAR_MAX;
00046
00047 class KoColorAdjustment
00048 {
00049 public:
00050
00051 KoColorAdjustment() {};
00052 virtual ~KoColorAdjustment() {};
00053 };
00054
00055
00056 enum ColorSpaceIndependence {
00057 FULLY_INDEPENDENT,
00058 TO_LAB16,
00059 TO_RGBA8,
00060 TO_RGBA16
00061 };
00062
00090 class PIGMENT_EXPORT KoColorSpace {
00091
00092 protected:
00094 KoColorSpace() {};
00095
00096 public:
00098 KoColorSpace(const QString &id, const QString &name, KoColorSpaceRegistry * parent);
00099 virtual ~KoColorSpace();
00100
00101 virtual bool operator==(const KoColorSpace& rhs) const {
00102 return id() == rhs.id();
00103 }
00104
00105
00106 public:
00107
00108
00109
00111 virtual Q3ValueVector<KoChannelInfo *> channels() const
00112 {
00113 return m_channels;
00114 }
00115
00119 virtual quint32 nChannels() const = 0;
00120
00125 virtual quint32 nColorChannels() const = 0;
00126
00131 virtual quint32 nSubstanceChannels() const { return 0; };
00132
00136 virtual quint32 pixelSize() const = 0;
00137
00141 virtual QString channelValueText(const quint8 *pixel, quint32 channelIndex) const = 0;
00142
00147 virtual QString normalisedChannelValueText(const quint8 *pixel, quint32 channelIndex) const = 0;
00148
00154 virtual quint8 scaleToU8(const quint8 * srcPixel, qint32 channelPos) const = 0;
00155
00161 virtual quint16 scaleToU16(const quint8 * srcPixel, qint32 channelPos) const = 0;
00162
00168 virtual void getSingleChannelPixel(quint8 *dstPixel, const quint8 *srcPixel, quint32 channelIndex) const = 0;
00169
00170
00171
00175 virtual QString id() const {return m_id;};
00176
00180 virtual QString name() const {return m_name;};
00181
00185 virtual quint32 colorSpaceType() const = 0;
00186
00187 virtual icColorSpaceSignature colorSpaceSignature() const = 0;
00188
00199 virtual bool willDegrade(ColorSpaceIndependence independence) const = 0;
00200
00201
00202
00206 virtual KoCompositeOpList userVisiblecompositeOps() const;
00207
00212 virtual const KoCompositeOp * compositeOp(const QString & id) const;
00213
00217 virtual void addCompositeOp(const KoCompositeOp * op);
00218
00223 virtual bool hasHighDynamicRange() const = 0;
00224
00225
00226
00227
00231 virtual KoColorProfile * getProfile() const = 0;
00232
00233
00234
00235
00245 virtual void fromQColor(const QColor& c, quint8 *dst, KoColorProfile * profile = 0) const = 0;
00246
00257 virtual void fromQColor(const QColor& c, quint8 opacity, quint8 *dst, KoColorProfile * profile = 0) const = 0;
00258
00268 virtual void toQColor(const quint8 *src, QColor *c, KoColorProfile * profile = 0) const = 0;
00269
00280 virtual void toQColor(const quint8 *src, QColor *c, quint8 *opacity, KoColorProfile * profile = 0) const = 0;
00281
00296 virtual QImage convertToQImage(const quint8 *data, qint32 width, qint32 height,
00297 KoColorProfile * dstProfile, qint32 renderingIntent = INTENT_PERCEPTUAL,
00298 float exposure = 0.0f) const = 0;
00299
00304 quint8 *allocPixelBuffer(quint32 numPixels) const;
00305
00313 virtual void toLabA16(const quint8 * src, quint8 * dst, const quint32 nPixels) const = 0;
00314
00323 virtual void fromLabA16(const quint8 * src, quint8 * dst, const quint32 nPixels) const = 0;
00324
00332 virtual void toRgbA16(const quint8 * src, quint8 * dst, const quint32 nPixels) const =0;
00333
00342 virtual void fromRgbA16(const quint8 * src, quint8 * dst, const quint32 nPixels) const =0;
00343
00350 virtual bool convertPixelsTo(const quint8 * src,
00351 quint8 * dst, const KoColorSpace * dstColorSpace,
00352 quint32 numPixels,
00353 qint32 renderingIntent = INTENT_PERCEPTUAL) const = 0;
00354
00355
00356
00357
00358
00359
00360
00361
00362
00366 virtual quint8 getAlpha(const quint8 * pixel) const = 0;
00367
00376 virtual void setAlpha(quint8 * pixels, quint8 alpha, qint32 nPixels) const = 0;
00377
00386 virtual void multiplyAlpha(quint8 * pixels, quint8 alpha, qint32 nPixels) const = 0;
00387
00393 virtual void applyAlphaU8Mask(quint8 * pixels, const quint8 * alpha, qint32 nPixels) const = 0;
00394
00400 virtual void applyInverseAlphaU8Mask(quint8 * pixels, const quint8 * alpha, qint32 nPixels) const = 0;
00401
00406 virtual KoColorAdjustment *createBrightnessContrastAdjustment(quint16 *transferValues) const = 0;
00407
00411 virtual KoColorAdjustment *createDesaturateAdjustment() const = 0;
00412
00417 virtual KoColorAdjustment *createPerChannelAdjustment(quint16 **transferValues) const = 0;
00418
00422 virtual void applyAdjustment(const quint8 *src, quint8 *dst, KoColorAdjustment *, qint32 nPixels) const = 0;
00423
00427 virtual void invertColor(quint8 * src, qint32 nPixels) const = 0;
00428
00429
00433 virtual quint8 difference(const quint8* src1, const quint8* src2) const = 0;
00434
00435
00439 virtual void mixColors(const quint8 **colors, const quint8 *weights, quint32 nColors, quint8 *dst) const = 0;
00440
00445 virtual void convolveColors(quint8** colors, qint32* kernelValues, KoChannelInfo::enumChannelFlags channelFlags, quint8 *dst, qint32 factor, qint32 offset, qint32 nPixels) const = 0;
00446
00453 virtual void darken(const quint8 * src, quint8 * dst, qint32 shade, bool compensate, double compensation, qint32 nPixels) const = 0;
00454
00458 virtual quint8 intensity8(const quint8 * src) const = 0;
00459
00463 virtual KoID mathToolboxID() const =0;
00464
00485 virtual void bitBlt(quint8 *dst,
00486 qint32 dststride,
00487 KoColorSpace * srcSpace,
00488 const quint8 *src,
00489 qint32 srcRowStride,
00490 const quint8 *srcAlphaMask,
00491 qint32 maskRowStride,
00492 quint8 opacity,
00493 qint32 rows,
00494 qint32 cols,
00495 const KoCompositeOp * op,
00496 const QBitArray & channelFlags) const;
00500 virtual void bitBlt(quint8 *dst,
00501 qint32 dststride,
00502 KoColorSpace * srcSpace,
00503 const quint8 *src,
00504 qint32 srcRowStride,
00505 const quint8 *srcAlphaMask,
00506 qint32 maskRowStride,
00507 quint8 opacity,
00508 qint32 rows,
00509 qint32 cols,
00510 const KoCompositeOp * op) const;
00511
00515 virtual void bitBlt(quint8 *dst,
00516 qint32 dststride,
00517 KoColorSpace * srcSpace,
00518 const quint8 *src,
00519 qint32 srcRowStride,
00520 const quint8 *srcAlphaMask,
00521 qint32 maskRowStride,
00522 quint8 opacity,
00523 qint32 rows,
00524 qint32 cols,
00525 const QString & op,
00526 const QBitArray & channelFlags) const;
00527
00531 virtual void bitBlt(quint8 *dst,
00532 qint32 dststride,
00533 KoColorSpace * srcSpace,
00534 const quint8 *src,
00535 qint32 srcRowStride,
00536 const quint8 *srcAlphaMask,
00537 qint32 maskRowStride,
00538 quint8 opacity,
00539 qint32 rows,
00540 qint32 cols,
00541 const QString& op) const;
00542
00543
00544
00550 virtual Q3ValueList<KisFilter*> createBackgroundFilters() const
00551 { return Q3ValueList<KisFilter*>(); };
00552
00553 private:
00554
00555 QString m_id;
00556 QString m_name;
00557
00558 protected:
00559 KoColorSpaceRegistry * m_parent;
00560 Q3ValueVector<KoChannelInfo *> m_channels;
00561 QHash<QString, KoCompositeOp *> m_compositeOps;
00562 mutable Q3MemArray<quint8> m_conversionCache;
00563
00564 };
00565
00566 class KoColorSpaceFactory {
00567 public:
00568 virtual ~KoColorSpaceFactory() {}
00573 virtual KoID id() const = 0;
00574
00578 virtual quint32 colorSpaceType() = 0;
00579
00580 virtual icColorSpaceSignature colorSpaceSignature() = 0;
00581
00582 virtual KoColorSpace *createColorSpace(KoColorSpaceRegistry * parent, KoColorProfile *) = 0;
00583
00589 virtual QString defaultProfile() = 0;
00590
00591 };
00592
00593 #endif // KOCOLORSPACE_H