11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMaskFilter.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlitter.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBounder.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBuffer.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDraw.h"
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRasterClip.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerbool SkMaskFilter::filterMask(SkMask*, const SkMask&, const SkMatrix&,
1835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                              SkIPoint*) {
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              const SkRasterClip& clip, SkBounder* bounder,
2435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                              SkBlitter* blitter) {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMask  srcM, dstM;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), this, &matrix, &srcM,
2835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                            SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoMaskFreeImage autoSrc(srcM.fImage);
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (!this->filterMask(&dstM, srcM, matrix, NULL)) {
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    }
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoMaskFreeImage autoDst(dstM.fImage);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // if we get here, we need to (possibly) resolve the clip and blitter
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClipBlitterWrapper wrapper(clip, blitter);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    blitter = wrapper.getBlitter();
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRegion::Cliperator clipper(wrapper.getRgn(), dstM.fBounds);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (!clipper.done() && (bounder == NULL || bounder->doIRect(dstM.fBounds))) {
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkIRect& cr = clipper.rect();
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        do {
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            blitter->blitMask(dstM, cr);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            clipper.next();
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } while (!clipper.done());
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
551cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) const {
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return kNone_BlurType;
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
59717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenbergervoid SkMaskFilter::computeFastBounds(const SkRect& src, SkRect* dst) {
60717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkMask  srcM, dstM;
61717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger
62717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    srcM.fImage = NULL;
63717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    src.roundOut(&srcM.fBounds);
64717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    srcM.fRowBytes = 0;
65717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    srcM.fFormat = SkMask::kA8_Format;
66717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger
67717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkIPoint margin;    // ignored
68717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    if (this->filterMask(&dstM, srcM, SkMatrix::I(), &margin)) {
69717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        dst->set(dstM.fBounds);
70717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    } else {
71717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        dst->set(srcM.fBounds);
72717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    }
73717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger}
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
76