Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: dm/DMSrcSinkAndroid.cpp

Issue 974913002: ViaAndroidSDK for DM (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: dm/DMSrcSinkAndroid.cpp
diff --git a/dm/DMSrcSinkAndroid.cpp b/dm/DMSrcSinkAndroid.cpp
index 1ad9329669e9a40a2522f2030cc3b06105d74786..9394bc66db3d581e2b86305353bb20e7ae1164ce 100644
--- a/dm/DMSrcSinkAndroid.cpp
+++ b/dm/DMSrcSinkAndroid.cpp
@@ -12,6 +12,11 @@
#include "DisplayListRenderer.h"
#include "IContextFactory.h"
#include "RenderNode.h"
+#include "SkDrawFilter.h"
+#include "SkiaCanvasProxy.h"
+#include "SkMaskFilter.h"
+#include "SkPictureRecorder.h"
+#include "SkStream.h"
#include "android/rect.h"
#include "android/native_window.h"
#include "gui/BufferQueue.h"
@@ -22,10 +27,77 @@
#include "renderthread/RenderProxy.h"
#include "renderthread/TimeLord.h"
-namespace DM {
+/* These functions should only be compiled in the Android Framework. */
+
+namespace {
+
+/**
+ * An SkDrawFilter implementation which removes all flags and features
+ * not exposed by the Android SDK.
+ */
+class ViaAndroidSDKFilter : public SkDrawFilter {
+
+ inline void checkShader(SkPaint* paint, SkShader* shader) {
mtklein 2015/03/03 15:55:14 I think this can be static void CheckShader(SkPain
mtklein 2015/03/03 15:55:14 Just FYI, this inline is redundant here.
tomhudson 2015/03/05 14:53:52 Done.
tomhudson 2015/03/05 14:53:52 Yeah, I was offended by calling SkPaint::getShader
+ 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);
+ }
+
+ virtual bool filter(SkPaint* paint, Type drawType) SK_OVERRIDE {
mtklein 2015/03/03 15:55:14 We've been using just SK_OVERRIDE for overrides la
tomhudson 2015/03/05 14:53:51 Done.
+
+ uint32_t flags = paint->getFlags();
+ flags &= ~SkPaint::kLCDRenderText_Flag;
+ paint->setFlags(flags);
+
+ // Force bilinear scaling or none
+ if (paint->getFilterQuality() != kNone_SkFilterQuality) {
+ paint->setFilterQuality(kLow_SkFilterQuality);
+ }
-/* These functions are only compiled in the Android Framework. */
+ SkShader * shader = paint->getShader();
mtklein 2015/03/03 15:55:14 Can't decide where to put your *s?
tomhudson 2015/03/05 14:53:52 Done.
+ if (shader) {
mtklein 2015/03/03 15:55:14 Might want to write these checks like this, to sco
tomhudson 2015/03/05 14:53:52 Acknowledged.
+ checkShader(paint, shader);
mtklein 2015/03/03 15:55:14 this->
tomhudson 2015/03/05 14:53:52 Acknowledged.
+ }
+ // GlopBuilder only supports mode & matrix color filters
+ SkColorFilter * cf = paint->getColorFilter();
+ if (cf) {
+ SkColor color;
+ SkXfermode::Mode mode;
+ SkScalar srcColorMatrix[20];
+ if (!cf->asColorMode(&color, &mode) && !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);
+
+ return true;
+ };
+};
+
+/**
+ * Helper class for setting up android::uirenderer::renderthread::RenderProxy.
+ */
class ContextFactory : public android::uirenderer::IContextFactory {
public:
android::uirenderer::AnimationContext* createAnimationContext
@@ -34,6 +106,10 @@ public:
}
};
+} // namespace
+
+namespace DM {
+
Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const {
// Do all setup in this function because we don't know the size
// for the RenderNode and RenderProxy during the constructor.
@@ -155,4 +231,49 @@ Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const
return "";
}
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+ViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink), fFilter (new ViaAndroidSDKFilter()) { }
+
+Error ViaAndroidSDK::draw(const Src& src,
+ SkBitmap* bitmap,
+ SkWStream* stream,
+ SkString* log) const {
+ SkISize size = src.size();
+ SkPictureRecorder recorder;
+ Error err = src.draw(recorder.beginRecording(size.width(), size.height()));
+ if (!err.isEmpty()) {
+ return err;
+ }
+ SkAutoTUnref<SkPicture> pic(recorder.endRecording());
+
+ struct ProxySrc : public Src {
+ const Src& fSrc;
+ const SkPicture* fPic;
+ const SkDrawFilter* fFilter;
+
+ ProxySrc(const Src& src, const SkPicture* pic, SkDrawFilter* filter)
+ : fSrc(src), fPic(pic), fFilter(filter) {}
+
+ Error draw(SkCanvas* canvas) const SK_OVERRIDE {
+ // Route through HWUI's upper layers to change draw operations
+ android::Canvas* ac = android::Canvas::create_canvas(canvas);
mtklein 2015/03/03 15:55:14 SkAutoTDelete?
tomhudson 2015/03/05 14:53:52 Done.
+ SkAutoTUnref<android::uirenderer::SkiaCanvasProxy> scProxy
+ (new android::uirenderer::SkiaCanvasProxy(ac));
+
+ // Route through a draw filter to change paint fields
+ scProxy->setDrawFilter((ViaAndroidSDKFilter*) fFilter);
+
+ scProxy->drawPicture(fPic);
mtklein 2015/03/03 15:55:14 Let's try fSrc.draw(scProxy) and drop the picture.
tomhudson 2015/03/05 14:53:51 Done.
+
+ delete ac;
+ return "";
+ }
+ SkISize size() const SK_OVERRIDE { return fSrc.size(); }
+ Name name() const SK_OVERRIDE { sk_throw(); return ""; }
+ } proxy(src, pic, fFilter.get());
+
+ return fSink->draw(proxy, bitmap, stream, log);
+}
+
} // namespace DM
« dm/DMSrcSinkAndroid.h ('K') | « dm/DMSrcSinkAndroid.h ('k') | include/core/SkPathEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698