Implement the missing raster operations that were in Qt 3
authorAndy Shaw <andy.shaw@digia.com>
Thu, 13 Sep 2012 15:56:20 +0000 (17:56 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 27 Sep 2012 04:07:15 +0000 (06:07 +0200)
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>
src/gui/painting/qdrawhelper.cpp
src/gui/painting/qdrawhelper_iwmmxt.cpp
src/gui/painting/qdrawhelper_p.h
src/gui/painting/qdrawhelper_sse2.cpp
src/gui/painting/qdrawhelper_x86_p.h
src/gui/painting/qpainter.cpp
src/gui/painting/qpainter.h

index ce15679..0f8fde1 100644 (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;
index c959010..b3f7a45 100644 (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)
index 3ff75a3..439882a 100644 (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;
index e767264..e72b9ba 100644 (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
 
index d31f87b..ee47c41 100644 (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
 
index 380a697..02555b6 100644 (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}
 */
index 47ffc8d..c6c0e39 100644 (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;