1b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson/*
2b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * Copyright (C) 2015 The Android Open Source Project
3b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson *
4b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * Licensed under the Apache License, Version 2.0 (the "License");
5b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * you may not use this file except in compliance with the License.
6b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * You may obtain a copy of the License at
7b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson *
8b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson *      http://www.apache.org/licenses/LICENSE-2.0
9b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson *
10b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * Unless required by applicable law or agreed to in writing, software
11b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * distributed under the License is distributed on an "AS IS" BASIS,
12b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * See the License for the specific language governing permissions and
14b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * limitations under the License.
15b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson */
16b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "TestWindowContext.h"
17b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
18b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "AnimationContext.h"
19b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "DisplayListCanvas.h"
20b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "IContextFactory.h"
213d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#include "RecordingCanvas.h"
22b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "RenderNode.h"
23b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "SkTypes.h"
24b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "gui/BufferQueue.h"
25b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "gui/CpuConsumer.h"
26b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "gui/IGraphicBufferConsumer.h"
27b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "gui/IGraphicBufferProducer.h"
28b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "gui/Surface.h"
29b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson#include "renderthread/RenderProxy.h"
30b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
31b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
32b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonnamespace {
33b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
34b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson/**
35b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson * Helper class for setting up android::uirenderer::renderthread::RenderProxy.
36b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson */
37b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonclass ContextFactory : public android::uirenderer::IContextFactory {
38b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonpublic:
39b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    android::uirenderer::AnimationContext* createAnimationContext
40b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        (android::uirenderer::renderthread::TimeLord& clock) override {
41b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        return new android::uirenderer::AnimationContext(clock);
42b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
43b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson};
44b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
45b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson} // anonymous namespace
46b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
47b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonnamespace android {
48b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonnamespace uirenderer {
49b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
50b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson/**
51b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson  Android strong pointers (android::sp) can't hold forward-declared classes,
52b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson  so we have to use pointer-to-implementation here if we want to hide the
53b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson  details from our non-framework users.
54b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson*/
55b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
56b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonclass TestWindowContext::TestWindowData {
57b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
58b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonpublic:
59b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
60b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    TestWindowData(SkISize size) : mSize(size) {
61b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        android::BufferQueue::createBufferQueue(&mProducer, &mConsumer);
62b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mCpuConsumer = new android::CpuConsumer(mConsumer, 1);
63b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mCpuConsumer->setName(android::String8("TestWindowContext"));
64b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mCpuConsumer->setDefaultBufferSize(mSize.width(), mSize.height());
65b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mAndroidSurface = new android::Surface(mProducer);
66b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        native_window_set_buffers_dimensions(mAndroidSurface.get(),
67b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                             mSize.width(), mSize.height());
68b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        native_window_set_buffers_format(mAndroidSurface.get(),
69b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                         android::PIXEL_FORMAT_RGBA_8888);
70b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        native_window_set_usage(mAndroidSurface.get(),
71b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                GRALLOC_USAGE_SW_READ_OFTEN |
72b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                GRALLOC_USAGE_SW_WRITE_NEVER |
73b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                GRALLOC_USAGE_HW_RENDER);
74b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mRootNode.reset(new android::uirenderer::RenderNode());
75b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mRootNode->incStrong(nullptr);
76b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mRootNode->mutateStagingProperties().setLeftTopRightBottom
77b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            (0, 0, mSize.width(), mSize.height());
78b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mRootNode->mutateStagingProperties().setClipToBounds(false);
79b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mRootNode->setPropertyFieldsDirty(android::uirenderer::RenderNode::GENERIC);
80b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        ContextFactory factory;
81b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy.reset
82b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            (new android::uirenderer::renderthread::RenderProxy(false,
83b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                                                mRootNode.get(),
84b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                                                                &factory));
85b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy->loadSystemProperties();
86b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy->initialize(mAndroidSurface.get());
87b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        float lightX = mSize.width() / 2.0f;
88b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        android::uirenderer::Vector3 lightVector { lightX, -200.0f, 800.0f };
89b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy->setup(mSize.width(), mSize.height(), 800.0f,
90b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                             255 * 0.075f, 255 * 0.15f);
91b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy->setLightCenter(lightVector);
923d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#if HWUI_NEW_OPS
933d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger        mCanvas.reset(new android::uirenderer::RecordingCanvas(mSize.width(), mSize.height()));
943d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#else
953d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger        mCanvas.reset(new android::uirenderer::DisplayListCanvas(mSize.width(), mSize.height()));
963d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#endif
97b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
98b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
99b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    SkCanvas* prepareToDraw() {
100b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        //mCanvas->reset(mSize.width(), mSize.height());
101b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mCanvas->clipRect(0, 0, mSize.width(), mSize.height(),
102b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                               SkRegion::Op::kReplace_Op);
103b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        return mCanvas->asSkCanvas();
104b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
105b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
106b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    void finishDrawing() {
10751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck        mRootNode->setStagingDisplayList(mCanvas->finishRecording(), nullptr);
10851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck        mProxy->syncAndDrawFrame(nullptr);
109b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        // Surprisingly, calling mProxy->fence() here appears to make no difference to
110b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        // the timings we record.
111b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
112b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
113b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    void fence() {
114b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mProxy->fence();
115b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
116b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
117b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    bool capturePixels(SkBitmap* bmp) {
118b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        SkImageInfo destinationConfig =
119b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkImageInfo::Make(mSize.width(), mSize.height(),
120b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                              kRGBA_8888_SkColorType, kPremul_SkAlphaType);
121b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        bmp->allocPixels(destinationConfig);
122b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        sk_memset32((uint32_t*) bmp->getPixels(), SK_ColorRED,
123b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                    mSize.width() * mSize.height());
124b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
125b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        android::CpuConsumer::LockedBuffer nativeBuffer;
126b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        android::status_t retval = mCpuConsumer->lockNextBuffer(&nativeBuffer);
127b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        if (retval == android::BAD_VALUE) {
128b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkDebugf("write_canvas_png() got no buffer; returning transparent");
129b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            // No buffer ready to read - commonly triggered by dm sending us
130b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            // a no-op source, or calling code that doesn't do anything on this
131b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            // backend.
132b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            bmp->eraseColor(SK_ColorTRANSPARENT);
133b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            return false;
134b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        } else if (retval) {
135b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkDebugf("Failed to lock buffer to read pixels: %d.", retval);
136b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            return false;
137b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        }
138b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
139b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        // Move the pixels into the destination SkBitmap
140b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
141a3f16d43770e6740dd27210875964d91985efbd2Derek Sollenberger        LOG_ALWAYS_FATAL_IF(nativeBuffer.format != android::PIXEL_FORMAT_RGBA_8888,
142a3f16d43770e6740dd27210875964d91985efbd2Derek Sollenberger                            "Native buffer not RGBA!");
143b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        SkImageInfo nativeConfig =
144b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkImageInfo::Make(nativeBuffer.width, nativeBuffer.height,
145b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson                              kRGBA_8888_SkColorType, kPremul_SkAlphaType);
146b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
147b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        // Android stride is in pixels, Skia stride is in bytes
148b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        SkBitmap nativeWrapper;
149b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        bool success =
150b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            nativeWrapper.installPixels(nativeConfig, nativeBuffer.data, nativeBuffer.stride * 4);
151b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        if (!success) {
152b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkDebugf("Failed to wrap HWUI buffer in a SkBitmap");
153b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            return false;
154b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        }
155b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
156a3f16d43770e6740dd27210875964d91985efbd2Derek Sollenberger        LOG_ALWAYS_FATAL_IF(bmp->colorType() != kRGBA_8888_SkColorType,
157a3f16d43770e6740dd27210875964d91985efbd2Derek Sollenberger                            "Destination buffer not RGBA!");
158b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        success =
159b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            nativeWrapper.readPixels(destinationConfig, bmp->getPixels(), bmp->rowBytes(), 0, 0);
160b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        if (!success) {
161b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            SkDebugf("Failed to extract pixels from HWUI buffer");
162b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson            return false;
163b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        }
164b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
165b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mCpuConsumer->unlockBuffer(nativeBuffer);
166b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
167b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        return true;
168b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
169b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
170b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonprivate:
171b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
172b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    std::unique_ptr<android::uirenderer::RenderNode> mRootNode;
173b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    std::unique_ptr<android::uirenderer::renderthread::RenderProxy> mProxy;
1743d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#if HWUI_NEW_OPS
1753d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger    std::unique_ptr<android::uirenderer::RecordingCanvas> mCanvas;
1763d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#else
177b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    std::unique_ptr<android::uirenderer::DisplayListCanvas> mCanvas;
1783d5278b63862b337b8c7ef82ed18f1825e4b5c6bDerek Sollenberger#endif
179b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    android::sp<android::IGraphicBufferProducer> mProducer;
180b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    android::sp<android::IGraphicBufferConsumer> mConsumer;
181b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    android::sp<android::CpuConsumer> mCpuConsumer;
182b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    android::sp<android::Surface> mAndroidSurface;
183b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    SkISize mSize;
184b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson};
185b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
186b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
187b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom HudsonTestWindowContext::TestWindowContext() :
188b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    mData (nullptr) { }
189b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
19058862c9f6f33a9aa3602ca4a7ce49ac2a1fdc7c6Tom HudsonTestWindowContext::~TestWindowContext() {
19158862c9f6f33a9aa3602ca4a7ce49ac2a1fdc7c6Tom Hudson    delete mData;
19258862c9f6f33a9aa3602ca4a7ce49ac2a1fdc7c6Tom Hudson}
19358862c9f6f33a9aa3602ca4a7ce49ac2a1fdc7c6Tom Hudson
194b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonvoid TestWindowContext::initialize(int width, int height)  {
195b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    mData = new TestWindowData(SkISize::Make(width, height));
196b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson}
197b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
198b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom HudsonSkCanvas* TestWindowContext::prepareToDraw() {
199b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    return mData ? mData->prepareToDraw() : nullptr;
200b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson}
201b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
202b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonvoid TestWindowContext::finishDrawing() {
203b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    if (mData) {
204b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mData->finishDrawing();
205b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
206b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson}
207b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
208b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonvoid TestWindowContext::fence() {
209b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    if (mData) {
210b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson        mData->fence();
211b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    }
212b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson}
213b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
214b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudsonbool TestWindowContext::capturePixels(SkBitmap* bmp) {
215b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson    return mData ? mData->capturePixels(bmp) : false;
216b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson}
217b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
218b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson} // namespace uirenderer
219b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson} // namespace android
220b2f5bd2d6043132d8c1d0f3e2e7e454c2693f499Tom Hudson
221