| OLD | NEW |
| (Empty) |
| 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 | |
| OLD | NEW |