1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScan.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlitter.h" 11da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com#include "SkRasterClip.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 13bfebe22ed54d1e3a00888292f10ed8b9714135d3liyuqian#ifdef SK_NO_ANALYTIC_AA 1406dd5c77a6ca6c484c683f1006a7bb6742f8917eliyuqian std::atomic<bool> gSkUseAnalyticAA{false}; 15bfebe22ed54d1e3a00888292f10ed8b9714135d3liyuqian#else 16bfebe22ed54d1e3a00888292f10ed8b9714135d3liyuqian std::atomic<bool> gSkUseAnalyticAA{true}; 17ebcb8aadae70b25d4ac023b4f987a469b6d91f41liyuqian#endif 18511f2d79bf6ea0ee858a3468d3aa8dcbfca58648Mike Klein 19550148ba572acc75e73d3c7d600ea7fa43db55f2Yuqian Listd::atomic<bool> gSkForceAnalyticAA{false}; 20550148ba572acc75e73d3c7d600ea7fa43db55f2Yuqian Li 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline void blitrect(SkBlitter* blitter, const SkIRect& r) { 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!r.isEmpty()) { 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clip) { 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clip->isRect()) { 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkIRect& clipBounds = clip->getBounds(); 31fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clipBounds.contains(r)) { 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, r); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect rr = r; 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (rr.intersect(clipBounds)) { 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, rr); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRegion::Cliperator cliper(*clip, r); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkIRect& rr = cliper.rect(); 43fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (!cliper.done()) { 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, rr); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com cliper.next(); 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, r); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect r; 58fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com XRect_round(xr, &r); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::FillIRect(r, clip, blitter); 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillRect(const SkRect& r, const SkRegion* clip, 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect ir; 66fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.round(&ir); 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::FillIRect(ir, clip, blitter); 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 71da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com/////////////////////////////////////////////////////////////////////////////// 72da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 73da96563e31e57d28648087f0ef2806f4489b13d4reed@google.comvoid SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip, 74da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com SkBlitter* blitter) { 75da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com if (clip.isEmpty() || r.isEmpty()) { 76da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com return; 77da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com } 78fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 79da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com if (clip.isBW()) { 80da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com FillIRect(r, &clip.bwRgn(), blitter); 81da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com return; 82da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com } 83da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 84045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 85045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 86045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com} 87045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 88045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip, 89045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter* blitter) { 90045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isEmpty() || xr.isEmpty()) { 91045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 92045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 93fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 94045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isBW()) { 95045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillXRect(xr, &clip.bwRgn(), blitter); 96045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 97045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 98045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 99045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 100045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); 101da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com} 102da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 103045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkScan::FillRect(const SkRect& r, const SkRasterClip& clip, 104045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter* blitter) { 105045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isEmpty() || r.isEmpty()) { 106045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 107045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 109045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isBW()) { 110045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillRect(r, &clip.bwRgn(), blitter); 111045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 112045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 113045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 114045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 115045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 116045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com} 117