Home | History | Annotate | Download | only in core
      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 
     39     inline bool intersectsClip(const SkIRect& clip) const {
     40         SkASSERT(fFirstY < clip.fBottom);
     41         return fLastY >= clip.fTop;
     42     }
     43 
     44 #ifdef SK_DEBUG
     45     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 
     53     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