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