1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScan.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlitter.h" 12da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com#include "SkRasterClip.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline void blitrect(SkBlitter* blitter, const SkIRect& r) { 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!r.isEmpty()) { 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clip) { 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clip->isRect()) { 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkIRect& clipBounds = clip->getBounds(); 24fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (clipBounds.contains(r)) { 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, r); 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect rr = r; 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (rr.intersect(clipBounds)) { 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, rr); 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRegion::Cliperator cliper(*clip, r); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkIRect& rr = cliper.rect(); 36fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (!cliper.done()) { 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, rr); 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com cliper.next(); 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com blitrect(blitter, r); 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect r; 51fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com XRect_round(xr, &r); 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::FillIRect(r, clip, blitter); 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkScan::FillRect(const SkRect& r, const SkRegion* clip, 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIRect ir; 59fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.round(&ir); 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::FillIRect(ir, clip, blitter); 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 64da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com/////////////////////////////////////////////////////////////////////////////// 65da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 66da96563e31e57d28648087f0ef2806f4489b13d4reed@google.comvoid SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip, 67da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com SkBlitter* blitter) { 68da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com if (clip.isEmpty() || r.isEmpty()) { 69da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com return; 70da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com } 71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 72da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com if (clip.isBW()) { 73da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com FillIRect(r, &clip.bwRgn(), blitter); 74da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com return; 75da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com } 76da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 77045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 78045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 79045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com} 80045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 81045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip, 82045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter* blitter) { 83045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isEmpty() || xr.isEmpty()) { 84045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 85045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 86fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 87045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isBW()) { 88045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillXRect(xr, &clip.bwRgn(), blitter); 89045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 90045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 91045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 92045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 93045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); 94da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com} 95da96563e31e57d28648087f0ef2806f4489b13d4reed@google.com 96045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkScan::FillRect(const SkRect& r, const SkRasterClip& clip, 97045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter* blitter) { 98045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isEmpty() || r.isEmpty()) { 99045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 100045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 101fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 102045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com if (clip.isBW()) { 103045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillRect(r, &clip.bwRgn(), blitter); 104045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com return; 105045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 106045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 107045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAAClipBlitterWrapper wrapper(clip, blitter); 108045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com FillRect(r, &wrapper.getRgn(), wrapper.getBlitter()); 109045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com} 110