Flutter Engine
The Flutter Engine
Public Types | Static Public Member Functions | Friends | List of all members
SkScan Class Reference

#include <SkScan.h>

Public Types

typedef void(* HairRgnProc) (const SkPoint[], int count, const SkRegion *, SkBlitter *)
 
typedef void(* HairRCProc) (const SkPoint[], int count, const SkRasterClip &, SkBlitter *)
 

Static Public Member Functions

static void FillPath (const SkPath &, const SkIRect &, SkBlitter *)
 
static bool PathRequiresTiling (const SkIRect &bounds)
 
static void FillIRect (const SkIRect &, const SkRasterClip &, SkBlitter *)
 
static void FillXRect (const SkXRect &, const SkRasterClip &, SkBlitter *)
 
static void FillRect (const SkRect &, const SkRasterClip &, SkBlitter *)
 
static void AntiFillRect (const SkRect &, const SkRasterClip &, SkBlitter *)
 
static void AntiFillXRect (const SkXRect &, const SkRasterClip &, SkBlitter *)
 
static void FillPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void AntiFillPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void FrameRect (const SkRect &, const SkPoint &strokeSize, const SkRasterClip &, SkBlitter *)
 
static void AntiFrameRect (const SkRect &, const SkPoint &strokeSize, const SkRasterClip &, SkBlitter *)
 
static void FillTriangle (const SkPoint pts[], const SkRasterClip &, SkBlitter *)
 
static void HairLine (const SkPoint[], int count, const SkRasterClip &, SkBlitter *)
 
static void AntiHairLine (const SkPoint[], int count, const SkRasterClip &, SkBlitter *)
 
static void HairRect (const SkRect &, const SkRasterClip &, SkBlitter *)
 
static void AntiHairRect (const SkRect &, const SkRasterClip &, SkBlitter *)
 
static void HairPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void AntiHairPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void HairSquarePath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void AntiHairSquarePath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void HairRoundPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void AntiHairRoundPath (const SkPath &, const SkRasterClip &, SkBlitter *)
 
static void FillPath (const SkPath &, const SkRegion &clip, SkBlitter *)
 

Friends

class SkAAClip
 
class SkRegion
 

Detailed Description

Definition at line 26 of file SkScan.h.

Member Typedef Documentation

◆ HairRCProc

typedef void(* SkScan::HairRCProc) (const SkPoint[], int count, const SkRasterClip &, SkBlitter *)

Definition at line 35 of file SkScan.h.

◆ HairRgnProc

typedef void(* SkScan::HairRgnProc) (const SkPoint[], int count, const SkRegion *, SkBlitter *)

Definition at line 34 of file SkScan.h.

Member Function Documentation

◆ AntiFillPath()

void SkScan::AntiFillPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 155 of file SkScan_AntiPath.cpp.

155 {
156 if (clip.isEmpty() || !path.isFinite()) {
157 return;
158 }
159
160 if (clip.isBW()) {
161 AntiFillPath(path, clip.bwRgn(), blitter, false);
162 } else {
163 SkRegion tmp;
164 SkAAClipBlitter aaBlitter;
165
166 tmp.setRect(clip.getBounds());
167 aaBlitter.init(blitter, &clip.aaRgn());
168 AntiFillPath(path, tmp, &aaBlitter, true); // SkAAClipBlitter can blitMask, why forceRLE?
169 }
170}
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
Definition: SkPath.cpp:3892
void init(SkBlitter *blitter, const SkAAClip *aaclip)
Definition: SkAAClip.h:97
bool isEmpty() const
Definition: SkPath.cpp:416
const SkRect & getBounds() const
Definition: SkPath.cpp:430
bool setRect(const SkIRect &rect)
Definition: SkRegion.cpp:192
static void AntiFillPath(const SkPath &, const SkRasterClip &, SkBlitter *)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57

◆ AntiFillRect()

void SkScan::AntiFillRect ( const SkRect r,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 822 of file SkScan_Antihair.cpp.

823 {
824 if (clip.isBW()) {
825 AntiFillRect(r, &clip.bwRgn(), blitter);
826 } else {
827 SkAAClipBlitterWrapper wrap(clip, blitter);
828 AntiFillRect(r, &wrap.getRgn(), wrap.getBlitter());
829 }
830}
static void AntiFillRect(const SkRect &, const SkRasterClip &, SkBlitter *)

◆ AntiFillXRect()

void SkScan::AntiFillXRect ( const SkXRect xr,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 758 of file SkScan_Antihair.cpp.

759 {
760 if (clip.isBW()) {
761 AntiFillXRect(xr, &clip.bwRgn(), blitter);
762 } else {
763 SkIRect outerBounds;
764 XRect_roundOut(xr, &outerBounds);
765
766 if (clip.quickContains(outerBounds)) {
767 AntiFillXRect(xr, nullptr, blitter);
768 } else {
769 SkAAClipBlitterWrapper wrapper(clip, blitter);
770 AntiFillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
771 }
772 }
773}
static void XRect_roundOut(const SkXRect &xr, SkIRect *dst)
Definition: SkScan.h:128
static void AntiFillXRect(const SkXRect &, const SkRasterClip &, SkBlitter *)
Definition: SkRect.h:32

◆ AntiFrameRect()

void SkScan::AntiFrameRect ( const SkRect r,
const SkPoint strokeSize,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 1016 of file SkScan_Antihair.cpp.

1017 {
1018 if (clip.isBW()) {
1019 AntiFrameRect(r, strokeSize, &clip.bwRgn(), blitter);
1020 } else {
1021 SkAAClipBlitterWrapper wrap(clip, blitter);
1022 AntiFrameRect(r, strokeSize, &wrap.getRgn(), wrap.getBlitter());
1023 }
1024}
static void AntiFrameRect(const SkRect &, const SkPoint &strokeSize, const SkRasterClip &, SkBlitter *)

◆ AntiHairLine()

void SkScan::AntiHairLine ( const SkPoint  pts[],
int  count,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 738 of file SkScan_Hairline.cpp.

739 {
740 if (clip.isBW()) {
741 AntiHairLineRgn(pts, count, &clip.bwRgn(), blitter);
742 } else {
743 const SkRegion* clipRgn = nullptr;
744
745 SkRect r;
746 r.setBounds(pts, count);
747
749 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) {
750 wrap.init(clip, blitter);
751 blitter = wrap.getBlitter();
752 clipRgn = &wrap.getRgn();
753 }
754 AntiHairLineRgn(pts, count, clipRgn, blitter);
755 }
756}
int count
Definition: FontMgrTest.cpp:50
void init(const SkRasterClip &, SkBlitter *)
const SkRegion & getRgn() const
Definition: SkRasterClip.h:175
SkBlitter * getBlitter()
Definition: SkRasterClip.h:179
void roundOut(SkIRect *dst) const
Definition: SkRect.h:1241
void setBounds(const SkPoint pts[], int count)
Definition: SkRect.h:881

◆ AntiHairPath()

void SkScan::AntiHairPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 661 of file SkScan_Hairline.cpp.

661 {
662 hair_path<SkPaint::kButt_Cap>(path, clip, blitter, SkScan::AntiHairLineRgn);
663}

◆ AntiHairRect()

void SkScan::AntiHairRect ( const SkRect rect,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 621 of file SkScan_Antihair.cpp.

622 {
623 SkPoint pts[5];
624
625 pts[0].set(rect.fLeft, rect.fTop);
626 pts[1].set(rect.fRight, rect.fTop);
627 pts[2].set(rect.fRight, rect.fBottom);
628 pts[3].set(rect.fLeft, rect.fBottom);
629 pts[4] = pts[0];
630 SkScan::AntiHairLine(pts, 5, clip, blitter);
631}
static void AntiHairLine(const SkPoint[], int count, const SkRasterClip &, SkBlitter *)
sk_sp< SkBlender > blender SkRect rect
Definition: SkRecords.h:350
void set(float x, float y)
Definition: SkPoint_impl.h:200

◆ AntiHairRoundPath()

void SkScan::AntiHairRoundPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 677 of file SkScan_Hairline.cpp.

677 {
678 hair_path<SkPaint::kRound_Cap>(path, clip, blitter, SkScan::AntiHairLineRgn);
679}

◆ AntiHairSquarePath()

void SkScan::AntiHairSquarePath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 669 of file SkScan_Hairline.cpp.

669 {
670 hair_path<SkPaint::kSquare_Cap>(path, clip, blitter, SkScan::AntiHairLineRgn);
671}

◆ FillIRect()

void SkScan::FillIRect ( const SkIRect r,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 65 of file SkScan.cpp.

66 {
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}
static void FillIRect(const SkIRect &, const SkRasterClip &, SkBlitter *)
Definition: SkScan.cpp:65
bool isEmpty() const
Definition: SkRect.h:202

◆ FillPath() [1/3]

void SkScan::FillPath ( const SkPath path,
const SkIRect ir,
SkBlitter blitter 
)
static

Definition at line 682 of file SkScan_Path.cpp.

683 {
684 SkRegion rgn(ir);
685 FillPath(path, rgn, blitter);
686}
static void FillPath(const SkPath &, const SkIRect &, SkBlitter *)

◆ FillPath() [2/3]

void SkScan::FillPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 138 of file SkScan_AntiPath.cpp.

138 {
139 if (clip.isEmpty() || !path.isFinite()) {
140 return;
141 }
142
143 if (clip.isBW()) {
144 FillPath(path, clip.bwRgn(), blitter);
145 } else {
146 SkRegion tmp;
147 SkAAClipBlitter aaBlitter;
148
149 tmp.setRect(clip.getBounds());
150 aaBlitter.init(blitter, &clip.aaRgn());
151 SkScan::FillPath(path, tmp, &aaBlitter);
152 }
153}

◆ FillPath() [3/3]

void SkScan::FillPath ( const SkPath path,
const SkRegion clip,
SkBlitter blitter 
)
static

Definition at line 625 of file SkScan_Path.cpp.

626 {
627 if (origClip.isEmpty()) {
628 return;
629 }
630
631 // Our edges are fixed-point, and don't like the bounds of the clip to
632 // exceed that. Here we trim the clip just so we don't overflow later on
633 const SkRegion* clipPtr = &origClip;
634 SkRegion finiteClip;
635 if (clip_to_limit(origClip, &finiteClip)) {
636 if (finiteClip.isEmpty()) {
637 return;
638 }
639 clipPtr = &finiteClip;
640 }
641 // don't reference "origClip" any more, just use clipPtr
642
643
644 SkRect bounds = path.getBounds();
645 bool irPreClipped = false;
647 if (!bounds.intersect(SkRectPriv::MakeLargeS32())) {
648 bounds.setEmpty();
649 }
650 irPreClipped = true;
651 }
652
654 if (ir.isEmpty()) {
655 if (path.isInverseFillType()) {
656 blitter->blitRegion(*clipPtr);
657 }
658 return;
659 }
660
661 SkScanClipper clipper(blitter, clipPtr, ir, path.isInverseFillType(), irPreClipped);
662
663 blitter = clipper.getBlitter();
664 if (blitter) {
665 // we have to keep our calls to blitter in sorted order, so we
666 // must blit the above section first, then the middle, then the bottom.
667 if (path.isInverseFillType()) {
668 sk_blit_above(blitter, ir, *clipPtr);
669 }
670 SkASSERT(clipper.getClipRect() == nullptr ||
671 *clipper.getClipRect() == clipPtr->getBounds());
672 sk_fill_path(path, clipPtr->getBounds(), blitter, ir.fTop, ir.fBottom,
673 0, clipper.getClipRect() == nullptr);
674 if (path.isInverseFillType()) {
675 sk_blit_below(blitter, ir, *clipPtr);
676 }
677 } else {
678 // what does it mean to not have a blitter if path.isInverseFillType???
679 }
680}
#define SkASSERT(cond)
Definition: SkAssert.h:116
static SkIRect conservative_round_to_int(const SkRect &src)
void sk_fill_path(const SkPath &path, const SkIRect &clipRect, SkBlitter *blitter, int start_y, int stop_y, int shiftEdgesUp, bool pathContainedInClip)
static bool clip_to_limit(const SkRegion &orig, SkRegion *reduced)
void sk_blit_below(SkBlitter *blitter, const SkIRect &ir, const SkRegion &clip)
void sk_blit_above(SkBlitter *blitter, const SkIRect &ir, const SkRegion &clip)
void blitRegion(const SkRegion &clip)
Definition: SkBlitter.cpp:310
static SkRect MakeLargeS32()
Definition: SkRectPriv.h:33
const SkIRect & getBounds() const
Definition: SkRegion.h:165
bool isEmpty() const
Definition: SkRegion.h:146
Optional< SkRect > bounds
Definition: SkRecords.h:189
constexpr bool contains(std::string_view str, std::string_view needle)
Definition: SkStringView.h:41
int32_t fBottom
larger y-axis bounds
Definition: SkRect.h:36
int32_t fTop
smaller y-axis bounds
Definition: SkRect.h:34

◆ FillRect()

void SkScan::FillRect ( const SkRect r,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 95 of file SkScan.cpp.

96 {
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}
static void FillRect(const SkRect &, const SkRasterClip &, SkBlitter *)
Definition: SkScan.cpp:95
bool isEmpty() const
Definition: SkRect.h:693

◆ FillTriangle()

void SkScan::FillTriangle ( const SkPoint  pts[],
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 754 of file SkScan_Path.cpp.

755 {
756 if (clip.isEmpty()) {
757 return;
758 }
759
760 SkRect r;
761 r.setBounds(pts, 3);
762 // If r is too large (larger than can easily fit in SkFixed) then we need perform geometric
763 // clipping. This is a bit of work, so we just call the general FillPath() to handle it.
764 // Use FixedMax/2 as the limit so we can subtract two edges and still store that in Fixed.
765 const SkScalar limit = SK_MaxS16 >> 1;
766 if (!SkRect::MakeLTRB(-limit, -limit, limit, limit).contains(r)) {
767 SkPath path;
768 path.addPoly(pts, 3, false);
769 FillPath(path, clip, blitter);
770 return;
771 }
772
774 if (ir.isEmpty() || !SkIRect::Intersects(ir, clip.getBounds())) {
775 return;
776 }
777
779 const SkRegion* clipRgn;
780 if (clip.isBW()) {
781 clipRgn = &clip.bwRgn();
782 } else {
783 wrap.init(clip, blitter);
784 clipRgn = &wrap.getRgn();
785 blitter = wrap.getBlitter();
786 }
787
788 SkScanClipper clipper(blitter, clipRgn, ir);
789 blitter = clipper.getBlitter();
790 if (blitter) {
791 sk_fill_triangle(pts, clipper.getClipRect(), blitter, ir);
792 }
793}
static constexpr int16_t SK_MaxS16
Definition: SkMath.h:18
static void sk_fill_triangle(const SkPoint pts[], const SkIRect *clipRect, SkBlitter *blitter, const SkIRect &ir)
Definition: SkPath.h:59
float SkScalar
Definition: extension.cpp:12
static bool Intersects(const SkIRect &a, const SkIRect &b)
Definition: SkRect.h:535
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
Definition: SkRect.h:646

◆ FillXRect()

void SkScan::FillXRect ( const SkXRect xr,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 80 of file SkScan.cpp.

81 {
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}
static void FillXRect(const SkXRect &, const SkRasterClip &, SkBlitter *)
Definition: SkScan.cpp:80

◆ FrameRect()

void SkScan::FrameRect ( const SkRect r,
const SkPoint strokeSize,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 683 of file SkScan_Hairline.cpp.

684 {
685 SkASSERT(strokeSize.fX >= 0 && strokeSize.fY >= 0);
686
687 if (strokeSize.fX < 0 || strokeSize.fY < 0) {
688 return;
689 }
690
691 const SkScalar dx = strokeSize.fX;
692 const SkScalar dy = strokeSize.fY;
694 SkScalar ry = SkScalarHalf(dy);
695 SkRect outer, tmp;
696
697 outer.setLTRB(r.fLeft - rx, r.fTop - ry, r.fRight + rx, r.fBottom + ry);
698
699 if (r.width() <= dx || r.height() <= dy) {
700 SkScan::FillRect(outer, clip, blitter);
701 return;
702 }
703
704 tmp.setLTRB(outer.fLeft, outer.fTop, outer.fRight, outer.fTop + dy);
705 SkScan::FillRect(tmp, clip, blitter);
706 tmp.fTop = outer.fBottom - dy;
707 tmp.fBottom = outer.fBottom;
708 SkScan::FillRect(tmp, clip, blitter);
709
710 tmp.setLTRB(outer.fLeft, outer.fTop + dy, outer.fLeft + dx, outer.fBottom - dy);
711 SkScan::FillRect(tmp, clip, blitter);
712 tmp.fLeft = outer.fRight - dx;
713 tmp.fRight = outer.fRight;
714 SkScan::FillRect(tmp, clip, blitter);
715}
#define SkScalarHalf(a)
Definition: SkScalar.h:75
skia_private::AutoTArray< sk_sp< SkImageFilter > > filters TypedMatrix matrix TypedMatrix matrix SkScalar dx
Definition: SkRecords.h:208
float fX
x-axis value
Definition: SkPoint_impl.h:164
float fY
y-axis value
Definition: SkPoint_impl.h:165
SkScalar fBottom
larger y-axis bounds
Definition: extension.cpp:17
SkScalar fLeft
smaller x-axis bounds
Definition: extension.cpp:14
SkScalar fRight
larger x-axis bounds
Definition: extension.cpp:16
constexpr float height() const
Definition: SkRect.h:769
void setLTRB(float left, float top, float right, float bottom)
Definition: SkRect.h:865
constexpr float width() const
Definition: SkRect.h:762
SkScalar fTop
smaller y-axis bounds
Definition: extension.cpp:15

◆ HairLine()

void SkScan::HairLine ( const SkPoint  pts[],
int  count,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 717 of file SkScan_Hairline.cpp.

718 {
719 if (clip.isBW()) {
720 HairLineRgn(pts, count, &clip.bwRgn(), blitter);
721 } else {
722 const SkRegion* clipRgn = nullptr;
723
724 SkRect r;
725 r.setBounds(pts, count);
727
729 if (!clip.quickContains(r.roundOut())) {
730 wrap.init(clip, blitter);
731 blitter = wrap.getBlitter();
732 clipRgn = &wrap.getRgn();
733 }
734 HairLineRgn(pts, count, clipRgn, blitter);
735 }
736}
#define SK_ScalarHalf
Definition: SkScalar.h:19
void outset(float dx, float dy)
Definition: SkRect.h:1077

◆ HairPath()

void SkScan::HairPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 657 of file SkScan_Hairline.cpp.

657 {
658 hair_path<SkPaint::kButt_Cap>(path, clip, blitter, SkScan::HairLineRgn);
659}

◆ HairRect()

void SkScan::HairRect ( const SkRect rect,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 177 of file SkScan_Hairline.cpp.

177 {
179 SkBlitterClipper clipper;
180 // Create the enclosing bounds of the hairrect. i.e. we will stroke the interior of r.
183 SkScalarFloorToInt(rect.fRight + 1),
184 SkScalarFloorToInt(rect.fBottom + 1));
185
186 // Note: r might be crazy big, if rect was huge, possibly getting pinned to max/min s32.
187 // We need to trim it back to something reasonable before we can query its width etc.
188 // since r.fRight - r.fLeft might wrap around to negative even if fRight > fLeft.
189 //
190 // We outset the clip bounds by 1 before intersecting, since r is being stroked and not filled
191 // so we don't want to pin an edge of it to the clip. The intersect's job is mostly to just
192 // get the actual edge values into a reasonable range (e.g. so width() can't overflow).
193 if (!r.intersect(clip.getBounds().makeOutset(1, 1))) {
194 return;
195 }
196
197 if (clip.quickReject(r)) {
198 return;
199 }
200 if (!clip.quickContains(r)) {
201 const SkRegion* clipRgn;
202 if (clip.isBW()) {
203 clipRgn = &clip.bwRgn();
204 } else {
205 wrapper.init(clip, blitter);
206 clipRgn = &wrapper.getRgn();
207 blitter = wrapper.getBlitter();
208 }
209 blitter = clipper.apply(blitter, clipRgn);
210 }
211
212 int width = r.width();
213 int height = r.height();
214
215 if ((width | height) == 0) {
216 return;
217 }
218 if (width <= 2 || height <= 2) {
219 blitter->blitRect(r.fLeft, r.fTop, width, height);
220 return;
221 }
222 // if we get here, we know we have 4 segments to draw
223 blitter->blitH(r.fLeft, r.fTop, width); // top
224 blitter->blitRect(r.fLeft, r.fTop + 1, 1, height - 2); // left
225 blitter->blitRect(r.fRight - 1, r.fTop + 1, 1, height - 2); // right
226 blitter->blitH(r.fLeft, r.fBottom - 1, width); // bottom
227}
#define SkScalarFloorToInt(x)
Definition: SkScalar.h:35
SkBlitter * apply(SkBlitter *blitter, const SkRegion *clip, const SkIRect *bounds=nullptr)
Definition: SkBlitter.cpp:626
virtual void blitH(int x, int y, int width)=0
Blit a horizontal run of one or more pixels.
virtual void blitRect(int x, int y, int width, int height)
Blit a solid rectangle one or more pixels wide.
Definition: SkBlitter.cpp:133
int32_t height
int32_t width
bool intersect(const SkIRect &r)
Definition: SkRect.h:513
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
Definition: SkRect.h:91
constexpr int32_t height() const
Definition: SkRect.h:165
constexpr int32_t width() const
Definition: SkRect.h:158
int32_t fLeft
smaller x-axis bounds
Definition: SkRect.h:33
int32_t fRight
larger x-axis bounds
Definition: SkRect.h:35
SkRect makeOutset(float dx, float dy) const
Definition: SkRect.h:1002

◆ HairRoundPath()

void SkScan::HairRoundPath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 673 of file SkScan_Hairline.cpp.

673 {
674 hair_path<SkPaint::kRound_Cap>(path, clip, blitter, SkScan::HairLineRgn);
675}

◆ HairSquarePath()

void SkScan::HairSquarePath ( const SkPath path,
const SkRasterClip clip,
SkBlitter blitter 
)
static

Definition at line 665 of file SkScan_Hairline.cpp.

665 {
666 hair_path<SkPaint::kSquare_Cap>(path, clip, blitter, SkScan::HairLineRgn);
667}

◆ PathRequiresTiling()

bool SkScan::PathRequiresTiling ( const SkIRect bounds)
static

Definition at line 688 of file SkScan_Path.cpp.

688 {
689 SkRegion out; // ignored
690 return clip_to_limit(SkRegion(bounds), &out);
691}
friend class SkRegion
Definition: SkScan.h:76

Friends And Related Function Documentation

◆ SkAAClip

friend class SkAAClip
friend

Definition at line 75 of file SkScan.h.

◆ SkRegion

friend class SkRegion
friend

Definition at line 76 of file SkScan.h.


The documentation for this class was generated from the following files: