1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "DMSrcSink.h" 9 #include "DMSrcSinkAndroid.h" 10 11 #include "SkAndroidSDKCanvas.h" 12 #include "SkCanvas.h" 13 #include "SkiaCanvasProxy.h" 14 #include "SkStream.h" 15 #include <utils/TestWindowContext.h> 16 17 /* These functions are only compiled in the Android Framework. */ 18 19 namespace DM { 20 21 Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { 22 android::uirenderer::TestWindowContext renderer; 23 renderer.initialize(src.size().width(), src.size().height()); 24 SkCanvas* canvas = renderer.prepareToDraw(); 25 Error err = src.draw(canvas); 26 if (!err.isEmpty()) { 27 return err; 28 } 29 renderer.finishDrawing(); 30 renderer.fence(); 31 renderer.capturePixels(dst); 32 return ""; 33 } 34 35 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 36 37 ViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink) { } 38 39 Error ViaAndroidSDK::draw(const Src& src, 40 SkBitmap* bitmap, 41 SkWStream* stream, 42 SkString* log) const { 43 struct ProxySrc : public Src { 44 const Src& fSrc; 45 ProxySrc(const Src& src) 46 : fSrc(src) {} 47 48 Error draw(SkCanvas* canvas) const override { 49 // Pass through HWUI's upper layers to get operational transforms 50 SkAutoTDelete<android::Canvas> ac (android::Canvas::create_canvas(canvas)); 51 SkAutoTUnref<android::uirenderer::SkiaCanvasProxy> scProxy 52 (new android::uirenderer::SkiaCanvasProxy(ac)); 53 54 // Pass through another proxy to get paint transforms 55 SkAndroidSDKCanvas fc; 56 fc.reset(scProxy); 57 58 fSrc.draw(&fc); 59 60 return ""; 61 } 62 SkISize size() const override { return fSrc.size(); } 63 Name name() const override { sk_throw(); return ""; } 64 } proxy(src); 65 66 return fSink->draw(proxy, bitmap, stream, log); 67 } 68 69 } // namespace DM 70