diff options
author | jcgregorio <jcgregorio@google.com> | 2016-07-18 08:18:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-07-18 08:18:51 -0700 |
commit | eb9a84aa576e6278afca6f0cbef4ac80d85cc001 (patch) | |
tree | c43e608270b58e1e2c541788805bcb1f2a8ae220 | |
parent | 0ae36a2cebf35c68c3013383d3b640f70034be55 (diff) |
Revert of remove unused TableMaskFilter (patchset #1 id:1 of https://codereview.chromium.org/2156463002/ )
Reason for revert:
Needed for Android:
frameworks/base/core/jni/android/graphics/MaskFilter.cpp:5:10: fatal error: 'SkTableMaskFilter.h' file not found
Original issue's description:
> remove unused TableMaskFilter
>
> BUG=skia:
> GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2156463002
>
> TBR=
>
> Committed: https://skia.googlesource.com/skia/+/59779ae8ce316bf8b8082ec2df1683ccd38161f1
TBR=reed@google.com
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=skia:
Review-Url: https://codereview.chromium.org/2156183002
-rw-r--r-- | gyp/effects.gypi | 2 | ||||
-rw-r--r-- | include/effects/SkTableMaskFilter.h | 66 | ||||
-rw-r--r-- | src/effects/SkTableMaskFilter.cpp | 145 |
3 files changed, 213 insertions, 0 deletions
diff --git a/gyp/effects.gypi b/gyp/effects.gypi index 149d9bfc2e..33c8c13d41 100644 --- a/gyp/effects.gypi +++ b/gyp/effects.gypi @@ -61,6 +61,7 @@ '<(skia_src_path)/effects/SkPerlinNoiseShader.cpp', '<(skia_src_path)/effects/SkPictureImageFilter.cpp', '<(skia_src_path)/effects/SkTableColorFilter.cpp', + '<(skia_src_path)/effects/SkTableMaskFilter.cpp', '<(skia_src_path)/effects/SkTileImageFilter.cpp', '<(skia_src_path)/effects/SkXfermodeImageFilter.cpp', @@ -116,6 +117,7 @@ '<(skia_include_path)/effects/SkPaintImageFilter.h', '<(skia_include_path)/effects/SkPerlinNoiseShader.h', '<(skia_include_path)/effects/SkTableColorFilter.h', + '<(skia_include_path)/effects/SkTableMaskFilter.h', '<(skia_include_path)/effects/SkTileImageFilter.h', '<(skia_include_path)/effects/SkXfermodeImageFilter.h', ], diff --git a/include/effects/SkTableMaskFilter.h b/include/effects/SkTableMaskFilter.h new file mode 100644 index 0000000000..757ddf2084 --- /dev/null +++ b/include/effects/SkTableMaskFilter.h @@ -0,0 +1,66 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkTableMaskFilter_DEFINED +#define SkTableMaskFilter_DEFINED + +#include "SkMaskFilter.h" +#include "SkScalar.h" + +/** \class SkTableMaskFilter + + Applies a table lookup on each of the alpha values in the mask. + Helper methods create some common tables (e.g. gamma, clipping) + */ +class SK_API SkTableMaskFilter : public SkMaskFilter { +public: + /** Utility that sets the gamma table + */ + static void MakeGammaTable(uint8_t table[256], SkScalar gamma); + + /** Utility that creates a clipping table: clamps values below min to 0 + and above max to 255, and rescales the remaining into 0..255 + */ + static void MakeClipTable(uint8_t table[256], uint8_t min, uint8_t max); + + static SkMaskFilter* Create(const uint8_t table[256]) { + return new SkTableMaskFilter(table); + } + + static SkMaskFilter* CreateGamma(SkScalar gamma) { + uint8_t table[256]; + MakeGammaTable(table, gamma); + return new SkTableMaskFilter(table); + } + + static SkMaskFilter* CreateClip(uint8_t min, uint8_t max) { + uint8_t table[256]; + MakeClipTable(table, min, max); + return new SkTableMaskFilter(table); + } + + SkMask::Format getFormat() const override; + bool filterMask(SkMask*, const SkMask&, const SkMatrix&, SkIPoint*) const override; + + SK_TO_STRING_OVERRIDE() + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTableMaskFilter) + +protected: + virtual ~SkTableMaskFilter(); + + void flatten(SkWriteBuffer&) const override; + +private: + SkTableMaskFilter(); + explicit SkTableMaskFilter(const uint8_t table[256]); + + uint8_t fTable[256]; + + typedef SkMaskFilter INHERITED; +}; + +#endif diff --git a/src/effects/SkTableMaskFilter.cpp b/src/effects/SkTableMaskFilter.cpp new file mode 100644 index 0000000000..a3b4038a2f --- /dev/null +++ b/src/effects/SkTableMaskFilter.cpp @@ -0,0 +1,145 @@ +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#include "SkFixed.h" +#include "SkReadBuffer.h" +#include "SkString.h" +#include "SkTableMaskFilter.h" +#include "SkWriteBuffer.h" + +SkTableMaskFilter::SkTableMaskFilter() { + for (int i = 0; i < 256; i++) { + fTable[i] = i; + } +} + +SkTableMaskFilter::SkTableMaskFilter(const uint8_t table[256]) { + memcpy(fTable, table, sizeof(fTable)); +} + +SkTableMaskFilter::~SkTableMaskFilter() {} + +bool SkTableMaskFilter::filterMask(SkMask* dst, const SkMask& src, + const SkMatrix&, SkIPoint* margin) const { + if (src.fFormat != SkMask::kA8_Format) { + return false; + } + + dst->fBounds = src.fBounds; + dst->fRowBytes = SkAlign4(dst->fBounds.width()); + dst->fFormat = SkMask::kA8_Format; + dst->fImage = nullptr; + + if (src.fImage) { + dst->fImage = SkMask::AllocImage(dst->computeImageSize()); + + const uint8_t* srcP = src.fImage; + uint8_t* dstP = dst->fImage; + const uint8_t* table = fTable; + int dstWidth = dst->fBounds.width(); + int extraZeros = dst->fRowBytes - dstWidth; + + for (int y = dst->fBounds.height() - 1; y >= 0; --y) { + for (int x = dstWidth - 1; x >= 0; --x) { + dstP[x] = table[srcP[x]]; + } + srcP += src.fRowBytes; + // we can't just inc dstP by rowbytes, because if it has any + // padding between its width and its rowbytes, we need to zero those + // so that the bitters can read those safely if that is faster for + // them + dstP += dstWidth; + for (int i = extraZeros - 1; i >= 0; --i) { + *dstP++ = 0; + } + } + } + + if (margin) { + margin->set(0, 0); + } + return true; +} + +SkMask::Format SkTableMaskFilter::getFormat() const { + return SkMask::kA8_Format; +} + +void SkTableMaskFilter::flatten(SkWriteBuffer& wb) const { + wb.writeByteArray(fTable, 256); +} + +sk_sp<SkFlattenable> SkTableMaskFilter::CreateProc(SkReadBuffer& buffer) { + uint8_t table[256]; + if (!buffer.readByteArray(table, 256)) { + return nullptr; + } + return sk_sp<SkFlattenable>(Create(table)); +} + +/////////////////////////////////////////////////////////////////////////////// + +void SkTableMaskFilter::MakeGammaTable(uint8_t table[256], SkScalar gamma) { + const float dx = 1 / 255.0f; + const float g = SkScalarToFloat(gamma); + + float x = 0; + for (int i = 0; i < 256; i++) { + // float ee = powf(x, g) * 255; + table[i] = SkTPin(sk_float_round2int(powf(x, g) * 255), 0, 255); + x += dx; + } +} + +void SkTableMaskFilter::MakeClipTable(uint8_t table[256], uint8_t min, + uint8_t max) { + if (0 == max) { + max = 1; + } + if (min >= max) { + min = max - 1; + } + SkASSERT(min < max); + + SkFixed scale = (1 << 16) * 255 / (max - min); + memset(table, 0, min + 1); + for (int i = min + 1; i < max; i++) { + int value = SkFixedRoundToInt(scale * (i - min)); + SkASSERT(value <= 255); + table[i] = value; + } + memset(table + max, 255, 256 - max); + +#if 0 + int j; + for (j = 0; j < 256; j++) { + if (table[j]) { + break; + } + } + SkDebugf("%d %d start [%d]", min, max, j); + for (; j < 256; j++) { + SkDebugf(" %d", table[j]); + } + SkDebugf("\n\n"); +#endif +} + +#ifndef SK_IGNORE_TO_STRING +void SkTableMaskFilter::toString(SkString* str) const { + str->append("SkTableMaskFilter: ("); + + str->append("table: "); + for (int i = 0; i < 255; ++i) { + str->appendf("%d, ", fTable[i]); + } + str->appendf("%d", fTable[255]); + + str->append(")"); +} +#endif |