/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "DMSrcSink.h" #include "DMSrcSinkAndroid.h" #include "SkAndroidSDKCanvas.h" #include "SkCanvas.h" #include "SkiaCanvasProxy.h" #include "SkStream.h" #include /* These functions are only compiled in the Android Framework. */ namespace DM { Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { android::uirenderer::TestWindowContext renderer; renderer.initialize(src.size().width(), src.size().height()); SkCanvas* canvas = renderer.prepareToDraw(); Error err = src.draw(canvas); if (!err.isEmpty()) { return err; } renderer.finishDrawing(); renderer.fence(); renderer.capturePixels(dst); return ""; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink) { } Error ViaAndroidSDK::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { struct ProxySrc : public Src { const Src& fSrc; ProxySrc(const Src& src) : fSrc(src) {} Error draw(SkCanvas* canvas) const override { // Pass through HWUI's upper layers to get operational transforms std::unique_ptr ac(android::Canvas::create_canvas(canvas)); SkAutoTUnref scProxy (new android::uirenderer::SkiaCanvasProxy(ac.get())); // Pass through another proxy to get paint transforms SkAndroidSDKCanvas fc; fc.reset(scProxy); fSrc.draw(&fc); return ""; } SkISize size() const override { return fSrc.size(); } Name name() const override { sk_throw(); return ""; } } proxy(src); return fSink->draw(proxy, bitmap, stream, log); } } // namespace DM