static bool operator==(const SkRasterClip& a, const SkRasterClip& b) { if (a.isEmpty()) { return b.isEmpty(); } if (b.isEmpty()) { return false; } SkMask ma, mb; copyToMask(a, &ma); copyToMask(b, &mb); SkAutoMaskFreeImage aCleanUp(ma.fImage); SkAutoMaskFreeImage bCleanUp(mb.fImage); return ma == mb; }
SkRasterClip::SkRasterClip(const SkRasterClip& src) { AUTO_RASTERCLIP_VALIDATE(src); fIsBW = src.fIsBW; if (fIsBW) { fBW = src.fBW; } else { fAA = src.fAA; } fIsEmpty = src.isEmpty(); fIsRect = src.isRect(); SkDEBUGCODE(this->validate();) }
void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip, SkBlitter* blitter) { if (clip.isEmpty() || xr.isEmpty()) { return; } if (clip.isBW()) { FillXRect(xr, &clip.bwRgn(), blitter); return; } SkAAClipBlitterWrapper wrapper(clip, blitter); FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); }
void SkScan::FillTriangle(const SkPoint pts[], const SkRasterClip& clip, SkBlitter* blitter) { if (clip.isEmpty()) { return; } SkRect r; r.set(pts, 3); // If r is too large (larger than can easily fit in SkFixed) then we need perform geometric // clipping. This is a bit of work, so we just call the general FillPath() to handle it. // Use FixedMax/2 as the limit so we can subtract two edges and still store that in Fixed. const SkScalar limit = SK_MaxS16 >> 1; if (!SkRect::MakeLTRB(-limit, -limit, limit, limit).contains(r)) { SkPath path; path.addPoly(pts, 3, false); FillPath(path, clip, blitter); return; } SkIRect ir = conservative_round_to_int(r); if (ir.isEmpty() || !SkIRect::Intersects(ir, clip.getBounds())) { return; } SkAAClipBlitterWrapper wrap; const SkRegion* clipRgn; if (clip.isBW()) { clipRgn = &clip.bwRgn(); } else { wrap.init(clip, blitter); clipRgn = &wrap.getRgn(); blitter = wrap.getBlitter(); } SkScanClipper clipper(blitter, clipRgn, ir); blitter = clipper.getBlitter(); if (blitter) { sk_fill_triangle(pts, clipper.getClipRect(), blitter, ir); } }