TestUtils.h revision d2dfd8f128b632ed99418ab2b32949c939a9a369
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef TEST_UTILS_H 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define TEST_UTILS_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1976caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik#include <DeviceInfo.h> 20161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#include <DisplayList.h> 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <Matrix.h> 220a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik#include <Rect.h> 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <RenderNode.h> 240a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik#include <renderstate/RenderState.h> 250a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik#include <renderthread/RenderThread.h> 260a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik#include <Snapshot.h> 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 28161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#if HWUI_NEW_OPS 29161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#include <RecordedOp.h> 3016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#include <RecordingCanvas.h> 31161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#else 32161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#include <DisplayListOp.h> 3316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#include <DisplayListCanvas.h> 34161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik#endif 35161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik 36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <memory> 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 4116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#if HWUI_NEW_OPS 4216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Recktypedef RecordingCanvas TestCanvas; 4316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#else 4416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Recktypedef DisplayListCanvas TestCanvas; 4516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#endif 4616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck 47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define EXPECT_MATRIX_APPROX_EQ(a, b) \ 48b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik EXPECT_TRUE(TestUtils::matricesAreApproxEqual(a, b)) 49b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 506fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik#define EXPECT_RECT_APPROX_EQ(a, b) \ 516fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EXPECT_TRUE(MathUtils::areEqual(a.left, b.left) \ 526fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik && MathUtils::areEqual(a.top, b.top) \ 536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik && MathUtils::areEqual(a.right, b.right) \ 546fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik && MathUtils::areEqual(a.bottom, b.bottom)); 556fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 5698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik/** 5798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * Like gtest's TEST, but runs on the RenderThread, and 'renderThread' is passed, in top level scope 5898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * (for e.g. accessing its RenderState) 5998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik */ 6098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#define RENDERTHREAD_TEST(test_case_name, test_name) \ 6198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik class test_case_name##_##test_name##_RenderThreadTest { \ 6298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik public: \ 6398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik static void doTheThing(renderthread::RenderThread& renderThread); \ 6498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik }; \ 6598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik TEST(test_case_name, test_name) { \ 6698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik TestUtils::runOnRenderThread(test_case_name##_##test_name##_RenderThreadTest::doTheThing); \ 6798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik }; \ 6898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik void test_case_name##_##test_name##_RenderThreadTest::doTheThing(renderthread::RenderThread& renderThread) 6998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik 70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass TestUtils { 71b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikpublic: 7276ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik class SignalingDtor { 7376ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik public: 7476ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik SignalingDtor() 7576ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik : mSignal(nullptr) {} 7676ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik SignalingDtor(int* signal) 7776ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik : mSignal(signal) {} 7876ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik void setSignal(int* signal) { 7976ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik mSignal = signal; 8076ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik } 8176ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik ~SignalingDtor() { 8276ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik if (mSignal) { 8376ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik (*mSignal)++; 8476ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik } 8576ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik } 8676ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik private: 8776ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik int* mSignal; 8876ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik }; 8976ace115f7870fed9899a9db7d3852e21b5fb258Chris Craik 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static bool matricesAreApproxEqual(const Matrix4& a, const Matrix4& b) { 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik for (int i = 0; i < 16; i++) { 92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (!MathUtils::areEqual(a[i], b[i])) { 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return false; 94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return true; 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik static std::unique_ptr<Snapshot> makeSnapshot(const Matrix4& transform, const Rect& clip) { 100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik std::unique_ptr<Snapshot> snapshot(new Snapshot()); 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik snapshot->clip(clip.left, clip.top, clip.right, clip.bottom, SkRegion::kReplace_Op); 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *(snapshot->transform) = transform; 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return snapshot; 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 10615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik static SkBitmap createSkBitmap(int width, int height, 10715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik SkColorType colorType = kN32_SkColorType) { 108ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craik SkBitmap bitmap; 10916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck SkImageInfo info = SkImageInfo::Make(width, height, 11015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik colorType, kPremul_SkAlphaType); 1110a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik bitmap.setInfo(info); 1120a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik bitmap.allocPixels(info); 113ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craik return bitmap; 114ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craik } 115ddf2215d9807b641dbcb304779ef6b530f876ac7Chris Craik 116d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik static sp<DeferredLayerUpdater> createTextureLayerUpdater( 117d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik renderthread::RenderThread& renderThread, uint32_t width, uint32_t height, 118d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik std::function<void(Matrix4*)> transformSetupCallback); 119d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 120b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik template<class CanvasType> 121003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik static std::unique_ptr<DisplayList> createDisplayList(int width, int height, 122b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik std::function<void(CanvasType& canvas)> canvasCallback) { 123b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik CanvasType canvas(width, height); 124b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik canvasCallback(canvas); 125003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik return std::unique_ptr<DisplayList>(canvas.finishRecording()); 126b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 127b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 128d3daa3198e2212c985c634821682d5819346b653Chris Craik static sp<RenderNode> createNode(int left, int top, int right, int bottom, 1298d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik std::function<void(RenderProperties& props, TestCanvas& canvas)> setup) { 1309fded232a9548a304e0145011df8849fba0dcda7Chris Craik#if HWUI_NULL_GPU 13176caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik // if RenderNodes are being sync'd/used, device info will be needed, since 13276caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik // DeviceInfo::maxTextureSize() affects layer property 13376caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik DeviceInfo::initialize(); 1349fded232a9548a304e0145011df8849fba0dcda7Chris Craik#endif 13576caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik 136b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik sp<RenderNode> node = new RenderNode(); 13716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck RenderProperties& props = node->mutateStagingProperties(); 13816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck props.setLeftTopRightBottom(left, top, right, bottom); 13916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck if (setup) { 14016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck TestCanvas canvas(props.getWidth(), props.getHeight()); 14116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck setup(props, canvas); 14216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck node->setStagingDisplayList(canvas.finishRecording()); 1430b7e8245db728d127ada698be63d78b33fc6e4daChris Craik } 14416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck node->setPropertyFieldsDirty(0xFFFFFFFF); 1450b7e8245db728d127ada698be63d78b33fc6e4daChris Craik return node; 1460b7e8245db728d127ada698be63d78b33fc6e4daChris Craik } 1470b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 14816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck static void recordNode(RenderNode& node, 14916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck std::function<void(TestCanvas&)> contentCallback) { 15016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck TestCanvas canvas(node.stagingProperties().getWidth(), 15116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck node.stagingProperties().getHeight()); 15216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck contentCallback(canvas); 15316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck node.setStagingDisplayList(canvas.finishRecording()); 154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 155b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1568d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1578d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Forces a sync of a tree of RenderNode, such that every descendant will have its staging 1588d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * properties and DisplayList moved to the render copies. 1598d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1608d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: does not check dirtiness bits, so any non-staging DisplayLists will be discarded. 1618d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * For this reason, this should generally only be called once on a tree. 1628d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 163161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik static void syncHierarchyPropertiesAndDisplayList(sp<RenderNode>& node) { 164161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik syncHierarchyPropertiesAndDisplayListImpl(node.get()); 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik } 1660a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik 1670b7e8245db728d127ada698be63d78b33fc6e4daChris Craik typedef std::function<void(renderthread::RenderThread& thread)> RtCallback; 1680a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik 1690a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik class TestTask : public renderthread::RenderTask { 1700a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik public: 1710a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik TestTask(RtCallback rtCallback) 1720a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik : rtCallback(rtCallback) {} 1730a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik virtual ~TestTask() {} 1740a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik virtual void run() override { 1750a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik // RenderState only valid once RenderThread is running, so queried here 1760a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik RenderState& renderState = renderthread::RenderThread::getInstance().renderState(); 1770a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik 1780a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik renderState.onGLContextCreated(); 1790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik rtCallback(renderthread::RenderThread::getInstance()); 1800a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik renderState.onGLContextDestroyed(); 1810a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik }; 1820a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik RtCallback rtCallback; 1830a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik }; 1840a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik 1850a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik /** 1860a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik * NOTE: requires surfaceflinger to run, otherwise this method will wait indefinitely. 1870a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik */ 1880a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik static void runOnRenderThread(RtCallback rtCallback) { 1890a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik TestTask task(rtCallback); 1900a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik renderthread::RenderThread::getInstance().queueAndWait(&task); 1910a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik } 19216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck 19316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck static SkColor interpolateColor(float fraction, SkColor start, SkColor end); 19416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck 195a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik static void drawTextToCanvas(TestCanvas* canvas, const char* text, 19642a5407f2c6403ea7aa7a64eaf19948dc4050df5Chris Craik const SkPaint& paint, float x, float y); 197a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 198d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik static void drawTextToCanvas(TestCanvas* canvas, const char* text, 199d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPaint& paint, const SkPath& path); 200d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 201161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craikprivate: 202161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik static void syncHierarchyPropertiesAndDisplayListImpl(RenderNode* node) { 203161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik node->syncProperties(); 204161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik node->syncDisplayList(); 205161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik auto displayList = node->getDisplayList(); 206161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik if (displayList) { 207161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik for (auto&& childOp : displayList->getChildren()) { 208161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik syncHierarchyPropertiesAndDisplayListImpl(childOp->renderNode); 209161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik } 210161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik } 211161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik } 212161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik 213b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // class TestUtils 214b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} /* namespace uirenderer */ 216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} /* namespace android */ 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 218b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif /* TEST_UTILS_H */ 219