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

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 
00020 #include "KoColorSpace.h"
00021 
00022 #include <kdebug.h>
00023 
00024 #include "KoCompositeOp.h"
00025 
00026 KoColorSpace::KoColorSpace(const QString &id, const QString &name, KoColorSpaceRegistry * parent)
00027     : m_id(id)
00028     , m_name( name )
00029     , m_parent( parent )
00030 {
00031     //m_dcop = 0;
00032 }
00033 
00034 KoColorSpace::~KoColorSpace()
00035 {
00036     //delete m_dcop;
00037 }
00038 
00039 quint8 *KoColorSpace::allocPixelBuffer(quint32 numPixels) const
00040 {
00041     return new quint8[pixelSize()*numPixels];
00042 }
00043 
00044 KoCompositeOpList KoColorSpace::userVisiblecompositeOps() const
00045 {
00046     return m_compositeOps.values();
00047 }
00048 
00049 const KoCompositeOp * KoColorSpace::compositeOp(const QString & id) const
00050 {
00051     if ( m_compositeOps.contains( id ) )
00052         return m_compositeOps.value( id );
00053     else
00054         return m_compositeOps.value( COMPOSITE_OVER );
00055 }
00056 
00057 void KoColorSpace::addCompositeOp(const KoCompositeOp * op)
00058 {
00059     if ( op->colorSpace()->id() == id()) {
00060         m_compositeOps.insert( op->id(), const_cast<KoCompositeOp*>( op ) );
00061     }
00062 }
00063 
00064 
00065 bool KoColorSpace::convertPixelsTo(const quint8 * src,
00066                                    quint8 * dst,
00067                                    const KoColorSpace * dstColorSpace,
00068                                    quint32 numPixels,
00069                                    qint32 renderingIntent) const
00070 {
00071     Q_UNUSED(renderingIntent);
00072     // 4 channels: labA, 2 bytes per lab channel
00073     quint8 *pixels = new quint8[2*4*numPixels];
00074 
00075     toLabA16(src, pixels,numPixels);
00076     dstColorSpace->fromLabA16(pixels, dst,numPixels);
00077 
00078     delete [] pixels;
00079 
00080     return true;
00081 }
00082 
00083 void KoColorSpace::bitBlt(quint8 *dst,
00084                           qint32 dststride,
00085                           KoColorSpace * srcSpace,
00086                           const quint8 *src,
00087                           qint32 srcRowStride,
00088                           const quint8 *srcAlphaMask,
00089                           qint32 maskRowStride,
00090                           quint8 opacity,
00091                           qint32 rows,
00092                           qint32 cols,
00093                           const QString & op,
00094                           const QBitArray & channelFlags) const
00095 {
00096     if ( m_compositeOps.contains( op ) ) {
00097         bitBlt(dst, dststride, srcSpace, src, srcRowStride, srcAlphaMask, maskRowStride, opacity, rows, cols, m_compositeOps.value( op ), channelFlags);
00098     }
00099     else {
00100         bitBlt(dst, dststride, srcSpace, src, srcRowStride, srcAlphaMask, maskRowStride, opacity, rows, cols, m_compositeOps.value( COMPOSITE_OVER ), channelFlags);
00101     }
00102 
00103 }
00104 
00105 void KoColorSpace::bitBlt(quint8 *dst,
00106                           qint32 dststride,
00107                           KoColorSpace * srcSpace,
00108                           const quint8 *src,
00109                           qint32 srcRowStride,
00110                           const quint8 *srcAlphaMask,
00111                           qint32 maskRowStride,
00112                           quint8 opacity,
00113                           qint32 rows,
00114                           qint32 cols,
00115                           const QString& op) const
00116 {
00117     if ( m_compositeOps.contains( op ) ) {
00118         bitBlt(dst, dststride, srcSpace, src, srcRowStride, srcAlphaMask, maskRowStride, opacity, rows, cols, m_compositeOps.value( op ));
00119     }
00120     else {
00121         bitBlt(dst, dststride, srcSpace, src, srcRowStride, srcAlphaMask, maskRowStride, opacity, rows, cols, m_compositeOps.value( COMPOSITE_OVER ) );
00122     }
00123 }
00124 
00125 void KoColorSpace::bitBlt(quint8 *dst,
00126                                    qint32 dststride,
00127                                    KoColorSpace * srcSpace,
00128                                    const quint8 *src,
00129                                    qint32 srcRowStride,
00130                                    const quint8 *srcAlphaMask,
00131                                    qint32 maskRowStride,
00132                                    quint8 opacity,
00133                                    qint32 rows,
00134                                    qint32 cols,
00135                                    const KoCompositeOp * op,
00136                                    const QBitArray & channelFlags) const
00137 {
00138     if (rows <= 0 || cols <= 0)
00139         return;
00140 
00141     if (this != srcSpace) {
00142         quint32 len = pixelSize() * rows * cols;
00143 
00144         // If our conversion cache is too small, extend it.
00145         if (!m_conversionCache.resize( len, Q3GArray::SpeedOptim )) {
00146             kWarning() << "Could not allocate enough memory for the conversion!\n";
00147             // XXX: We should do a slow, pixel by pixel bitblt here...
00148             abort();
00149         }
00150 
00151         for (qint32 row = 0; row < rows; row++) {
00152             srcSpace->convertPixelsTo(src + row * srcRowStride,
00153                                       m_conversionCache.data() + row * cols * pixelSize(), this,
00154                                       cols);
00155         }
00156 
00157         // The old srcRowStride is no longer valid because we converted to the current cs
00158         srcRowStride = cols * pixelSize();
00159 
00160         op->composite( dst, dststride,
00161                        m_conversionCache.data(), srcRowStride,
00162                        srcAlphaMask, maskRowStride,
00163                        rows,  cols,
00164                        opacity, channelFlags );
00165 
00166     }
00167     else {
00168         op->composite( dst, dststride,
00169                        src, srcRowStride,
00170                        srcAlphaMask, maskRowStride,
00171                        rows,  cols,
00172                        opacity, channelFlags );
00173     }
00174 }
00175 
00176 // XXX: I don't want this code duplication, but also don't want an
00177 //      extra function call in this critical section of code. What to
00178 //      do?
00179 void KoColorSpace::bitBlt(quint8 *dst,
00180                                    qint32 dststride,
00181                                    KoColorSpace * srcSpace,
00182                                    const quint8 *src,
00183                                    qint32 srcRowStride,
00184                                    const quint8 *srcAlphaMask,
00185                                    qint32 maskRowStride,
00186                                    quint8 opacity,
00187                                    qint32 rows,
00188                                    qint32 cols,
00189                                    const KoCompositeOp * op) const
00190 {
00191     if (rows <= 0 || cols <= 0)
00192         return;
00193 
00194     if (this != srcSpace) {
00195         quint32 len = pixelSize() * rows * cols;
00196 
00197         // If our conversion cache is too small, extend it.
00198         if (!m_conversionCache.resize( len, Q3GArray::SpeedOptim )) {
00199             kWarning() << "Could not allocate enough memory for the conversion!\n";
00200             // XXX: We should do a slow, pixel by pixel bitblt here...
00201             abort();
00202         }
00203 
00204         for (qint32 row = 0; row < rows; row++) {
00205             srcSpace->convertPixelsTo(src + row * srcRowStride,
00206                                       m_conversionCache.data() + row * cols * pixelSize(), this,
00207                                       cols);
00208         }
00209 
00210         // The old srcRowStride is no longer valid because we converted to the current cs
00211         srcRowStride = cols * pixelSize();
00212 
00213         op->composite( dst, dststride,
00214                        m_conversionCache.data(), srcRowStride,
00215                        srcAlphaMask, maskRowStride,
00216                        rows,  cols,
00217                        opacity);
00218 
00219     }
00220     else {
00221         op->composite( dst, dststride,
00222                        src,srcRowStride,
00223                        srcAlphaMask, maskRowStride,
00224                        rows,  cols,
00225                        opacity);
00226     }
00227 }

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