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