caryclark@google.com | 639df89 | 2012-01-10 21:46:10 +0000 | [diff] [blame] | 1 | /* |
caryclark@google.com | 1304bb2 | 2013-03-13 20:29:41 +0000 | [diff] [blame] | 2 | * Copyright 2011 Google Inc. |
caryclark@google.com | 639df89 | 2012-01-10 21:46:10 +0000 | [diff] [blame] | 3 | * |
caryclark@google.com | 1304bb2 | 2013-03-13 20:29:41 +0000 | [diff] [blame] | 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
caryclark@google.com | 639df89 | 2012-01-10 21:46:10 +0000 | [diff] [blame] | 6 | */ |
caryclark@google.com | 639df89 | 2012-01-10 21:46:10 +0000 | [diff] [blame] | 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 |