blob: 5b0cc75d4cb01fea27e0c1f12dab4685bfe2e536 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/* libs/graphics/sgl/SkEdge.h
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#ifndef SkEdge_DEFINED
19#define SkEdge_DEFINED
20
21#include "SkRect.h"
22
23struct SkEdge {
24 enum Type {
25 kLine_Type,
26 kQuad_Type,
27 kCubic_Type
28 };
29
30 SkEdge* fNext;
31 SkEdge* fPrev;
32
33 SkFixed fX;
34 SkFixed fDX;
35 int32_t fFirstY;
36 int32_t fLastY;
37 int8_t fCurveCount; // only used by kQuad(+) and kCubic(-)
38 uint8_t fCurveShift; // appled to all Dx/DDx/DDDx except for fCubicDShift exception
39 uint8_t fCubicDShift; // applied to fCDx and fCDy only in cubic
40 int8_t fWinding; // 1 or -1
41
42 int setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip,
43 int shiftUp);
44 inline int updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by);
45 void chopLineWithClip(const SkIRect& clip);
46
47 inline bool intersectsClip(const SkIRect& clip) const {
48 SkASSERT(fFirstY < clip.fBottom);
49 return fLastY >= clip.fTop;
50 }
51
52#ifdef SK_DEBUG
53 void dump() const {
54 #ifdef SK_CAN_USE_FLOAT
55 SkDebugf("edge: firstY:%d lastY:%d x:%g dx:%g w:%d\n", fFirstY, fLastY, SkFixedToFloat(fX), SkFixedToFloat(fDX), fWinding);
56 #else
57 SkDebugf("edge: firstY:%d lastY:%d x:%x dx:%x w:%d\n", fFirstY, fLastY, fX, fDX, fWinding);
58 #endif
59 }
60
61 void validate() const {
62 SkASSERT(fPrev && fNext);
63 SkASSERT(fPrev->fNext == this);
64 SkASSERT(fNext->fPrev == this);
65
66 SkASSERT(fFirstY <= fLastY);
67 SkASSERT(SkAbs32(fWinding) == 1);
68 }
69#endif
70};
71
72struct SkQuadraticEdge : public SkEdge {
73 SkFixed fQx, fQy;
74 SkFixed fQDx, fQDy;
75 SkFixed fQDDx, fQDDy;
76 SkFixed fQLastX, fQLastY;
77
78 int setQuadratic(const SkPoint pts[3], const SkIRect* clip, int shiftUp);
79 int updateQuadratic();
80};
81
82struct SkCubicEdge : public SkEdge {
83 SkFixed fCx, fCy;
84 SkFixed fCDx, fCDy;
85 SkFixed fCDDx, fCDDy;
86 SkFixed fCDDDx, fCDDDy;
87 SkFixed fCLastX, fCLastY;
88
89 int setCubic(const SkPoint pts[4], const SkIRect* clip, int shiftUp);
90 int updateCubic();
91};
92
93#endif