• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2006 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkEdge_DEFINED
11 #define SkEdge_DEFINED
12 
13 #include "SkRect.h"
14 
15 struct SkEdge {
16     enum Type {
17         kLine_Type,
18         kQuad_Type,
19         kCubic_Type
20     };
21 
22     SkEdge* fNext;
23     SkEdge* fPrev;
24 
25     SkFixed fX;
26     SkFixed fDX;
27     int32_t fFirstY;
28     int32_t fLastY;
29     int8_t fCurveCount;    // only used by kQuad(+) and kCubic(-)
30     uint8_t fCurveShift;    // appled to all Dx/DDx/DDDx except for fCubicDShift exception
31     uint8_t fCubicDShift;   // applied to fCDx and fCDy only in cubic
32     int8_t  fWinding;       // 1 or -1
33 
34     int setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip,
35                 int shiftUp);
36     inline int updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by);
37     void chopLineWithClip(const SkIRect& clip);
38 
intersectsClipSkEdge39     inline bool intersectsClip(const SkIRect& clip) const {
40         SkASSERT(fFirstY < clip.fBottom);
41         return fLastY >= clip.fTop;
42     }
43 
44 #ifdef SK_DEBUG
dumpSkEdge45     void dump() const {
46     #ifdef SK_CAN_USE_FLOAT
47         SkDebugf("edge: firstY:%d lastY:%d x:%g dx:%g w:%d\n", fFirstY, fLastY, SkFixedToFloat(fX), SkFixedToFloat(fDX), fWinding);
48     #else
49         SkDebugf("edge: firstY:%d lastY:%d x:%x dx:%x w:%d\n", fFirstY, fLastY, fX, fDX, fWinding);
50     #endif
51     }
52 
validateSkEdge53     void validate() const {
54         SkASSERT(fPrev && fNext);
55         SkASSERT(fPrev->fNext == this);
56         SkASSERT(fNext->fPrev == this);
57 
58         SkASSERT(fFirstY <= fLastY);
59         SkASSERT(SkAbs32(fWinding) == 1);
60     }
61 #endif
62 };
63 
64 struct SkQuadraticEdge : public SkEdge {
65     SkFixed fQx, fQy;
66     SkFixed fQDx, fQDy;
67     SkFixed fQDDx, fQDDy;
68     SkFixed fQLastX, fQLastY;
69 
70     int setQuadratic(const SkPoint pts[3], int shiftUp);
71     int updateQuadratic();
72 };
73 
74 struct SkCubicEdge : public SkEdge {
75     SkFixed fCx, fCy;
76     SkFixed fCDx, fCDy;
77     SkFixed fCDDx, fCDDy;
78     SkFixed fCDDDx, fCDDDy;
79     SkFixed fCLastX, fCLastY;
80 
81     int setCubic(const SkPoint pts[4], const SkIRect* clip, int shiftUp);
82     int updateCubic();
83 };
84 
85 #endif
86