diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/core/SkScan.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/core/SkScan.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,109 @@ + +/* + * 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 "SkScan.h" +#include "SkBlitter.h" +#include "SkRasterClip.h" + +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()); +}