xref: /aosp_15_r20/external/skia/src/core/SkScan.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 #include "src/core/SkScan.h"
8 
9 #include "include/core/SkRegion.h"
10 #include "src/core/SkBlitter.h"
11 #include "src/core/SkRasterClip.h"
12 
blitrect(SkBlitter * blitter,const SkIRect & r)13 static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
14     blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
15 }
16 
FillIRect(const SkIRect & r,const SkRegion * clip,SkBlitter * blitter)17 void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip,
18                        SkBlitter* blitter) {
19     if (!r.isEmpty()) {
20         if (clip) {
21             if (clip->isRect()) {
22                 const SkIRect& clipBounds = clip->getBounds();
23 
24                 if (clipBounds.contains(r)) {
25                     blitrect(blitter, r);
26                 } else {
27                     SkIRect rr = r;
28                     if (rr.intersect(clipBounds)) {
29                         blitrect(blitter, rr);
30                     }
31                 }
32             } else {
33                 SkRegion::Cliperator    cliper(*clip, r);
34                 const SkIRect&          rr = cliper.rect();
35 
36                 while (!cliper.done()) {
37                     blitrect(blitter, rr);
38                     cliper.next();
39                 }
40             }
41         } else {
42             blitrect(blitter, r);
43         }
44     }
45 }
46 
FillXRect(const SkXRect & xr,const SkRegion * clip,SkBlitter * blitter)47 void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip,
48                        SkBlitter* blitter) {
49     SkIRect r;
50 
51     XRect_round(xr, &r);
52     SkScan::FillIRect(r, clip, blitter);
53 }
54 
FillRect(const SkRect & r,const SkRegion * clip,SkBlitter * blitter)55 void SkScan::FillRect(const SkRect& r, const SkRegion* clip,
56                        SkBlitter* blitter) {
57     SkIRect ir;
58 
59     r.round(&ir);
60     SkScan::FillIRect(ir, clip, blitter);
61 }
62 
63 ///////////////////////////////////////////////////////////////////////////////
64 
FillIRect(const SkIRect & r,const SkRasterClip & clip,SkBlitter * blitter)65 void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
66                        SkBlitter* blitter) {
67     if (clip.isEmpty() || r.isEmpty()) {
68         return;
69     }
70 
71     if (clip.isBW()) {
72         FillIRect(r, &clip.bwRgn(), blitter);
73         return;
74     }
75 
76     SkAAClipBlitterWrapper wrapper(clip, blitter);
77     FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
78 }
79 
FillXRect(const SkXRect & xr,const SkRasterClip & clip,SkBlitter * blitter)80 void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
81                        SkBlitter* blitter) {
82     if (clip.isEmpty() || xr.isEmpty()) {
83         return;
84     }
85 
86     if (clip.isBW()) {
87         FillXRect(xr, &clip.bwRgn(), blitter);
88         return;
89     }
90 
91     SkAAClipBlitterWrapper wrapper(clip, blitter);
92     FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
93 }
94 
FillRect(const SkRect & r,const SkRasterClip & clip,SkBlitter * blitter)95 void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
96                       SkBlitter* blitter) {
97     if (clip.isEmpty() || r.isEmpty()) {
98         return;
99     }
100 
101     if (clip.isBW()) {
102         FillRect(r, &clip.bwRgn(), blitter);
103         return;
104     }
105 
106     SkAAClipBlitterWrapper wrapper(clip, blitter);
107     FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
108 }
109