/src/skia/src/core/SkScanPriv.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2006 The Android Open Source Project |
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 | | |
8 | | #ifndef SkScanPriv_DEFINED |
9 | | #define SkScanPriv_DEFINED |
10 | | |
11 | | #include "include/core/SkPath.h" |
12 | | #include "src/core/SkBlitter.h" |
13 | | #include "src/core/SkScan.h" |
14 | | |
15 | | // controls how much we super-sample (when we use that scan convertion) |
16 | 383k | #define SK_SUPERSAMPLE_SHIFT 2 |
17 | | |
18 | | class SkScanClipper { |
19 | | public: |
20 | | SkScanClipper(SkBlitter* blitter, const SkRegion* clip, const SkIRect& bounds, |
21 | | bool skipRejectTest = false, bool boundsPreClipped = false); |
22 | | |
23 | 14.9M | SkBlitter* getBlitter() const { return fBlitter; } |
24 | 13.7M | const SkIRect* getClipRect() const { return fClipRect; } |
25 | | |
26 | | private: |
27 | | SkRectClipBlitter fRectBlitter; |
28 | | SkRgnClipBlitter fRgnBlitter; |
29 | | #ifdef SK_DEBUG |
30 | | SkRectClipCheckBlitter fRectClipCheckBlitter; |
31 | | #endif |
32 | | SkBlitter* fBlitter; |
33 | | const SkIRect* fClipRect; |
34 | | }; |
35 | | |
36 | | void sk_fill_path(const SkPath& path, const SkIRect& clipRect, |
37 | | SkBlitter* blitter, int start_y, int stop_y, int shiftEdgesUp, |
38 | | bool pathContainedInClip); |
39 | | |
40 | | // blit the rects above and below avoid, clipped to clip |
41 | | void sk_blit_above(SkBlitter*, const SkIRect& avoid, const SkRegion& clip); |
42 | | void sk_blit_below(SkBlitter*, const SkIRect& avoid, const SkRegion& clip); |
43 | | |
44 | | template<class EdgeType> |
45 | 14.1M | static inline void remove_edge(EdgeType* edge) { |
46 | 14.1M | edge->fPrev->fNext = edge->fNext; |
47 | 14.1M | edge->fNext->fPrev = edge->fPrev; |
48 | 14.1M | } SkScan_Path.cpp:void remove_edge<SkEdge>(SkEdge*) Line | Count | Source | 45 | 9.77M | static inline void remove_edge(EdgeType* edge) { | 46 | 9.77M | edge->fPrev->fNext = edge->fNext; | 47 | 9.77M | edge->fNext->fPrev = edge->fPrev; | 48 | 9.77M | } |
SkScan_AAAPath.cpp:void remove_edge<SkAnalyticEdge>(SkAnalyticEdge*) Line | Count | Source | 45 | 4.36M | static inline void remove_edge(EdgeType* edge) { | 46 | 4.36M | edge->fPrev->fNext = edge->fNext; | 47 | 4.36M | edge->fNext->fPrev = edge->fPrev; | 48 | 4.36M | } |
|
49 | | |
50 | | template<class EdgeType> |
51 | 2.74M | static inline void insert_edge_after(EdgeType* edge, EdgeType* afterMe) { |
52 | 2.74M | edge->fPrev = afterMe; |
53 | 2.74M | edge->fNext = afterMe->fNext; |
54 | 2.74M | afterMe->fNext->fPrev = edge; |
55 | 2.74M | afterMe->fNext = edge; |
56 | 2.74M | } SkScan_Path.cpp:void insert_edge_after<SkEdge>(SkEdge*, SkEdge*) Line | Count | Source | 51 | 1.32M | static inline void insert_edge_after(EdgeType* edge, EdgeType* afterMe) { | 52 | 1.32M | edge->fPrev = afterMe; | 53 | 1.32M | edge->fNext = afterMe->fNext; | 54 | 1.32M | afterMe->fNext->fPrev = edge; | 55 | 1.32M | afterMe->fNext = edge; | 56 | 1.32M | } |
SkScan_AAAPath.cpp:void insert_edge_after<SkAnalyticEdge>(SkAnalyticEdge*, SkAnalyticEdge*) Line | Count | Source | 51 | 1.42M | static inline void insert_edge_after(EdgeType* edge, EdgeType* afterMe) { | 52 | 1.42M | edge->fPrev = afterMe; | 53 | 1.42M | edge->fNext = afterMe->fNext; | 54 | 1.42M | afterMe->fNext->fPrev = edge; | 55 | 1.42M | afterMe->fNext = edge; | 56 | 1.42M | } |
|
57 | | |
58 | | template<class EdgeType> |
59 | 1.09M | void backward_insert_edge_based_on_x(EdgeType* edge) { |
60 | 1.09M | SkFixed x = edge->fX; |
61 | 1.09M | EdgeType* prev = edge->fPrev; |
62 | 89.6M | while (prev->fPrev && prev->fX > x) { |
63 | 88.5M | prev = prev->fPrev; |
64 | 88.5M | } |
65 | 1.09M | if (prev->fNext != edge) { |
66 | 1.02M | remove_edge(edge); |
67 | 1.02M | insert_edge_after(edge, prev); |
68 | 1.02M | } |
69 | 1.09M | } void backward_insert_edge_based_on_x<SkEdge>(SkEdge*) Line | Count | Source | 59 | 182k | void backward_insert_edge_based_on_x(EdgeType* edge) { | 60 | 182k | SkFixed x = edge->fX; | 61 | 182k | EdgeType* prev = edge->fPrev; | 62 | 1.34M | while (prev->fPrev && prev->fX > x) { | 63 | 1.15M | prev = prev->fPrev; | 64 | 1.15M | } | 65 | 182k | if (prev->fNext != edge) { | 66 | 182k | remove_edge(edge); | 67 | 182k | insert_edge_after(edge, prev); | 68 | 182k | } | 69 | 182k | } |
void backward_insert_edge_based_on_x<SkAnalyticEdge>(SkAnalyticEdge*) Line | Count | Source | 59 | 914k | void backward_insert_edge_based_on_x(EdgeType* edge) { | 60 | 914k | SkFixed x = edge->fX; | 61 | 914k | EdgeType* prev = edge->fPrev; | 62 | 88.3M | while (prev->fPrev && prev->fX > x) { | 63 | 87.4M | prev = prev->fPrev; | 64 | 87.4M | } | 65 | 914k | if (prev->fNext != edge) { | 66 | 846k | remove_edge(edge); | 67 | 846k | insert_edge_after(edge, prev); | 68 | 846k | } | 69 | 914k | } |
|
70 | | |
71 | | // Start from the right side, searching backwards for the point to begin the new edge list |
72 | | // insertion, marching forwards from here. The implementation could have started from the left |
73 | | // of the prior insertion, and search to the right, or with some additional caching, binary |
74 | | // search the starting point. More work could be done to determine optimal new edge insertion. |
75 | | template<class EdgeType> |
76 | 759k | EdgeType* backward_insert_start(EdgeType* prev, SkFixed x) { |
77 | 11.8M | while (prev->fPrev && prev->fX > x) { |
78 | 11.0M | prev = prev->fPrev; |
79 | 11.0M | } |
80 | 759k | return prev; |
81 | 759k | } SkEdge* backward_insert_start<SkEdge>(SkEdge*, int) Line | Count | Source | 76 | 495k | EdgeType* backward_insert_start(EdgeType* prev, SkFixed x) { | 77 | 2.60M | while (prev->fPrev && prev->fX > x) { | 78 | 2.11M | prev = prev->fPrev; | 79 | 2.11M | } | 80 | 495k | return prev; | 81 | 495k | } |
SkAnalyticEdge* backward_insert_start<SkAnalyticEdge>(SkAnalyticEdge*, int) Line | Count | Source | 76 | 264k | EdgeType* backward_insert_start(EdgeType* prev, SkFixed x) { | 77 | 9.22M | while (prev->fPrev && prev->fX > x) { | 78 | 8.95M | prev = prev->fPrev; | 79 | 8.95M | } | 80 | 264k | return prev; | 81 | 264k | } |
|
82 | | |
83 | | #endif |