1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci 9cb93a386Sopenharmony_ci#include "src/core/SkBlitter.h" 10cb93a386Sopenharmony_ci#include "src/core/SkRasterClip.h" 11cb93a386Sopenharmony_ci#include "src/core/SkScan.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cistd::atomic<bool> gSkUseAnalyticAA{true}; 14cb93a386Sopenharmony_cistd::atomic<bool> gSkForceAnalyticAA{false}; 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cistatic inline void blitrect(SkBlitter* blitter, const SkIRect& r) { 17cb93a386Sopenharmony_ci blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); 18cb93a386Sopenharmony_ci} 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_civoid SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, 21cb93a386Sopenharmony_ci SkBlitter* blitter) { 22cb93a386Sopenharmony_ci if (!r.isEmpty()) { 23cb93a386Sopenharmony_ci if (clip) { 24cb93a386Sopenharmony_ci if (clip->isRect()) { 25cb93a386Sopenharmony_ci const SkIRect& clipBounds = clip->getBounds(); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci if (clipBounds.contains(r)) { 28cb93a386Sopenharmony_ci blitrect(blitter, r); 29cb93a386Sopenharmony_ci } else { 30cb93a386Sopenharmony_ci SkIRect rr = r; 31cb93a386Sopenharmony_ci if (rr.intersect(clipBounds)) { 32cb93a386Sopenharmony_ci blitrect(blitter, rr); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci } else { 36cb93a386Sopenharmony_ci SkRegion::Cliperator cliper(*clip, r); 37cb93a386Sopenharmony_ci const SkIRect& rr = cliper.rect(); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci while (!cliper.done()) { 40cb93a386Sopenharmony_ci blitrect(blitter, rr); 41cb93a386Sopenharmony_ci cliper.next(); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci } else { 45cb93a386Sopenharmony_ci blitrect(blitter, r); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_civoid SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, 51cb93a386Sopenharmony_ci SkBlitter* blitter) { 52cb93a386Sopenharmony_ci SkIRect r; 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci XRect_round(xr, &r); 55cb93a386Sopenharmony_ci SkScan::FillIRect(r, clip, blitter); 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_civoid SkScan::FillRect(const SkRect& r, const SkRegion* clip, 59cb93a386Sopenharmony_ci SkBlitter* blitter) { 60cb93a386Sopenharmony_ci SkIRect ir; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci r.round(&ir); 63cb93a386Sopenharmony_ci SkScan::FillIRect(ir, clip, blitter); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_civoid SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip, 69cb93a386Sopenharmony_ci SkBlitter* blitter) { 70cb93a386Sopenharmony_ci if (clip.isEmpty() || r.isEmpty()) { 71cb93a386Sopenharmony_ci return; 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci if (clip.isBW()) { 75cb93a386Sopenharmony_ci FillIRect(r, &clip.bwRgn(), blitter); 76cb93a386Sopenharmony_ci return; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci SkAAClipBlitterWrapper wrapper(clip, blitter); 80cb93a386Sopenharmony_ci FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 81cb93a386Sopenharmony_ci} 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_civoid SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip, 84cb93a386Sopenharmony_ci SkBlitter* blitter) { 85cb93a386Sopenharmony_ci if (clip.isEmpty() || xr.isEmpty()) { 86cb93a386Sopenharmony_ci return; 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci if (clip.isBW()) { 90cb93a386Sopenharmony_ci FillXRect(xr, &clip.bwRgn(), blitter); 91cb93a386Sopenharmony_ci return; 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci SkAAClipBlitterWrapper wrapper(clip, blitter); 95cb93a386Sopenharmony_ci FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); 96cb93a386Sopenharmony_ci} 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_civoid SkScan::FillRect(const SkRect& r, const SkRasterClip& clip, 99cb93a386Sopenharmony_ci SkBlitter* blitter) { 100cb93a386Sopenharmony_ci if (clip.isEmpty() || r.isEmpty()) { 101cb93a386Sopenharmony_ci return; 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci if (clip.isBW()) { 105cb93a386Sopenharmony_ci FillRect(r, &clip.bwRgn(), blitter); 106cb93a386Sopenharmony_ci return; 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci SkAAClipBlitterWrapper wrapper(clip, blitter); 110cb93a386Sopenharmony_ci FillRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 111cb93a386Sopenharmony_ci} 112