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 "SkHwuiRenderer.h" 14#include "SkiaCanvasProxy.h" 15#include "SkStream.h" 16 17/* These functions are only compiled in the Android Framework. */ 18 19namespace DM { 20 21Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { 22 SkHwuiRenderer renderer; 23 renderer.initialize(src.size()); 24 SkCanvas* canvas = renderer.prepareToDraw(); 25 Error err = src.draw(canvas); 26 if (!err.isEmpty()) { 27 return err; 28 } 29 renderer.finishDrawing(); 30 renderer.proxy->fence(); 31 renderer.capturePixels(dst); 32 return ""; 33} 34 35/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 36 37ViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink) { } 38 39Error 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