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