--- a/holdingarea/vg/2D_OpenVG_1_1_SF/ri/src/riRasterizer.h Thu Sep 16 12:43:44 2010 +0100
+++ b/holdingarea/vg/2D_OpenVG_1_1_SF/ri/src/riRasterizer.h Mon Sep 20 14:29:05 2010 +0100
@@ -1,279 +1,279 @@
-#ifndef __RIRASTERIZER_H
-#define __RIRASTERIZER_H
-
-/*------------------------------------------------------------------------
- *
- * OpenVG 1.1 Reference Implementation
- * -----------------------------------
- *
- * Copyright (c) 2007 The Khronos Group Inc.
- * Portions copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and /or associated documentation files
- * (the "Materials "), to deal in the Materials without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Materials,
- * and to permit persons to whom the Materials are furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Materials.
- *
- * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
- * THE USE OR OTHER DEALINGS IN THE MATERIALS.
- *
- *//**
- * \file
- * \brief Rasterizer class.
- * \note
- *//*-------------------------------------------------------------------*/
-
-#ifndef __RIMATH_H
-#include "riMath.h"
-#endif
-
-#ifndef __RIARRAY_H
-#include "riArray.h"
-#endif
-
-#ifndef __RIPIXELPIPE_H
-#include "riPixelPipe.h"
-#endif
-
-// TESTING ONLY!!
-#include "sfDynamicPixelPipe.h"
-
-#if defined(RI_DEBUG)
-# include <stdio.h>
-#endif
-// \todo SSE2 probably has everything necessary and matches the minimum platform requirements.
-// SSE4 is probably too new. SSE3?
-// \note This will cause the code to not compile on MSVC...
-#define USE_SSE2
-
-#if defined(USE_SSE2)
-// \todo only the last include is needed: QT creator does not find types if others not included.
-# include <mmintrin.h>
-# include <xmmintrin.h>
-# include <emmintrin.h>
-#endif
-
-//=======================================================================
-
-namespace OpenVGRI
-{
-
-/*-------------------------------------------------------------------*//*!
-* \brief Scalar and vector data types used by the rasterizer.
-* \param
-* \return
-* \note
-*//*-------------------------------------------------------------------*/
-
-typedef RIfloat RScalar; //change this if you want to have different precision for rasterizer scalars and RIfloat
-
-struct RVector2
-{
- RI_INLINE RVector2() { }
- RI_INLINE RVector2(const Vector2& v) { x = v.x; y = v.y; }
- RI_INLINE RVector2(RIfloat vx, RIfloat vy) { x = vx; y = vy; }
- RI_INLINE void set(RIfloat vx, RIfloat vy) { x = vx; y = vy; }
- RScalar x;
- RScalar y;
-};
-
-struct IVector2
-{
- RI_INLINE IVector2() {}
- RI_INLINE IVector2(const IVector2& v) { x = v.x; y = v.y; }
- RI_INLINE IVector2(const Vector2& v) { x = (int)v.x; y = (int) v.y; }
- RI_INLINE IVector2(int vx, int vy) { x = vx; y = vy; }
- RI_INLINE void set(int vx, int vy) { x = vx; y = vy; }
- int x;
- int y;
-};
-
-struct Span
-{
- RIuint16 x0;
- RIuint16 y;
- RIuint16 len;
- RIuint8 coverage;
- RIuint8 pad; // align to 8 bytes. \temp Use qualifiers instead?
-};
-
-/*-------------------------------------------------------------------*//*!
-* \brief Converts a set of edges to coverage values for each pixel and
-* calls PixelPipe::pixelPipe for painting a pixel.
-* \param
-* \return
-* \note
-*//*-------------------------------------------------------------------*/
-
-class Rasterizer
-{
-public:
- Rasterizer(); //throws bad_alloc
- ~Rasterizer();
-
- void setup(int vpx, int vpy, int vpwidth, int vpheight, VGFillRule fillRule, const PixelPipe* pixelPipe);
- void setScissor(const Array<Rectangle>& scissors); //throws bad_alloc
- void setScissoring(bool enabled);
-
- void clear();
- void addEdge(const Vector2& v0, const Vector2& v1); //throws bad_alloc
-
- RI_INLINE void setAntiAliasing(bool enable) { m_aa = enable; }
- void fill(); //throws bad_alloc
-
- void getBBox(int& sx, int& sy, int& ex, int& ey) const { sx = m_covMinx; sy = m_covMiny; ex = m_covMaxx; ey = m_covMaxy; }
-
-public:
- enum { SAMPLE_BITS = 3 };
- enum { Y_BITS = SAMPLE_BITS };
- enum { MAX_COVERAGE = 1<<SAMPLE_BITS };
-
- // temp!:
- RIuint32 *m_covBuffer;
- size_t m_covBufferSz;
-
-private:
- Rasterizer(const Rasterizer&); //!< Not allowed.
- const Rasterizer& operator=(const Rasterizer&); //!< Not allowed.
-
-public:
- struct ScissorEdge
- {
- ScissorEdge() {}
- bool operator<(const ScissorEdge& e) const { return x < e.x; }
- int x;
- int miny;
- int maxy;
- int direction; //1 start, -1 end
- };
-
- struct Edge
- {
- Edge() {}
- bool operator<(const Edge& e) const { return v0.y < e.v0.y; }
-#if defined(RI_DEBUG)
- bool operator<=(const Edge& e) const {return v0.y <= e.v0.y; }
-#endif
- IVector2 v0;
- IVector2 v1;
- int direction;
- };
-
- struct ActiveEdge
- {
- typedef RIint16 XCoord;
- typedef RIint16 YCoord;
-
- ActiveEdge() {}
- //bool operator<(const ActiveEdge& e) const { return minx < e.minx; }
- bool operator<(const ActiveEdge& e) const
- {
- if (minx < e.minx)
- return true;
- if (minx == e.minx)
- return maxx < e.maxx;
- return false;
- }
-#if defined(RI_DEBUG)
- bool operator<=(const ActiveEdge& e) const { return minx <= e.minx; }
-#endif
- // Fixed-point edge coordinates.
- RIuint32 next; // \todo Pointer?
- int direction; //-1 down, 1 up
- int xRef;
- int slope;
- XCoord minx; // for the current scanline
- XCoord maxx; // for the current scanline
- YCoord yStart; // for the edge
- YCoord yEnd; // for the edge
- };
-
- enum { SF_SAMPLES = 8 };
- enum { RASTERIZER_BITS = 14 };
- enum { RASTERIZER_MASK = ((1<<RASTERIZER_BITS)-1) };
- enum { Y_MASK = ((1<<Y_BITS)-1) };
- enum { X_BITS = 7 };
- enum { XMASK = ((1<<X_BITS)-1) };
- enum { LEFT_DISCARD = -0x100000 };
- enum { LEFT_DISCARD_SHORT = -32768 };
-
- struct Windings
- {
-#if !defined(USE_SSE2)
- Windings() {wq = 0;}
- // \todo Use SSE counters or packed counters!
- // \todo 8 samples -> 64 bits == 2 32-bit uints
- union
- {
- RIint8 winding[SF_SAMPLES];
- RIuint32 wd[SF_SAMPLES/4];
- unsigned long long wq;
- };
-#else
- Windings() { sseWinding = _mm_setzero_si128(); }
- __m128i sseWinding;
-#endif
- };
-
-private:
- void pushEdge(const Edge& edge);
- void clipAndAddEdge(Edge& edge);
- void addBBox(const IVector2& v);
- RI_INLINE void pushSpan(int x, int y, int len, int coverage);
- RI_INLINE void commitSpans();
-
- //RI_INLINE void calculateAEWinding(const ActiveEdge& currAe, Windings& pixel, Windings& scanline, int intY, int pixelX);
-
- Array<ActiveEdge> m_edgePool;
- Array<RIuint32> m_edges;
- Array<ScissorEdge> m_scissorEdges;
- Array<ActiveEdge> m_aet;
- Array<ScissorEdge> m_scissorAet;
- bool m_scissor;
-
- bool m_aa;
-
- IVector2 m_edgeMin;
- IVector2 m_edgeMax;
- int m_covMinx;
- int m_covMiny;
- int m_covMaxx;
- int m_covMaxy;
- int m_vpx;
- int m_vpy;
- int m_vpwidth;
- int m_vpheight;
- int m_vpMinx;
- int m_vpMiny;
- int m_vpMaxx;
- int m_vpMaxy;
- VGFillRule m_fillRule;
- RIuint32 m_fillRuleMask;
-
- const PixelPipe* m_pixelPipe;
- PixelPipe::PPVariants m_ppVariants;
-
- enum { N_CACHED_SPANS = 64 };
- Span m_spanCache[N_CACHED_SPANS];
- int m_nSpans;
-
-};
-
-//=======================================================================
-
-} //namespace OpenVGRI
-
-//=======================================================================
-
-#endif /* __RIRASTERIZER_H */
+#ifndef __RIRASTERIZER_H
+#define __RIRASTERIZER_H
+
+/*------------------------------------------------------------------------
+ *
+ * OpenVG 1.1 Reference Implementation
+ * -----------------------------------
+ *
+ * Copyright (c) 2007 The Khronos Group Inc.
+ * Portions copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and /or associated documentation files
+ * (the "Materials "), to deal in the Materials without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Materials,
+ * and to permit persons to whom the Materials are furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ *
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
+ * THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ *
+ *//**
+ * \file
+ * \brief Rasterizer class.
+ * \note
+ *//*-------------------------------------------------------------------*/
+
+#ifndef __RIMATH_H
+#include "riMath.h"
+#endif
+
+#ifndef __RIARRAY_H
+#include "riArray.h"
+#endif
+
+#ifndef __RIPIXELPIPE_H
+#include "riPixelPipe.h"
+#endif
+
+// TESTING ONLY!!
+#include "sfDynamicPixelPipe.h"
+
+#if defined(RI_DEBUG)
+# include <stdio.h>
+#endif
+// \todo SSE2 probably has everything necessary and matches the minimum platform requirements.
+// SSE4 is probably too new. SSE3?
+// \note This will cause the code to not compile on MSVC...
+#define USE_SSE2
+
+#if defined(USE_SSE2)
+// \todo only the last include is needed: QT creator does not find types if others not included.
+# include <mmintrin.h>
+# include <xmmintrin.h>
+# include <emmintrin.h>
+#endif
+
+//=======================================================================
+
+namespace OpenVGRI
+{
+
+/*-------------------------------------------------------------------*//*!
+* \brief Scalar and vector data types used by the rasterizer.
+* \param
+* \return
+* \note
+*//*-------------------------------------------------------------------*/
+
+typedef RIfloat RScalar; //change this if you want to have different precision for rasterizer scalars and RIfloat
+
+struct RVector2
+{
+ RI_INLINE RVector2() { }
+ RI_INLINE RVector2(const Vector2& v) { x = v.x; y = v.y; }
+ RI_INLINE RVector2(RIfloat vx, RIfloat vy) { x = vx; y = vy; }
+ RI_INLINE void set(RIfloat vx, RIfloat vy) { x = vx; y = vy; }
+ RScalar x;
+ RScalar y;
+};
+
+struct IVector2
+{
+ RI_INLINE IVector2() {}
+ RI_INLINE IVector2(const IVector2& v) { x = v.x; y = v.y; }
+ RI_INLINE IVector2(const Vector2& v) { x = (int)v.x; y = (int) v.y; }
+ RI_INLINE IVector2(int vx, int vy) { x = vx; y = vy; }
+ RI_INLINE void set(int vx, int vy) { x = vx; y = vy; }
+ int x;
+ int y;
+};
+
+struct Span
+{
+ RIuint16 x0;
+ RIuint16 y;
+ RIuint16 len;
+ RIuint8 coverage;
+ RIuint8 pad; // align to 8 bytes. \temp Use qualifiers instead?
+};
+
+/*-------------------------------------------------------------------*//*!
+* \brief Converts a set of edges to coverage values for each pixel and
+* calls PixelPipe::pixelPipe for painting a pixel.
+* \param
+* \return
+* \note
+*//*-------------------------------------------------------------------*/
+
+class Rasterizer
+{
+public:
+ Rasterizer(); //throws bad_alloc
+ ~Rasterizer();
+
+ void setup(int vpx, int vpy, int vpwidth, int vpheight, VGFillRule fillRule, const PixelPipe* pixelPipe);
+ void setScissor(const Array<Rectangle>& scissors); //throws bad_alloc
+ void setScissoring(bool enabled);
+
+ void clear();
+ void addEdge(const Vector2& v0, const Vector2& v1); //throws bad_alloc
+
+ RI_INLINE void setAntiAliasing(bool enable) { m_aa = enable; }
+ void fill(); //throws bad_alloc
+
+ void getBBox(int& sx, int& sy, int& ex, int& ey) const { sx = m_covMinx; sy = m_covMiny; ex = m_covMaxx; ey = m_covMaxy; }
+
+public:
+ enum { SAMPLE_BITS = 3 };
+ enum { Y_BITS = SAMPLE_BITS };
+ enum { MAX_COVERAGE = 1<<SAMPLE_BITS };
+
+ // temp!:
+ RIuint32 *m_covBuffer;
+ size_t m_covBufferSz;
+
+private:
+ Rasterizer(const Rasterizer&); //!< Not allowed.
+ const Rasterizer& operator=(const Rasterizer&); //!< Not allowed.
+
+public:
+ struct ScissorEdge
+ {
+ ScissorEdge() {}
+ bool operator<(const ScissorEdge& e) const { return x < e.x; }
+ int x;
+ int miny;
+ int maxy;
+ int direction; //1 start, -1 end
+ };
+
+ struct Edge
+ {
+ Edge() {}
+ bool operator<(const Edge& e) const { return v0.y < e.v0.y; }
+#if defined(RI_DEBUG)
+ bool operator<=(const Edge& e) const {return v0.y <= e.v0.y; }
+#endif
+ IVector2 v0;
+ IVector2 v1;
+ int direction;
+ };
+
+ struct ActiveEdge
+ {
+ typedef RIint16 XCoord;
+ typedef RIint16 YCoord;
+
+ ActiveEdge() {}
+ //bool operator<(const ActiveEdge& e) const { return minx < e.minx; }
+ bool operator<(const ActiveEdge& e) const
+ {
+ if (minx < e.minx)
+ return true;
+ if (minx == e.minx)
+ return maxx < e.maxx;
+ return false;
+ }
+#if defined(RI_DEBUG)
+ bool operator<=(const ActiveEdge& e) const { return minx <= e.minx; }
+#endif
+ // Fixed-point edge coordinates.
+ RIuint32 next; // \todo Pointer?
+ int direction; //-1 down, 1 up
+ int xRef;
+ int slope;
+ XCoord minx; // for the current scanline
+ XCoord maxx; // for the current scanline
+ YCoord yStart; // for the edge
+ YCoord yEnd; // for the edge
+ };
+
+ enum { SF_SAMPLES = 8 };
+ enum { RASTERIZER_BITS = 14 };
+ enum { RASTERIZER_MASK = ((1<<RASTERIZER_BITS)-1) };
+ enum { Y_MASK = ((1<<Y_BITS)-1) };
+ enum { X_BITS = 7 };
+ enum { XMASK = ((1<<X_BITS)-1) };
+ enum { LEFT_DISCARD = -0x100000 };
+ enum { LEFT_DISCARD_SHORT = -32768 };
+
+ struct Windings
+ {
+#if !defined(USE_SSE2)
+ Windings() {wq = 0;}
+ // \todo Use SSE counters or packed counters!
+ // \todo 8 samples -> 64 bits == 2 32-bit uints
+ union
+ {
+ RIint8 winding[SF_SAMPLES];
+ RIuint32 wd[SF_SAMPLES/4];
+ unsigned long long wq;
+ };
+#else
+ Windings() { sseWinding = _mm_setzero_si128(); }
+ __m128i sseWinding;
+#endif
+ };
+
+private:
+ void pushEdge(const Edge& edge);
+ void clipAndAddEdge(Edge& edge);
+ void addBBox(const IVector2& v);
+ RI_INLINE void pushSpan(int x, int y, int len, int coverage);
+ RI_INLINE void commitSpans();
+
+ //RI_INLINE void calculateAEWinding(const ActiveEdge& currAe, Windings& pixel, Windings& scanline, int intY, int pixelX);
+
+ Array<ActiveEdge> m_edgePool;
+ Array<RIuint32> m_edges;
+ Array<ScissorEdge> m_scissorEdges;
+ Array<ActiveEdge> m_aet;
+ Array<ScissorEdge> m_scissorAet;
+ bool m_scissor;
+
+ bool m_aa;
+
+ IVector2 m_edgeMin;
+ IVector2 m_edgeMax;
+ int m_covMinx;
+ int m_covMiny;
+ int m_covMaxx;
+ int m_covMaxy;
+ int m_vpx;
+ int m_vpy;
+ int m_vpwidth;
+ int m_vpheight;
+ int m_vpMinx;
+ int m_vpMiny;
+ int m_vpMaxx;
+ int m_vpMaxy;
+ VGFillRule m_fillRule;
+ RIuint32 m_fillRuleMask;
+
+ const PixelPipe* m_pixelPipe;
+ PixelPipe::PPVariants m_ppVariants;
+
+ enum { N_CACHED_SPANS = 64 };
+ Span m_spanCache[N_CACHED_SPANS];
+ int m_nSpans;
+
+};
+
+//=======================================================================
+
+} //namespace OpenVGRI
+
+//=======================================================================
+
+#endif /* __RIRASTERIZER_H */