F:/KPlato/koffice/libs/pigment/KoColorSpace.h

Aller à la documentation de ce fichier.
00001 /*
00002  *  Copyright (c) 2005 Boudewijn Rempt <boud@valdyas.org>
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public License
00015  * along with this library; see the file COPYING.LIB.  If not, write to
00016  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
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 // TODO: constify all function of KisColorSpace
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     //========== Channels =====================================================//
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     //========== Identification ===============================================//
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     //========== Capabilities =================================================//
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     //========== Display profiles =============================================//
00227 
00231     virtual KoColorProfile * getProfile() const = 0;
00232 
00233 //================= Conversion functions ==================================//
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 //============================== Manipulation functions ==========================//
00356 
00357 
00358 //
00359 // The manipulation functions have default implementations that _convert_ the pixel
00360 // to a QColor and back. Reimplement these methods in your color strategy!
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     // XXX: What with alpha channels? YYY: Add an overloaded function that takes alpha into account?
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; // XXX: This will be a bad problem when we have threading.
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

Généré le Wed Nov 22 23:41:13 2006 pour KPlato par  doxygen 1.5.1-p1