diff options
Diffstat (limited to 'libs/graphics/sgl/SkEdge.h')
-rw-r--r-- | libs/graphics/sgl/SkEdge.h | 77 |
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 |