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