1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkAntiEdge_DEFINED 8 #define SkAntiEdge_DEFINED 9 10 #include "SkFixed.h" 11 #include "SkTDArray.h" 12 13 struct SkBitmap; 14 struct SkPoint; 15 16 struct SkAntiEdge { 17 SkAntiEdge* fNext; // list in walking order (y, then x, then diag) 18 SkAntiEdge* fPrev; // reverse in walking order 19 SkAntiEdge* fLink; // list in connected order, top to bottom 20 21 SkFixed fFirstX; // starting X 22 SkFixed fFirstY; // starting Y 23 SkFixed fLastX; // ending X 24 SkFixed fLastY; // ending Y 25 SkFixed fX0; // computed edge current value (may be off end) 26 SkFixed fY0; 27 SkFixed fX; // edge current value (always on edge) 28 SkFixed fY; 29 SkFixed fDX; // change in X per unit step in Y 30 SkFixed fDY; // change in Y per unit step in X 31 SkFixed fWalkX; // unit step position (integer after initial step) 32 SkFixed fWalkY; 33 uint16_t fPartialY; // initial partial coverage in Y (0 .. SkFixed1] 34 int16_t fWindingSum; // winding including contributions to the left 35 int8_t fWinding; // 1 or -1 (could be 2 bits) 36 bool fFinished : 1; 37 unsigned fDXFlipped : 1; // used as bool and to adjust calculations (0/1) 38 bool fLinkSet : 1; // set if edge has been attached to another edge 39 40 void calcLine(); 41 bool setLine(const SkPoint& p0, const SkPoint& p1); 42 uint16_t advanceX(SkFixed left); 43 uint16_t advanceFlippedX(SkFixed left); 44 void advanceY(SkFixed top); 45 // FIXME: mark DEBUG 46 void pointInLine(SkFixed x, SkFixed y); 47 void pointOnLine(SkFixed x, SkFixed y); 48 void validate(); 49 }; 50 51 class SkAntiEdgeBuilder { 52 public: 53 void process(const SkPoint* points, int ptCount, 54 uint8_t* result, int pixelCol, int pixelRow); 55 private: 56 int build(const SkPoint pts[], int count); 57 void calc(); 58 void link(); 59 void sort(); 60 void sort(SkTDArray<SkAntiEdge*>&); 61 void split(); 62 void split(SkAntiEdge* edge, SkFixed y); 63 void walk(uint8_t* result, int rowBytes, int height); 64 SkAntiEdge fHeadEdge; 65 SkAntiEdge fTailEdge; 66 SkTDArray<SkAntiEdge> fEdges; 67 SkTDArray<SkAntiEdge*> fList; 68 }; 69 70 void SkAntiEdge_Test(); 71 void CreateSweep(SkBitmap* , float width); 72 void CreateHorz(SkBitmap* ); 73 void CreateVert(SkBitmap* ); 74 void CreateAngle(SkBitmap* sweep, float angle); 75 76 #endif 77