Coverage Report

Created: 2024-05-20 07:14

/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