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