Index: dm/DMSrcSinkAndroid.cpp |
diff --git a/dm/DMSrcSinkAndroid.cpp b/dm/DMSrcSinkAndroid.cpp |
index 36817e18e19efede1199ff1a52a17ad605a4bdf5..fc83ea4174aaf63babf3e629977a8dcb82e6b010 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); |