Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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:3824
void init(SkBlitter *blitter, const SkAAClip *aaclip)
Definition SkAAClip.h:96
bool isEmpty() const
Definition SkPath.cpp:406
const SkRect & getBounds() const
Definition SkPath.cpp:420
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 821 of file SkScan_Antihair.cpp.

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

◆ AntiFillXRect()

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

Definition at line 757 of file SkScan_Antihair.cpp.

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

◆ AntiFrameRect()

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

Definition at line 1015 of file SkScan_Antihair.cpp.

1016 {
1017 if (clip.isBW()) {
1018 AntiFrameRect(r, strokeSize, &clip.bwRgn(), blitter);
1019 } else {
1020 SkAAClipBlitterWrapper wrap(clip, blitter);
1021 AntiFrameRect(r, strokeSize, &wrap.getRgn(), wrap.getBlitter());
1022 }
1023}
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 737 of file SkScan_Hairline.cpp.

738 {
739 if (clip.isBW()) {
740 AntiHairLineRgn(pts, count, &clip.bwRgn(), blitter);
741 } else {
742 const SkRegion* clipRgn = nullptr;
743
744 SkRect r;
745 r.setBounds(pts, count);
746
748 if (!clip.quickContains(r.roundOut().makeOutset(1, 1))) {
749 wrap.init(clip, blitter);
750 blitter = wrap.getBlitter();
751 clipRgn = &wrap.getRgn();
752 }
753 AntiHairLineRgn(pts, count, clipRgn, blitter);
754 }
755}
int count
void init(const SkRasterClip &, SkBlitter *)
const SkRegion & getRgn() const
SkBlitter * getBlitter()
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 660 of file SkScan_Hairline.cpp.

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

◆ AntiHairRect()

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

Definition at line 620 of file SkScan_Antihair.cpp.

621 {
622 SkPoint pts[5];
623
624 pts[0].set(rect.fLeft, rect.fTop);
625 pts[1].set(rect.fRight, rect.fTop);
626 pts[2].set(rect.fRight, rect.fBottom);
627 pts[3].set(rect.fLeft, rect.fBottom);
628 pts[4] = pts[0];
629 SkScan::AntiHairLine(pts, 5, clip, blitter);
630}
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)

◆ AntiHairRoundPath()

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

Definition at line 676 of file SkScan_Hairline.cpp.

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

◆ AntiHairSquarePath()

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

Definition at line 668 of file SkScan_Hairline.cpp.

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

◆ 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 681 of file SkScan_Path.cpp.

682 {
683 SkRegion rgn(ir);
684 FillPath(path, rgn, blitter);
685}
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 624 of file SkScan_Path.cpp.

625 {
626 if (origClip.isEmpty()) {
627 return;
628 }
629
630 // Our edges are fixed-point, and don't like the bounds of the clip to
631 // exceed that. Here we trim the clip just so we don't overflow later on
632 const SkRegion* clipPtr = &origClip;
633 SkRegion finiteClip;
634 if (clip_to_limit(origClip, &finiteClip)) {
635 if (finiteClip.isEmpty()) {
636 return;
637 }
638 clipPtr = &finiteClip;
639 }
640 // don't reference "origClip" any more, just use clipPtr
641
642
643 SkRect bounds = path.getBounds();
644 bool irPreClipped = false;
645 if (!SkRectPriv::MakeLargeS32().contains(bounds)) {
646 if (!bounds.intersect(SkRectPriv::MakeLargeS32())) {
647 bounds.setEmpty();
648 }
649 irPreClipped = true;
650 }
651
653 if (ir.isEmpty()) {
654 if (path.isInverseFillType()) {
655 blitter->blitRegion(*clipPtr);
656 }
657 return;
658 }
659
660 SkScanClipper clipper(blitter, clipPtr, ir, path.isInverseFillType(), irPreClipped);
661
662 blitter = clipper.getBlitter();
663 if (blitter) {
664 // we have to keep our calls to blitter in sorted order, so we
665 // must blit the above section first, then the middle, then the bottom.
666 if (path.isInverseFillType()) {
667 sk_blit_above(blitter, ir, *clipPtr);
668 }
669 SkASSERT(clipper.getClipRect() == nullptr ||
670 *clipper.getClipRect() == clipPtr->getBounds());
671 sk_fill_path(path, clipPtr->getBounds(), blitter, ir.fTop, ir.fBottom,
672 0, clipper.getClipRect() == nullptr);
673 if (path.isInverseFillType()) {
674 sk_blit_below(blitter, ir, *clipPtr);
675 }
676 } else {
677 // what does it mean to not have a blitter if path.isInverseFillType???
678 }
679}
#define SkASSERT(cond)
Definition SkAssert.h:116
static bool contains(const SkRect &r, SkPoint p)
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)
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
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 753 of file SkScan_Path.cpp.

754 {
755 if (clip.isEmpty()) {
756 return;
757 }
758
759 SkRect r;
760 r.setBounds(pts, 3);
761 // If r is too large (larger than can easily fit in SkFixed) then we need perform geometric
762 // clipping. This is a bit of work, so we just call the general FillPath() to handle it.
763 // Use FixedMax/2 as the limit so we can subtract two edges and still store that in Fixed.
764 const SkScalar limit = SK_MaxS16 >> 1;
765 if (!SkRect::MakeLTRB(-limit, -limit, limit, limit).contains(r)) {
766 SkPath path;
767 path.addPoly(pts, 3, false);
768 FillPath(path, clip, blitter);
769 return;
770 }
771
773 if (ir.isEmpty() || !SkIRect::Intersects(ir, clip.getBounds())) {
774 return;
775 }
776
778 const SkRegion* clipRgn;
779 if (clip.isBW()) {
780 clipRgn = &clip.bwRgn();
781 } else {
782 wrap.init(clip, blitter);
783 clipRgn = &wrap.getRgn();
784 blitter = wrap.getBlitter();
785 }
786
787 SkScanClipper clipper(blitter, clipRgn, ir);
788 blitter = clipper.getBlitter();
789 if (blitter) {
790 sk_fill_triangle(pts, clipper.getClipRect(), blitter, ir);
791 }
792}
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)
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 682 of file SkScan_Hairline.cpp.

683 {
684 SkASSERT(strokeSize.fX >= 0 && strokeSize.fY >= 0);
685
686 if (strokeSize.fX < 0 || strokeSize.fY < 0) {
687 return;
688 }
689
690 const SkScalar dx = strokeSize.fX;
691 const SkScalar dy = strokeSize.fY;
692 SkScalar rx = SkScalarHalf(dx);
693 SkScalar ry = SkScalarHalf(dy);
694 SkRect outer, tmp;
695
696 outer.setLTRB(r.fLeft - rx, r.fTop - ry, r.fRight + rx, r.fBottom + ry);
697
698 if (r.width() <= dx || r.height() <= dy) {
699 SkScan::FillRect(outer, clip, blitter);
700 return;
701 }
702
703 tmp.setLTRB(outer.fLeft, outer.fTop, outer.fRight, outer.fTop + dy);
704 SkScan::FillRect(tmp, clip, blitter);
705 tmp.fTop = outer.fBottom - dy;
706 tmp.fBottom = outer.fBottom;
707 SkScan::FillRect(tmp, clip, blitter);
708
709 tmp.setLTRB(outer.fLeft, outer.fTop + dy, outer.fLeft + dx, outer.fBottom - dy);
710 SkScan::FillRect(tmp, clip, blitter);
711 tmp.fLeft = outer.fRight - dx;
712 tmp.fRight = outer.fRight;
713 SkScan::FillRect(tmp, clip, blitter);
714}
#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
float fY
y-axis value
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 716 of file SkScan_Hairline.cpp.

717 {
718 if (clip.isBW()) {
719 HairLineRgn(pts, count, &clip.bwRgn(), blitter);
720 } else {
721 const SkRegion* clipRgn = nullptr;
722
723 SkRect r;
724 r.setBounds(pts, count);
726
728 if (!clip.quickContains(r.roundOut())) {
729 wrap.init(clip, blitter);
730 blitter = wrap.getBlitter();
731 clipRgn = &wrap.getRgn();
732 }
733 HairLineRgn(pts, count, clipRgn, blitter);
734 }
735}
#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 656 of file SkScan_Hairline.cpp.

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

◆ HairRect()

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

Definition at line 176 of file SkScan_Hairline.cpp.

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

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

◆ HairSquarePath()

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

Definition at line 664 of file SkScan_Hairline.cpp.

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

◆ PathRequiresTiling()

bool SkScan::PathRequiresTiling ( const SkIRect bounds)
static

Definition at line 687 of file SkScan_Path.cpp.

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

Friends And Related Symbol 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: