1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/core/SkScan.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,109 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkScan.h" 1.14 +#include "SkBlitter.h" 1.15 +#include "SkRasterClip.h" 1.16 + 1.17 +static inline void blitrect(SkBlitter* blitter, const SkIRect& r) { 1.18 + blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); 1.19 +} 1.20 + 1.21 +void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, 1.22 + SkBlitter* blitter) { 1.23 + if (!r.isEmpty()) { 1.24 + if (clip) { 1.25 + if (clip->isRect()) { 1.26 + const SkIRect& clipBounds = clip->getBounds(); 1.27 + 1.28 + if (clipBounds.contains(r)) { 1.29 + blitrect(blitter, r); 1.30 + } else { 1.31 + SkIRect rr = r; 1.32 + if (rr.intersect(clipBounds)) { 1.33 + blitrect(blitter, rr); 1.34 + } 1.35 + } 1.36 + } else { 1.37 + SkRegion::Cliperator cliper(*clip, r); 1.38 + const SkIRect& rr = cliper.rect(); 1.39 + 1.40 + while (!cliper.done()) { 1.41 + blitrect(blitter, rr); 1.42 + cliper.next(); 1.43 + } 1.44 + } 1.45 + } else { 1.46 + blitrect(blitter, r); 1.47 + } 1.48 + } 1.49 +} 1.50 + 1.51 +void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, 1.52 + SkBlitter* blitter) { 1.53 + SkIRect r; 1.54 + 1.55 + XRect_round(xr, &r); 1.56 + SkScan::FillIRect(r, clip, blitter); 1.57 +} 1.58 + 1.59 +void SkScan::FillRect(const SkRect& r, const SkRegion* clip, 1.60 + SkBlitter* blitter) { 1.61 + SkIRect ir; 1.62 + 1.63 + r.round(&ir); 1.64 + SkScan::FillIRect(ir, clip, blitter); 1.65 +} 1.66 + 1.67 +/////////////////////////////////////////////////////////////////////////////// 1.68 + 1.69 +void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip, 1.70 + SkBlitter* blitter) { 1.71 + if (clip.isEmpty() || r.isEmpty()) { 1.72 + return; 1.73 + } 1.74 + 1.75 + if (clip.isBW()) { 1.76 + FillIRect(r, &clip.bwRgn(), blitter); 1.77 + return; 1.78 + } 1.79 + 1.80 + SkAAClipBlitterWrapper wrapper(clip, blitter); 1.81 + FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 1.82 +} 1.83 + 1.84 +void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip, 1.85 + SkBlitter* blitter) { 1.86 + if (clip.isEmpty() || xr.isEmpty()) { 1.87 + return; 1.88 + } 1.89 + 1.90 + if (clip.isBW()) { 1.91 + FillXRect(xr, &clip.bwRgn(), blitter); 1.92 + return; 1.93 + } 1.94 + 1.95 + SkAAClipBlitterWrapper wrapper(clip, blitter); 1.96 + FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); 1.97 +} 1.98 + 1.99 +void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip, 1.100 + SkBlitter* blitter) { 1.101 + if (clip.isEmpty() || r.isEmpty()) { 1.102 + return; 1.103 + } 1.104 + 1.105 + if (clip.isBW()) { 1.106 + FillRect(r, &clip.bwRgn(), blitter); 1.107 + return; 1.108 + } 1.109 + 1.110 + SkAAClipBlitterWrapper wrapper(clip, blitter); 1.111 + FillRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 1.112 +}