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