Implement the missing raster operations that were in Qt 3

Although not widely used, the raster operations from Qt 3 were useful
and some of them were already implemented, this brings the rest of them
back for those who need them.

Change-Id: Id538611eaaba9be3d39bf2dd33b6c532f5d4aba8
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
This commit is contained in:
Andy Shaw 2012-09-13 17:56:20 +02:00 committed by The Qt Project
parent 12e5464fa3
commit ae0ddb8c72
7 changed files with 173 additions and 9 deletions

View File

@ -3653,6 +3653,107 @@ void QT_FASTCALL rasterop_SourceAndNotDestination(uint *Q_DECL_RESTRICT dest,
}
}
void QT_FASTCALL rasterop_NotSourceOrDestination(uint *Q_DECL_RESTRICT dest,
const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
Q_UNUSED(const_alpha);
while (length--) {
*dest = (~(*src) | *dest) | 0xff000000;
++dest; ++src;
}
}
void QT_FASTCALL rasterop_solid_NotSourceOrDestination(uint *Q_DECL_RESTRICT dest,
int length,
uint color,
uint const_alpha)
{
Q_UNUSED(const_alpha);
color = ~color | 0xff000000;
while (length--)
*dest++ |= color;
}
void QT_FASTCALL rasterop_SourceOrNotDestination(uint *Q_DECL_RESTRICT dest,
const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
Q_UNUSED(const_alpha);
while (length--) {
*dest = (*src | ~(*dest)) | 0xff000000;
++dest; ++src;
}
}
void QT_FASTCALL rasterop_solid_SourceOrNotDestination(uint *Q_DECL_RESTRICT dest,
int length,
uint color,
uint const_alpha)
{
Q_UNUSED(const_alpha);
while (length--) {
*dest = (color | ~(*dest)) | 0xff000000;
++dest;
}
}
void QT_FASTCALL rasterop_ClearDestination(uint *Q_DECL_RESTRICT dest,
const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
Q_UNUSED(src);
comp_func_solid_SourceOver (dest, length, 0xff000000, const_alpha);
}
void QT_FASTCALL rasterop_solid_ClearDestination(uint *Q_DECL_RESTRICT dest,
int length,
uint color,
uint const_alpha)
{
Q_UNUSED(color);
comp_func_solid_SourceOver (dest, length, 0xff000000, const_alpha);
}
void QT_FASTCALL rasterop_SetDestination(uint *Q_DECL_RESTRICT dest,
const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
Q_UNUSED(src);
comp_func_solid_SourceOver (dest, length, 0xffffffff, const_alpha);
}
void QT_FASTCALL rasterop_solid_SetDestination(uint *Q_DECL_RESTRICT dest,
int length,
uint color,
uint const_alpha)
{
Q_UNUSED(color);
comp_func_solid_SourceOver (dest, length, 0xffffffff, const_alpha);
}
void QT_FASTCALL rasterop_NotDestination(uint *Q_DECL_RESTRICT dest,
const uint *Q_DECL_RESTRICT src,
int length,
uint const_alpha)
{
Q_UNUSED(src);
rasterop_solid_SourceXorDestination (dest, length, 0x00ffffff, const_alpha);
}
void QT_FASTCALL rasterop_solid_NotDestination(uint *Q_DECL_RESTRICT dest,
int length,
uint color,
uint const_alpha)
{
Q_UNUSED(color);
rasterop_solid_SourceXorDestination (dest, length, 0x00ffffff, const_alpha);
}
static CompositionFunctionSolid functionForModeSolid_C[] = {
comp_func_solid_SourceOver,
comp_func_solid_DestinationOver,
@ -3686,7 +3787,13 @@ static CompositionFunctionSolid functionForModeSolid_C[] = {
rasterop_solid_NotSourceXorDestination,
rasterop_solid_NotSource,
rasterop_solid_NotSourceAndDestination,
rasterop_solid_SourceAndNotDestination
rasterop_solid_SourceAndNotDestination,
rasterop_solid_SourceAndNotDestination,
rasterop_solid_NotSourceOrDestination,
rasterop_solid_SourceOrNotDestination,
rasterop_solid_ClearDestination,
rasterop_solid_SetDestination,
rasterop_solid_NotDestination
};
static const CompositionFunctionSolid *functionForModeSolid = functionForModeSolid_C;
@ -3724,7 +3831,13 @@ static CompositionFunction functionForMode_C[] = {
rasterop_NotSourceXorDestination,
rasterop_NotSource,
rasterop_NotSourceAndDestination,
rasterop_SourceAndNotDestination
rasterop_SourceAndNotDestination,
rasterop_SourceAndNotDestination,
rasterop_NotSourceOrDestination,
rasterop_SourceOrNotDestination,
rasterop_ClearDestination,
rasterop_SetDestination,
rasterop_NotDestination
};
static const CompositionFunction *functionForMode = functionForMode_C;

View File

@ -98,7 +98,12 @@ CompositionFunctionSolid qt_functionForModeSolid_IWMMXT[numCompositionFunctions]
rasterop_solid_NotSourceXorDestination<QIWMMXTIntrinsics>,
rasterop_solid_NotSource<QIWMMXTIntrinsics>,
rasterop_solid_NotSourceAndDestination<QIWMMXTIntrinsics>,
rasterop_solid_SourceAndNotDestination<QIWMMXTIntrinsics>
rasterop_solid_SourceAndNotDestination<QIWMMXTIntrinsics>,
rasterop_solid_NotSourceOrDestination<QIWMMXTIntrinsics>,
rasterop_solid_SourceOrNotDestination<QIWMMXTIntrinsics>,
rasterop_solid_ClearDestination<QIWMMXTIntrinsics>,
rasterop_solid_SetDestination<QIWMMXTIntrinsics>,
rasterop_solid_NotDestination<QIWMMXTIntrinsics>
};
CompositionFunction qt_functionForMode_IWMMXT[] = {
@ -134,7 +139,12 @@ CompositionFunction qt_functionForMode_IWMMXT[] = {
rasterop_NotSourceXorDestination,
rasterop_NotSource,
rasterop_NotSourceAndDestination,
rasterop_SourceAndNotDestination
rasterop_SourceAndNotDestination,
rasterop_NotSourceOrDestination,
rasterop_SourceOrNotDestination,
rasterop_ClearDestination,
rasterop_SetDestination,
rasterop_NotDestination
};
void qt_blend_color_argb_iwmmxt(int count, const QSpan *spans, void *userData)

View File

@ -926,7 +926,11 @@ void QT_FASTCALL rasterop_NotSourceXorDestination(uint *dest, const uint *src, i
void QT_FASTCALL rasterop_NotSource(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_NotSourceAndDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_SourceAndNotDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_NotSourceOrDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_SourceOrNotDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_ClearDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_SetDestination(uint *dest, const uint *src, int length, uint const_alpha);
void QT_FASTCALL rasterop_NotDestination(uint *dest, const uint *src, int length, uint const_alpha);
// prototypes of all the solid composition functions
void QT_FASTCALL comp_func_solid_SourceOver(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL comp_func_solid_DestinationOver(uint *dest, int length, uint color, uint const_alpha);
@ -961,6 +965,11 @@ void QT_FASTCALL rasterop_solid_NotSourceXorDestination(uint *dest, int length,
void QT_FASTCALL rasterop_solid_NotSource(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_NotSourceAndDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_SourceAndNotDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_NotSourceOrDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_SourceOrNotDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_ClearDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_SetDestination(uint *dest, int length, uint color, uint const_alpha);
void QT_FASTCALL rasterop_solid_NotDestination(uint *dest, int length, uint color, uint const_alpha);
struct QPixelLayout;

View File

@ -347,7 +347,12 @@ CompositionFunctionSolid qt_functionForModeSolid_SSE2[numCompositionFunctions] =
rasterop_solid_NotSourceXorDestination,
rasterop_solid_NotSource,
rasterop_solid_NotSourceAndDestination,
rasterop_solid_SourceAndNotDestination
rasterop_solid_SourceAndNotDestination,
rasterop_solid_NotSourceOrDestination,
rasterop_solid_SourceOrNotDestination,
rasterop_solid_ClearDestination,
rasterop_solid_SetDestination,
rasterop_solid_NotDestination
};
CompositionFunction qt_functionForMode_SSE2[numCompositionFunctions] = {
@ -383,7 +388,12 @@ CompositionFunction qt_functionForMode_SSE2[numCompositionFunctions] = {
rasterop_NotSourceXorDestination,
rasterop_NotSource,
rasterop_NotSourceAndDestination,
rasterop_SourceAndNotDestination
rasterop_SourceAndNotDestination,
rasterop_NotSourceOrDestination,
rasterop_SourceOrNotDestination,
rasterop_ClearDestination,
rasterop_SetDestination,
rasterop_NotDestination
};
#endif

View File

@ -105,7 +105,7 @@ extern CompositionFunction qt_functionForMode_IWMMXT[];
extern CompositionFunctionSolid qt_functionForModeSolid_IWMMXT[];
#endif
static const int numCompositionFunctions = 33;
static const int numCompositionFunctions = 38;
QT_END_NAMESPACE

View File

@ -2320,6 +2320,23 @@ void QPainter::setBrushOrigin(const QPointF &p)
where the source is AND'ed with the inverted destination pixels
(src AND (NOT dst)).
\value RasterOp_NotSourceOrDestination Does a bitwise operation
where the source is inverted and then OR'ed with the destination
((NOT src) OR dst).
\value RasterOp_ClearDestination The pixels in the destination are
cleared (set to 0) independent of the source.
\value RasterOp_SetDestination The pixels in the destination are
set (set to 1) independent of the source.
\value RasterOp_NotDestination Does a bitwise operation
where the destination pixels are inverted (NOT dst).
\value RasterOp_SourceOrNotDestination Does a bitwise operation
where the source is OR'ed with the inverted destination pixels
(src OR (NOT dst)).
\sa compositionMode(), setCompositionMode(), {QPainter#Composition
Modes}{Composition Modes}, {Image Composition Example}
*/

View File

@ -171,7 +171,12 @@ public:
RasterOp_NotSourceXorDestination,
RasterOp_NotSource,
RasterOp_NotSourceAndDestination,
RasterOp_SourceAndNotDestination
RasterOp_SourceAndNotDestination,
RasterOp_NotSourceOrDestination,
RasterOp_SourceOrNotDestination,
RasterOp_ClearDestination,
RasterOp_SetDestination,
RasterOp_NotDestination
};
void setCompositionMode(CompositionMode mode);
CompositionMode compositionMode() const;