diff options
author | tomhudson <tomhudson@google.com> | 2015-03-24 12:46:40 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-24 12:46:40 -0700 |
commit | 48dc6dc52ecfcc1e0cfd75f637d55c03e4d6bcb2 (patch) | |
tree | c92a7a569751e3143015332c9ab7b28fca174e62 | |
parent | 15bfd075d38e4422a477e22940d06a137f66cc97 (diff) |
Switch DM to use utils/android/SkAndroidSDKCanvas
Use (better) paint filter shared with nanobench, instead
of custom implementation.
R=djsollen@google.com
Review URL: https://codereview.chromium.org/1036523002
-rw-r--r-- | dm/DMSrcSinkAndroid.cpp | 202 | ||||
-rw-r--r-- | gyp/dm.gyp | 3 |
2 files changed, 6 insertions, 199 deletions
diff --git a/dm/DMSrcSinkAndroid.cpp b/dm/DMSrcSinkAndroid.cpp index 36817e18e1..fc83ea4174 100644 --- a/dm/DMSrcSinkAndroid.cpp +++ b/dm/DMSrcSinkAndroid.cpp @@ -12,6 +12,7 @@ #include "DisplayListRenderer.h" #include "IContextFactory.h" #include "RenderNode.h" +#include "SkAndroidSDKCanvas.h" #include "SkCanvas.h" #include "SkiaCanvasProxy.h" #include "SkTLazy.h" @@ -32,204 +33,6 @@ namespace { -/** Discard SkShaders not exposed by the Android Java API. */ - -void CheckShader(SkPaint* paint) { - SkShader* shader = paint->getShader(); - if (!shader) { - return; - } - - if (shader->asABitmap(NULL, NULL, NULL) == SkShader::kDefault_BitmapType) { - return; - } - if (shader->asACompose(NULL)) { - return; - } - SkShader::GradientType gtype = shader->asAGradient(NULL); - if (gtype == SkShader::kLinear_GradientType || - gtype == SkShader::kRadial_GradientType || - gtype == SkShader::kSweep_GradientType) { - return; - } - paint->setShader(NULL); -} - -/** Simplify a paint. */ - -void Filter(SkPaint* paint) { - - uint32_t flags = paint->getFlags(); - flags &= ~SkPaint::kLCDRenderText_Flag; - paint->setFlags(flags); - - // Android doesn't support Xfermodes above kLighten_Mode - SkXfermode::Mode mode; - SkXfermode::AsMode(paint->getXfermode(), &mode); - if (mode > SkXfermode::kLighten_Mode) { - paint->setXfermode(NULL); - } - - // Force bilinear scaling or none - if (paint->getFilterQuality() != kNone_SkFilterQuality) { - paint->setFilterQuality(kLow_SkFilterQuality); - } - - CheckShader(paint); - - // Android SDK only supports mode & matrix color filters - // (and, again, no modes above kLighten_Mode). - SkColorFilter* cf = paint->getColorFilter(); - if (cf) { - SkColor color; - SkXfermode::Mode mode; - SkScalar srcColorMatrix[20]; - bool isMode = cf->asColorMode(&color, &mode); - if (isMode && mode > SkXfermode::kLighten_Mode) { - paint->setColorFilter( - SkColorFilter::CreateModeFilter(color, SkXfermode::kSrcOver_Mode)); - } else if (!isMode && !cf->asColorMatrix(srcColorMatrix)) { - paint->setColorFilter(NULL); - } - } - - SkPathEffect* pe = paint->getPathEffect(); - if (pe && !pe->exposedInAndroidJavaAPI()) { - paint->setPathEffect(NULL); - } - - // TODO: Android doesn't support all the flags that can be passed to - // blur filters; we need plumbing to get them out. - - paint->setImageFilter(NULL); - paint->setLooper(NULL); -}; - -/** SkDrawFilter is likely to be deprecated; this is a proxy - canvas that does the same thing: alter SkPaint fields. - - onDraw*() functions may have their SkPaint modified, and are then - passed on to the same function on proxyTarget. - - This still suffers one of the same architectural flaws as SkDrawFilter: - TextBlob paints are incomplete when filter is called. -*/ - -#define FILTER(p) \ - SkPaint filteredPaint(p); \ - Filter(&filteredPaint); - -#define FILTER_PTR(p) \ - SkTLazy<SkPaint> lazyPaint; \ - SkPaint* filteredPaint = (SkPaint*) p; \ - if (p) { \ - filteredPaint = lazyPaint.set(*p); \ - Filter(filteredPaint); \ - } - - -class FilteringCanvas : public SkCanvas { -public: - FilteringCanvas(SkCanvas* proxyTarget) : fProxyTarget(proxyTarget) { } - -protected: - void onDrawPaint(const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPaint(filteredPaint); - } - void onDrawPoints(PointMode pMode, size_t count, const SkPoint pts[], - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPoints(pMode, count, pts, filteredPaint); - } - void onDrawOval(const SkRect& r, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawOval(r, filteredPaint); - } - void onDrawRect(const SkRect& r, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawRect(r, filteredPaint); - } - void onDrawRRect(const SkRRect& r, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawRRect(r, filteredPaint); - } - void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPath(path, filteredPaint); - } - void onDrawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, - const SkPaint* paint) SK_OVERRIDE { - FILTER_PTR(paint); - fProxyTarget->drawBitmap(bitmap, left, top, filteredPaint); - } - void onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst, - const SkPaint* paint, DrawBitmapRectFlags flags) SK_OVERRIDE { - FILTER_PTR(paint); - fProxyTarget->drawBitmapRectToRect(bitmap, src, dst, filteredPaint, flags); - } - void onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, - const SkRect& dst, const SkPaint* paint) SK_OVERRIDE { - FILTER_PTR(paint); - fProxyTarget->drawBitmapNine(bitmap, center, dst, filteredPaint); - } - void onDrawSprite(const SkBitmap& bitmap, int left, int top, - const SkPaint* paint) SK_OVERRIDE { - FILTER_PTR(paint); - fProxyTarget->drawSprite(bitmap, left, top, filteredPaint); - } - void onDrawVertices(VertexMode vMode, int vertexCount, const SkPoint vertices[], - const SkPoint texs[], const SkColor colors[], SkXfermode* xMode, - const uint16_t indices[], int indexCount, - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawVertices(vMode, vertexCount, vertices, texs, colors, - xMode, indices, indexCount, filteredPaint); - } - - void onDrawDRRect(const SkRRect& outer, const SkRRect& inner, - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawDRRect(outer, inner, filteredPaint); - } - - void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawText(text, byteLength, x, y, filteredPaint); - } - void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPosText(text, byteLength, pos, filteredPaint); - } - void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], - SkScalar constY, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPosTextH(text, byteLength, xpos, constY, filteredPaint); - } - void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, - const SkMatrix* matrix, const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawTextOnPath(text, byteLength, path, matrix, filteredPaint); - } - void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawTextBlob(blob, x, y, filteredPaint); - } - - void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], - const SkPoint texCoords[4], SkXfermode* xmode, - const SkPaint& paint) SK_OVERRIDE { - FILTER(paint); - fProxyTarget->drawPatch(cubics, colors, texCoords, xmode, filteredPaint); - } - -protected: - SkCanvas* fProxyTarget; -}; - /** * Helper class for setting up android::uirenderer::renderthread::RenderProxy. */ @@ -385,7 +188,8 @@ Error ViaAndroidSDK::draw(const Src& src, (new android::uirenderer::SkiaCanvasProxy(ac)); // Pass through another proxy to get paint transforms - FilteringCanvas fc(scProxy); + SkAndroidSDKCanvas fc; + fc.reset(scProxy); fSrc.draw(&fc); diff --git a/gyp/dm.gyp b/gyp/dm.gyp index dc75729dc6..288fb3a7f9 100644 --- a/gyp/dm.gyp +++ b/gyp/dm.gyp @@ -24,6 +24,9 @@ 'sources': [ '../dm/DMSrcSinkAndroid.cpp', ], + 'dependencies': [ + 'utils.gyp:android_utils', + ], }], ], }] |