diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp index b5c006902a..a3d60abc21 100644 --- a/gm/samplerstress.cpp +++ b/gm/samplerstress.cpp @@ -8,79 +8,10 @@ #include "gm.h" #include "SkCanvas.h" #include "SkShader.h" -#include "SkMaskFilter.h" +#include "SkStippleMaskFilter.h" namespace skiagm { - -/** - * Simple MaskFilter that creates a screen door stipple pattern - */ -class SkStippleMaskFilter : public SkMaskFilter { -public: - SkStippleMaskFilter() : INHERITED() { - } - - virtual ~SkStippleMaskFilter() { - } - - virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, - SkIPoint* margin) SK_OVERRIDE { - - if (src.fFormat != SkMask::kA8_Format) { - return false; - } - - dst->fBounds = src.fBounds; - dst->fRowBytes = dst->fBounds.width(); - dst->fFormat = SkMask::kA8_Format; - dst->fImage = NULL; - - if (NULL != src.fImage) { - size_t dstSize = dst->computeImageSize(); - if (0 == dstSize) { - return false; // too big to allocate, abort - } - - dst->fImage = SkMask::AllocImage(dstSize); - - uint8_t* srcScanLine = src.fImage; - uint8_t* scanline = dst->fImage; - - for (int y = 0; y < src.fBounds.height(); ++y) { - for (int x = 0; x < src.fBounds.width(); ++x) { - SkASSERT(size_t(scanline - dst->fImage) < dstSize); - scanline[x] = srcScanLine[x] && ((x+y) % 2) ? 0xFF : 0x00; - } - scanline += dst->fRowBytes; - srcScanLine += src.fRowBytes; - } - } - - return true; - } - - static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { - return SkNEW(SkStippleMaskFilter); - } - - virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {} - - // getFactory is from SkFlattenable - virtual Factory getFactory() SK_OVERRIDE { - return CreateProc; - } - - // getFormat is from SkMaskFilter - virtual SkMask::Format getFormat() SK_OVERRIDE { - return SkMask::kA8_Format; - } -protected: - -private: - typedef SkMaskFilter INHERITED; -}; - /** * Stress test the samplers by rendering a textured glyph with a mask and * an AA clip diff --git a/gyp/effects.gyp b/gyp/effects.gyp index 394ec30f09..7d0cd9a732 100644 --- a/gyp/effects.gyp +++ b/gyp/effects.gyp @@ -33,6 +33,7 @@ '../include/effects/SkPixelXorXfermode.h', '../include/effects/SkPorterDuff.h', '../include/effects/SkRectShape.h', + '../include/effects/SkStippleMaskFilter.h', '../include/effects/SkTableColorFilter.h', '../include/effects/SkTableMaskFilter.h', '../include/effects/SkTransparentShader.h', @@ -71,6 +72,7 @@ '../src/effects/SkPorterDuff.cpp', '../src/effects/SkRadialGradient_Table.h', '../src/effects/SkRectShape.cpp', + '../src/effects/SkStippleMaskFilter.cpp', '../src/effects/SkTableColorFilter.cpp', '../src/effects/SkTableMaskFilter.cpp', '../src/effects/SkTestImageFilters.cpp', diff --git a/include/effects/SkStippleMaskFilter.h b/include/effects/SkStippleMaskFilter.h new file mode 100644 index 0000000000..c8abe46d92 --- /dev/null +++ b/include/effects/SkStippleMaskFilter.h @@ -0,0 +1,41 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkStippleMaskFilter_DEFINED +#define SkStippleMaskFilter_DEFINED + +#include "SkMaskFilter.h" + +/** + * Simple MaskFilter that creates a screen door stipple pattern + */ +class SkStippleMaskFilter : public SkMaskFilter { +public: + SkStippleMaskFilter() : INHERITED() { + } + + virtual bool filterMask(SkMask* dst, const SkMask& src, + const SkMatrix& matrix, + SkIPoint* margin) SK_OVERRIDE; + + // getFormat is from SkMaskFilter + virtual SkMask::Format getFormat() SK_OVERRIDE { + return SkMask::kA8_Format; + } + + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkStippleMaskFilter); + +protected: + SkStippleMaskFilter::SkStippleMaskFilter(SkFlattenableReadBuffer& buffer) + : SkMaskFilter(buffer) { + } + +private: + typedef SkMaskFilter INHERITED; +}; + +#endif // SkStippleMaskFilter_DEFINED \ No newline at end of file diff --git a/src/effects/SkStippleMaskFilter.cpp b/src/effects/SkStippleMaskFilter.cpp new file mode 100644 index 0000000000..de5da841cc --- /dev/null +++ b/src/effects/SkStippleMaskFilter.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkStippleMaskFilter.h" + + +bool SkStippleMaskFilter::filterMask(SkMask* dst, + const SkMask& src, + const SkMatrix& matrix, + SkIPoint* margin) { + + if (src.fFormat != SkMask::kA8_Format) { + return false; + } + + dst->fBounds = src.fBounds; + dst->fRowBytes = dst->fBounds.width(); + dst->fFormat = SkMask::kA8_Format; + dst->fImage = NULL; + + if (NULL != src.fImage) { + size_t dstSize = dst->computeImageSize(); + if (0 == dstSize) { + return false; // too big to allocate, abort + } + + dst->fImage = SkMask::AllocImage(dstSize); + + uint8_t* srcScanLine = src.fImage; + uint8_t* scanline = dst->fImage; + + for (int y = 0; y < src.fBounds.height(); ++y) { + for (int x = 0; x < src.fBounds.width(); ++x) { + scanline[x] = srcScanLine[x] && ((x+y) & 0x1) ? 0xFF : 0x00; + } + scanline += dst->fRowBytes; + srcScanLine += src.fRowBytes; + } + } + + return true; +} + +SK_DEFINE_FLATTENABLE_REGISTRAR(SkStippleMaskFilter) diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp index 81f88311a4..33af8a5487 100644 --- a/src/ports/SkGlobalInitialization_default.cpp +++ b/src/ports/SkGlobalInitialization_default.cpp @@ -68,6 +68,7 @@ void SkFlattenable::InitializeFlattenables() { SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPath2DPathEffect) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPixelXorXfermode) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRectShape) + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkStippleMaskFilter) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSumPathEffect) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkShape)