00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00032 }
00033
00034 KoColorSpace::~KoColorSpace()
00035 {
00036
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
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
00145 if (!m_conversionCache.resize( len, Q3GArray::SpeedOptim )) {
00146 kWarning() << "Could not allocate enough memory for the conversion!\n";
00147
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
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
00177
00178
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
00198 if (!m_conversionCache.resize( len, Q3GArray::SpeedOptim )) {
00199 kWarning() << "Could not allocate enough memory for the conversion!\n";
00200
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
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 }