105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org/* 205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Copyright 2012 The Android Open Source Project 305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * 405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * found in the LICENSE file. 605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org */ 705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#ifndef SkMorphologyImageFilter_DEFINED 1005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#define SkMorphologyImageFilter_DEFINED 1105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 120ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org#include "SkColor.h" 13377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org#include "SkImageFilter.h" 14bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org#include "SkSize.h" 1505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 16377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.orgclass SK_API SkMorphologyImageFilter : public SkImageFilter { 1705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic: 18336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE; 19c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org virtual bool onFilterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst) const SK_OVERRIDE; 2005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 210ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org /** 220ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org * All morphology procs have the same signature: src is the source buffer, dst the 230ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org * destination buffer, radius is the morphology radius, width and height are the bounds 240ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org * of the destination buffer (in pixels), and srcStride and dstStride are the 250ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org * number of pixels per row in each buffer. All buffers are 8888. 260ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org */ 270ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org 280ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius, 290ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org int width, int height, int srcStride, int dstStride); 300ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org 3105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprotected: 32cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input, 335e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco const CropRect* cropRect, uint32_t uniqueID); 340ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org bool filterImageGeneric(Proc procX, Proc procY, 354cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org Proxy*, const SkBitmap& src, const Context&, 36ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const; 379fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 388b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkMorphologyImageFilter(SkReadBuffer& buffer); 399fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 408b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 4184207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU 42302cffba86a188373c99833d83392f33e6014542senorblanco@chromium.org virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; } 430ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src, 444cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org const Context& ctm, SkBitmap* result, 45ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkIPoint* offset) const; 4684207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif 4754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com 4805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org SkISize radius() const { return fRadius; } 4905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 5005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate: 5105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org SkISize fRadius; 52377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org typedef SkImageFilter INHERITED; 5305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org}; 5405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 5505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkDilateImageFilter : public SkMorphologyImageFilter { 5605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic: 57cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org static SkDilateImageFilter* Create(int radiusX, int radiusY, 58cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkImageFilter* input = NULL, 595e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco const CropRect* cropRect = NULL, 605e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco uint32_t uniqueID = 0) { 619fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (radiusX < 0 || radiusY < 0) { 629fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 639fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 645e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco return SkNEW_ARGS(SkDilateImageFilter, (radiusX, radiusY, input, cropRect, uniqueID)); 65cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org } 6605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 674cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, 68ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE; 6984207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU 704cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&, 71ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE; 7284207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif 73ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 74ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter) 7505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 7654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected: 775e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID) 785e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {} 799fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 80bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org explicit SkDilateImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {} 819fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 82cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org 8354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate: 8405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org typedef SkMorphologyImageFilter INHERITED; 8505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org}; 8605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 8705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkErodeImageFilter : public SkMorphologyImageFilter { 8805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic: 89cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org static SkErodeImageFilter* Create(int radiusX, int radiusY, 90cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkImageFilter* input = NULL, 915e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco const CropRect* cropRect = NULL, 925e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco uint32_t uniqueID = 0) { 939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (radiusX < 0 || radiusY < 0) { 949fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 959fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 965e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco return SkNEW_ARGS(SkErodeImageFilter, (radiusX, radiusY, input, cropRect, uniqueID)); 97cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org } 9805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 994cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, 100ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE; 10184207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU 1024cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&, 103ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE; 10484207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif 10505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 106ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter) 10705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 10854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected: 1095e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID) 1105e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {} 1119fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 112bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org explicit SkErodeImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {} 1139fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 114cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org 11505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate: 11605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org typedef SkMorphologyImageFilter INHERITED; 11705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org}; 11805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org 11905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#endif 120