17db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck/*
27db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Copyright (C) 2016 The Android Open Source Project
37db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck *
47db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Licensed under the Apache License, Version 2.0 (the "License");
57db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * you may not use this file except in compliance with the License.
67db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * You may obtain a copy of the License at
77db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck *
87db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck *      http://www.apache.org/licenses/LICENSE-2.0
97db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck *
107db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * Unless required by applicable law or agreed to in writing, software
117db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * distributed under the License is distributed on an "AS IS" BASIS,
127db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * See the License for the specific language governing permissions and
147db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck * limitations under the License.
157db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck */
167db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
177db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "BakedOpRenderer.h"
187db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "BakedOpDispatcher.h"
197db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "FrameBuilder.h"
207db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "LayerUpdateQueue.h"
217db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "RecordingCanvas.h"
227db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include "tests/common/TestUtils.h"
237db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
247db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck#include <gtest/gtest.h>
257db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
267db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reckusing namespace android;
277db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reckusing namespace android::uirenderer;
287db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
296e068c0182f6f85bccb855a647510724d1c65a13Chris Craikconst FrameBuilder::LightGeometry sLightGeometery = { {100, 100, 100}, 50};
306e068c0182f6f85bccb855a647510724d1c65a13Chris Craikconst BakedOpRenderer::LightInfo sLightInfo = { 128, 128 };
317db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
3274af6e282f8a8f75928a071e8200039517cf5c12Chris CraikRENDERTHREAD_TEST(LeakCheck, saveLayer_overdrawRejection) {
3374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    auto node = TestUtils::createNode(0, 0, 100, 100,
3474af6e282f8a8f75928a071e8200039517cf5c12Chris Craik            [](RenderProperties& props, RecordingCanvas& canvas) {
3574af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer);
3674af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        canvas.drawRect(0, 0, 100, 100, SkPaint());
3774af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        canvas.restore();
3874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik
3974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        // opaque draw, rejects saveLayer beneath
4074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik        canvas.drawRect(0, 0, 100, 100, SkPaint());
4174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    });
4274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    RenderState& renderState = renderThread.renderState();
4374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    Caches& caches = Caches::getInstance();
4474af6e282f8a8f75928a071e8200039517cf5c12Chris Craik
459cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100,
469cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik            sLightGeometery, Caches::getInstance());
479cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
4874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    BakedOpRenderer renderer(caches, renderState, true, sLightInfo);
4974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
5074af6e282f8a8f75928a071e8200039517cf5c12Chris Craik}
5174af6e282f8a8f75928a071e8200039517cf5c12Chris Craik
527db5ffb7dbd30202468459e2ef4426e91d4fcbb3John ReckRENDERTHREAD_TEST(LeakCheck, saveLayerUnclipped_simple) {
537db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck    auto node = TestUtils::createNode(0, 0, 200, 200,
547db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck            [](RenderProperties& props, RecordingCanvas& canvas) {
55eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita        canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
567db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck        canvas.drawRect(0, 0, 200, 200, SkPaint());
577db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck        canvas.restore();
587db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck    });
597db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck    RenderState& renderState = renderThread.renderState();
607db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck    Caches& caches = Caches::getInstance();
617db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck
629cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
639cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik            sLightGeometery, Caches::getInstance());
649cd1bbe5c9e14472e631d8cc10005613925f34afChris Craik    frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
656e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    BakedOpRenderer renderer(caches, renderState, true, sLightInfo);
667db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck    frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
677db5ffb7dbd30202468459e2ef4426e91d4fcbb3John Reck}
68