aboutsummaryrefslogtreecommitdiffhomepage
path: root/libs/graphics/sgl/SkEdge.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/graphics/sgl/SkEdge.h')
-rw-r--r--libs/graphics/sgl/SkEdge.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/libs/graphics/sgl/SkEdge.h b/libs/graphics/sgl/SkEdge.h
new file mode 100644
index 0000000000..73add2a141
--- /dev/null
+++ b/libs/graphics/sgl/SkEdge.h
@@ -0,0 +1,77 @@
+#ifndef SkEdge_DEFINED
+#define SkEdge_DEFINED
+
+#include "SkRect.h"
+
+struct SkEdge {
+ enum Type {
+ kLine_Type,
+ kQuad_Type,
+ kCubic_Type
+ };
+
+ SkEdge* fNext;
+ SkEdge* fPrev;
+
+ SkFixed fX;
+ SkFixed fDX;
+ S16 fFirstY;
+ S16 fLastY;
+ S16 fCurveCount; // only used by kQuad(+) and kCubic(-)
+ U8 fCurveShift;
+ S8 fWinding; // 1 or -1
+
+ int setLine(const SkPoint pts[2], const SkRect16* clip, int shiftUp);
+ inline int updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by);
+ void chopLineWithClip(const SkRect16& clip);
+
+ inline bool intersectsClip(const SkRect16& clip) const
+ {
+ SkASSERT(fFirstY < clip.fBottom);
+ return fLastY >= clip.fTop;
+ }
+
+#ifdef SK_DEBUG
+ void dump() const
+ {
+ #ifdef SK_CAN_USE_FLOAT
+ SkDebugf("edge: firstY:%d lastY:%d x:%g dx:%g w:%d\n", fFirstY, fLastY, SkFixedToFloat(fX), SkFixedToFloat(fDX), fWinding);
+ #else
+ SkDebugf("edge: firstY:%d lastY:%d x:%x dx:%x w:%d\n", fFirstY, fLastY, fX, fDX, fWinding);
+ #endif
+ }
+
+ void validate() const
+ {
+ SkASSERT(fPrev && fNext);
+ SkASSERT(fPrev->fNext == this);
+ SkASSERT(fNext->fPrev == this);
+
+ SkASSERT(fFirstY <= fLastY);
+ SkASSERT(SkAbs32(fWinding) == 1);
+ }
+#endif
+};
+
+struct SkQuadraticEdge : public SkEdge {
+ SkFixed fQx, fQy;
+ SkFixed fQDx, fQDy;
+ SkFixed fQDDx, fQDDy;
+ SkFixed fQLastX, fQLastY;
+
+ int setQuadratic(const SkPoint pts[3], const SkRect16* clip, int shiftUp);
+ int updateQuadratic();
+};
+
+struct SkCubicEdge : public SkEdge {
+ SkFixed fCx, fCy;
+ SkFixed fCDx, fCDy;
+ SkFixed fCDDx, fCDDy;
+ SkFixed fCDDDx, fCDDDy;
+ SkFixed fCLastX, fCLastY;
+
+ int setCubic(const SkPoint pts[4], const SkRect16* clip, int shiftUp);
+ int updateCubic();
+};
+
+#endif