1eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson/* 2eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson * Copyright 2015 Google Inc. 3eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson * 4eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson * Use of this source code is governed by a BSD-style license that can be 5eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson * found in the LICENSE file. 6eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson */ 7eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson 8eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson#include "DMSrcSink.h" 9eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson#include "DMSrcSinkAndroid.h" 10eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson 1148dc6dc52ecfcc1e0cfd75f637d55c03e4d6bcb2tomhudson#include "SkAndroidSDKCanvas.h" 1297cd070442aaf5511c638a4586e0a7a75297e468tomhudson#include "SkCanvas.h" 1364de1e179012302d5f3b805d0736a583ad91c6a2tomhudson#include "SkiaCanvasProxy.h" 1464de1e179012302d5f3b805d0736a583ad91c6a2tomhudson#include "SkStream.h" 152880df2609eba09b555ca37be04b6ad89290c765Tom Hudson#include <utils/TestWindowContext.h> 16eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson 17eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson/* These functions are only compiled in the Android Framework. */ 18eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson 1964de1e179012302d5f3b805d0736a583ad91c6a2tomhudsonnamespace DM { 2064de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 21eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudsonError HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { 222880df2609eba09b555ca37be04b6ad89290c765Tom Hudson android::uirenderer::TestWindowContext renderer; 232880df2609eba09b555ca37be04b6ad89290c765Tom Hudson renderer.initialize(src.size().width(), src.size().height()); 24573ae01295241c156ff8548ded283d44864d22d2tomhudson SkCanvas* canvas = renderer.prepareToDraw(); 25573ae01295241c156ff8548ded283d44864d22d2tomhudson Error err = src.draw(canvas); 26eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson if (!err.isEmpty()) { 27eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson return err; 28eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson } 29573ae01295241c156ff8548ded283d44864d22d2tomhudson renderer.finishDrawing(); 302880df2609eba09b555ca37be04b6ad89290c765Tom Hudson renderer.fence(); 31573ae01295241c156ff8548ded283d44864d22d2tomhudson renderer.capturePixels(dst); 32eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson return ""; 33eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson} 34eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson 3564de1e179012302d5f3b805d0736a583ad91c6a2tomhudson/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 3664de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 3764de1e179012302d5f3b805d0736a583ad91c6a2tomhudsonViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink) { } 3864de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 3964de1e179012302d5f3b805d0736a583ad91c6a2tomhudsonError ViaAndroidSDK::draw(const Src& src, 4064de1e179012302d5f3b805d0736a583ad91c6a2tomhudson SkBitmap* bitmap, 4164de1e179012302d5f3b805d0736a583ad91c6a2tomhudson SkWStream* stream, 4264de1e179012302d5f3b805d0736a583ad91c6a2tomhudson SkString* log) const { 4364de1e179012302d5f3b805d0736a583ad91c6a2tomhudson struct ProxySrc : public Src { 4464de1e179012302d5f3b805d0736a583ad91c6a2tomhudson const Src& fSrc; 4564de1e179012302d5f3b805d0736a583ad91c6a2tomhudson ProxySrc(const Src& src) 4664de1e179012302d5f3b805d0736a583ad91c6a2tomhudson : fSrc(src) {} 4764de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein Error draw(SkCanvas* canvas) const override { 4997cd070442aaf5511c638a4586e0a7a75297e468tomhudson // Pass through HWUI's upper layers to get operational transforms 5064de1e179012302d5f3b805d0736a583ad91c6a2tomhudson SkAutoTDelete<android::Canvas> ac (android::Canvas::create_canvas(canvas)); 5164de1e179012302d5f3b805d0736a583ad91c6a2tomhudson SkAutoTUnref<android::uirenderer::SkiaCanvasProxy> scProxy 5264de1e179012302d5f3b805d0736a583ad91c6a2tomhudson (new android::uirenderer::SkiaCanvasProxy(ac)); 5364de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 5497cd070442aaf5511c638a4586e0a7a75297e468tomhudson // Pass through another proxy to get paint transforms 5548dc6dc52ecfcc1e0cfd75f637d55c03e4d6bcb2tomhudson SkAndroidSDKCanvas fc; 5648dc6dc52ecfcc1e0cfd75f637d55c03e4d6bcb2tomhudson fc.reset(scProxy); 5764de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 5897cd070442aaf5511c638a4586e0a7a75297e468tomhudson fSrc.draw(&fc); 5964de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 6064de1e179012302d5f3b805d0736a583ad91c6a2tomhudson return ""; 6164de1e179012302d5f3b805d0736a583ad91c6a2tomhudson } 6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize size() const override { return fSrc.size(); } 6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein Name name() const override { sk_throw(); return ""; } 6464de1e179012302d5f3b805d0736a583ad91c6a2tomhudson } proxy(src); 6564de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 6664de1e179012302d5f3b805d0736a583ad91c6a2tomhudson return fSink->draw(proxy, bitmap, stream, log); 6764de1e179012302d5f3b805d0736a583ad91c6a2tomhudson} 6864de1e179012302d5f3b805d0736a583ad91c6a2tomhudson 69eebc39ad5a1dcbde1b10a9b2ab54679549522b52tomhudson} // namespace DM 70