• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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