diff options
Diffstat (limited to 'gfx/skia/skia/src/core/SkScan.cpp')
-rw-r--r-- | gfx/skia/skia/src/core/SkScan.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/core/SkScan.cpp b/gfx/skia/skia/src/core/SkScan.cpp new file mode 100644 index 0000000000..b93f5f4f07 --- /dev/null +++ b/gfx/skia/skia/src/core/SkScan.cpp @@ -0,0 +1,111 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#include "src/core/SkBlitter.h" +#include "src/core/SkRasterClip.h" +#include "src/core/SkScan.h" + +std::atomic<bool> gSkUseAnalyticAA{true}; +std::atomic<bool> gSkForceAnalyticAA{false}; + +static inline void blitrect(SkBlitter* blitter, const SkIRect& r) { + blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); +} + +void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, + SkBlitter* blitter) { + if (!r.isEmpty()) { + if (clip) { + if (clip->isRect()) { + const SkIRect& clipBounds = clip->getBounds(); + + if (clipBounds.contains(r)) { + blitrect(blitter, r); + } else { + SkIRect rr = r; + if (rr.intersect(clipBounds)) { + blitrect(blitter, rr); + } + } + } else { + SkRegion::Cliperator cliper(*clip, r); + const SkIRect& rr = cliper.rect(); + + while (!cliper.done()) { + blitrect(blitter, rr); + cliper.next(); + } + } + } else { + blitrect(blitter, r); + } + } +} + +void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, + SkBlitter* blitter) { + SkIRect r; + + XRect_round(xr, &r); + SkScan::FillIRect(r, clip, blitter); +} + +void SkScan::FillRect(const SkRect& r, const SkRegion* clip, + SkBlitter* blitter) { + SkIRect ir; + + r.round(&ir); + SkScan::FillIRect(ir, clip, blitter); +} + +/////////////////////////////////////////////////////////////////////////////// + +void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip, + SkBlitter* blitter) { + if (clip.isEmpty() || r.isEmpty()) { + return; + } + + if (clip.isBW()) { + FillIRect(r, &clip.bwRgn(), blitter); + return; + } + + SkAAClipBlitterWrapper wrapper(clip, blitter); + FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter()); +} + +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::FillRect(const SkRect& r, const SkRasterClip& clip, + SkBlitter* blitter) { + if (clip.isEmpty() || r.isEmpty()) { + return; + } + + if (clip.isBW()) { + FillRect(r, &clip.bwRgn(), blitter); + return; + } + + SkAAClipBlitterWrapper wrapper(clip, blitter); + FillRect(r, &wrapper.getRgn(), wrapper.getBlitter()); +} |