26
27
#include <klocale.h>
30
#include "KoAlphaColorSpace.h"
31
29
#include "KoChannelInfo.h"
33
31
#include "KoIntegerMaths.h"
34
32
#include "KoCompositeOpOver.h"
35
33
#include "KoCompositeOpErase.h"
36
34
#include "KoCompositeOpAlphaDarken.h"
39
const quint8 PIXEL_MASK = 0;
41
class CompositeClear : public KoCompositeOp {
45
CompositeClear(KoColorSpace * cs)
46
: KoCompositeOp(cs, COMPOSITE_CLEAR, i18n("Clear" ), KoCompositeOp::categoryMix() )
52
using KoCompositeOp::composite;
54
void composite(quint8 *dst,
58
const quint8 *maskRowStart,
63
const QBitArray & channelFlags) const
66
Q_UNUSED( srcstride );
68
Q_UNUSED( channelFlags );
73
if (rows <= 0 || cols <= 0)
76
if ( maskRowStart == 0 ) {
78
linesize = sizeof(quint8) * cols;
82
memset(d, OPACITY_TRANSPARENT, linesize);
89
const quint8 *mask = maskRowStart;
93
for (qint32 i = cols; i > 0; i--, d++) {
94
// If the mask tells us to completely not
95
// blend this pixel, continue.
97
if ( mask[0] == OPACITY_TRANSPARENT ) {
103
// linesize is uninitialized here, so it just crashes
104
//memset(d, OPACITY_TRANSPARENT, linesize);
108
maskRowStart += maskstride;
116
class CompositeSubtract : public KoCompositeOp {
120
CompositeSubtract(KoColorSpace * cs)
121
: KoCompositeOp(cs, COMPOSITE_SUBTRACT, i18n("Subtract" ), KoCompositeOp::categoryArithmetic() )
127
using KoCompositeOp::composite;
129
void composite(quint8 *dst,
133
const quint8 *maskRowStart,
138
const QBitArray & channelFlags) const
142
Q_UNUSED( channelFlags );
149
if (rows <= 0 || cols <= 0)
153
const quint8 *mask = maskRowStart;
157
for (i = cols; i > 0; i--, d++, s++) {
159
// If the mask tells us to completely not
160
// blend this pixel, continue.
162
if ( mask[0] == OPACITY_TRANSPARENT ) {
35
#include <colorprofiles/KoDummyColorProfile.h>
39
const quint8 PIXEL_MASK = 0;
41
class CompositeClear : public KoCompositeOp
46
CompositeClear(KoColorSpace * cs)
47
: KoCompositeOp(cs, COMPOSITE_CLEAR, i18n("Clear"), KoCompositeOp::categoryMix()) {
52
using KoCompositeOp::composite;
54
void composite(quint8 *dst,
58
const quint8 *maskRowStart,
63
const QBitArray & channelFlags) const {
67
Q_UNUSED(channelFlags);
72
if (rows <= 0 || cols <= 0)
75
if (maskRowStart == 0) {
77
linesize = sizeof(quint8) * cols;
81
memset(d, OPACITY_TRANSPARENT_U8, linesize);
87
const quint8 *mask = maskRowStart;
91
for (qint32 i = cols; i > 0; i--, d++) {
92
// If the mask tells us to completely not
93
// blend this pixel, continue.
95
if (mask[0] == OPACITY_TRANSPARENT_U8) {
169
if (d[PIXEL_MASK] <= s[PIXEL_MASK]) {
170
d[PIXEL_MASK] = OPACITY_TRANSPARENT;
172
d[PIXEL_MASK] -= s[PIXEL_MASK];
180
maskRowStart += maskstride;
101
// linesize is uninitialized here, so it just crashes
102
//memset(d, OPACITY_TRANSPARENT, linesize);
106
maskRowStart += maskstride;
114
class CompositeSubtract : public KoCompositeOp
119
CompositeSubtract(KoColorSpace * cs)
120
: KoCompositeOp(cs, COMPOSITE_SUBTRACT, i18n("Subtract"), KoCompositeOp::categoryArithmetic()) {
125
using KoCompositeOp::composite;
127
void composite(quint8 *dst,
131
const quint8 *maskRowStart,
136
const QBitArray & channelFlags) const {
139
Q_UNUSED(channelFlags);
146
if (rows <= 0 || cols <= 0)
150
const quint8 *mask = maskRowStart;
154
for (i = cols; i > 0; i--, d++, s++) {
156
// If the mask tells us to completely not
157
// blend this pixel, continue.
159
if (mask[0] == OPACITY_TRANSPARENT_U8) {
166
if (d[PIXEL_MASK] <= s[PIXEL_MASK]) {
167
d[PIXEL_MASK] = OPACITY_TRANSPARENT_U8;
169
d[PIXEL_MASK] -= s[PIXEL_MASK];
177
maskRowStart += maskstride;
188
185
KoAlphaColorSpace::KoAlphaColorSpace() :
189
KoColorSpaceAbstract<AlphaU8Traits>("ALPHA", i18n("Alpha mask") )
186
KoColorSpaceAbstract<AlphaU8Traits>("ALPHA", i18n("Alpha mask"))
191
addChannel(new KoChannelInfo(i18n("Alpha"), 0, KoChannelInfo::ALPHA, KoChannelInfo::UINT8));
192
addCompositeOp( new KoCompositeOpOver<AlphaU8Traits>( this ) );
193
addCompositeOp( new CompositeClear( this ) );
194
addCompositeOp( new KoCompositeOpErase<AlphaU8Traits>( this ) );
195
addCompositeOp( new CompositeSubtract( this ) );
196
addCompositeOp( new KoCompositeOpAlphaDarken<AlphaU8Traits>( this ) );
188
addChannel(new KoChannelInfo(i18n("Alpha"), 0, 0, KoChannelInfo::ALPHA, KoChannelInfo::UINT8));
189
addCompositeOp(new KoCompositeOpOver<AlphaU8Traits>(this));
190
addCompositeOp(new CompositeClear(this));
191
addCompositeOp(new KoCompositeOpErase<AlphaU8Traits>(this));
192
addCompositeOp(new CompositeSubtract(this));
193
addCompositeOp(new KoCompositeOpAlphaDarken<AlphaU8Traits>(this));
194
m_profile = new KoDummyColorProfile;
199
197
KoAlphaColorSpace::~KoAlphaColorSpace()
203
203
void KoAlphaColorSpace::fromQColor(const QColor& c, quint8 *dst, const KoColorProfile * /*profile*/) const
282
if ( channelFlags.isEmpty() || channelFlags.testBit(PIXEL_MASK) )
283
dst[PIXEL_MASK] = CLAMP((totalAlpha/ factor) + offset, 0, SCHAR_MAX);
264
if (channelFlags.isEmpty() || channelFlags.testBit(PIXEL_MASK))
265
dst[PIXEL_MASK] = CLAMP((totalAlpha / factor) + offset, 0, SCHAR_MAX);
286
269
QImage KoAlphaColorSpace::convertToQImage(const quint8 *data, qint32 width, qint32 height,
287
const KoColorProfile * /*dstProfile*/, KoColorConversionTransformation::Intent /*renderingIntent*/) const
270
const KoColorProfile * /*dstProfile*/, KoColorConversionTransformation::Intent /*renderingIntent*/) const
289
QImage img(width, height, QImage::Format_RGB32);
272
QImage img(width, height, QImage::Format_Indexed8);
274
for (int i = 0; i < 256; ++i) table.append(qRgb(i, i, i));
275
img.setColorTable(table);
291
for (int x = 0; x < width; x++) {
292
for (int y = 0; y < height; y++) {
293
quint8 c = data[x + y * width];
294
img.setPixel(x, y, qRgb(c, c, c));
278
for (int i = 0; i < height; ++i) {
279
data_img=img.scanLine(i);
280
for (int j = 0; j < width; j++)
281
data_img[j]=*(data++);