1ed024d218825042ae933e019810d267454a5eb8aJohn Reck/* 2ed024d218825042ae933e019810d267454a5eb8aJohn Reck * Copyright (C) 2017 The Android Open Source Project 3ed024d218825042ae933e019810d267454a5eb8aJohn Reck * 4ed024d218825042ae933e019810d267454a5eb8aJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5ed024d218825042ae933e019810d267454a5eb8aJohn Reck * you may not use this file except in compliance with the License. 6ed024d218825042ae933e019810d267454a5eb8aJohn Reck * You may obtain a copy of the License at 7ed024d218825042ae933e019810d267454a5eb8aJohn Reck * 8ed024d218825042ae933e019810d267454a5eb8aJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9ed024d218825042ae933e019810d267454a5eb8aJohn Reck * 10ed024d218825042ae933e019810d267454a5eb8aJohn Reck * Unless required by applicable law or agreed to in writing, software 11ed024d218825042ae933e019810d267454a5eb8aJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12ed024d218825042ae933e019810d267454a5eb8aJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed024d218825042ae933e019810d267454a5eb8aJohn Reck * See the License for the specific language governing permissions and 14ed024d218825042ae933e019810d267454a5eb8aJohn Reck * limitations under the License. 15ed024d218825042ae933e019810d267454a5eb8aJohn Reck */ 16ed024d218825042ae933e019810d267454a5eb8aJohn Reck 17ed024d218825042ae933e019810d267454a5eb8aJohn Reck#include "TestSceneBase.h" 18ed024d218825042ae933e019810d267454a5eb8aJohn Reck#include "renderthread/RenderProxy.h" 19ed024d218825042ae933e019810d267454a5eb8aJohn Reck#include "utils/Color.h" 20ed024d218825042ae933e019810d267454a5eb8aJohn Reck 21ed024d218825042ae933e019810d267454a5eb8aJohn Reckclass MagnifierAnimation; 22ed024d218825042ae933e019810d267454a5eb8aJohn Reck 23ed024d218825042ae933e019810d267454a5eb8aJohn Reckstatic TestScene::Registrar _Magnifier(TestScene::Info{ 24ed024d218825042ae933e019810d267454a5eb8aJohn Reck "magnifier", "A sample magnifier using Readback", 25ed024d218825042ae933e019810d267454a5eb8aJohn Reck TestScene::simpleCreateScene<MagnifierAnimation>}); 26ed024d218825042ae933e019810d267454a5eb8aJohn Reck 27ed024d218825042ae933e019810d267454a5eb8aJohn Reckclass MagnifierAnimation : public TestScene { 28ed024d218825042ae933e019810d267454a5eb8aJohn Reckpublic: 29ed024d218825042ae933e019810d267454a5eb8aJohn Reck sp<RenderNode> card; 30ed024d218825042ae933e019810d267454a5eb8aJohn Reck sp<RenderNode> zoomImageView; 31ed024d218825042ae933e019810d267454a5eb8aJohn Reck 32ed024d218825042ae933e019810d267454a5eb8aJohn Reck void createContent(int width, int height, Canvas& canvas) override { 33ed024d218825042ae933e019810d267454a5eb8aJohn Reck magnifier = TestUtils::createBitmap(200, 100); 34ed024d218825042ae933e019810d267454a5eb8aJohn Reck SkBitmap temp; 35ed024d218825042ae933e019810d267454a5eb8aJohn Reck magnifier->getSkBitmap(&temp); 36ed024d218825042ae933e019810d267454a5eb8aJohn Reck temp.eraseColor(Color::White); 37ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.drawColor(Color::White, SkBlendMode::kSrcOver); 38ed024d218825042ae933e019810d267454a5eb8aJohn Reck card = TestUtils::createNode( 39ed024d218825042ae933e019810d267454a5eb8aJohn Reck 0, 0, width, height, [&](RenderProperties& props, Canvas& canvas) { 40ed024d218825042ae933e019810d267454a5eb8aJohn Reck SkPaint paint; 41ed024d218825042ae933e019810d267454a5eb8aJohn Reck paint.setAntiAlias(true); 42ed024d218825042ae933e019810d267454a5eb8aJohn Reck paint.setTextSize(50); 43ed024d218825042ae933e019810d267454a5eb8aJohn Reck 44ed024d218825042ae933e019810d267454a5eb8aJohn Reck paint.setColor(Color::Black); 45ed024d218825042ae933e019810d267454a5eb8aJohn Reck TestUtils::drawUtf8ToCanvas(&canvas, "Test string", paint, 10, 400); 46ed024d218825042ae933e019810d267454a5eb8aJohn Reck }); 47ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.drawRenderNode(card.get()); 48ed024d218825042ae933e019810d267454a5eb8aJohn Reck zoomImageView = TestUtils::createNode( 49ed024d218825042ae933e019810d267454a5eb8aJohn Reck 100, 100, 500, 300, [&](RenderProperties& props, Canvas& canvas) { 50ed024d218825042ae933e019810d267454a5eb8aJohn Reck props.setElevation(dp(16)); 51ed024d218825042ae933e019810d267454a5eb8aJohn Reck props.mutableOutline().setRoundRect(0, 0, props.getWidth(), props.getHeight(), 52ed024d218825042ae933e019810d267454a5eb8aJohn Reck dp(6), 1); 53ed024d218825042ae933e019810d267454a5eb8aJohn Reck props.mutableOutline().setShouldClip(true); 54ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.drawBitmap(*magnifier, 0.0f, 0.0f, (float)magnifier->width(), 55ed024d218825042ae933e019810d267454a5eb8aJohn Reck (float)magnifier->height(), 0, 0, (float)props.getWidth(), 56ed024d218825042ae933e019810d267454a5eb8aJohn Reck (float)props.getHeight(), nullptr); 57ed024d218825042ae933e019810d267454a5eb8aJohn Reck }); 58ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.insertReorderBarrier(true); 59ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.drawRenderNode(zoomImageView.get()); 60ed024d218825042ae933e019810d267454a5eb8aJohn Reck canvas.insertReorderBarrier(false); 61ed024d218825042ae933e019810d267454a5eb8aJohn Reck } 62ed024d218825042ae933e019810d267454a5eb8aJohn Reck 63ed024d218825042ae933e019810d267454a5eb8aJohn Reck void doFrame(int frameNr) override { 64ed024d218825042ae933e019810d267454a5eb8aJohn Reck int curFrame = frameNr % 150; 65ed024d218825042ae933e019810d267454a5eb8aJohn Reck card->mutateStagingProperties().setTranslationX(curFrame); 66ed024d218825042ae933e019810d267454a5eb8aJohn Reck card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 67ed024d218825042ae933e019810d267454a5eb8aJohn Reck if (renderTarget) { 68ed024d218825042ae933e019810d267454a5eb8aJohn Reck SkBitmap temp; 69ed024d218825042ae933e019810d267454a5eb8aJohn Reck magnifier->getSkBitmap(&temp); 70ed024d218825042ae933e019810d267454a5eb8aJohn Reck constexpr int x = 90; 71ed024d218825042ae933e019810d267454a5eb8aJohn Reck constexpr int y = 325; 72ed024d218825042ae933e019810d267454a5eb8aJohn Reck RenderProxy::copySurfaceInto(renderTarget, x, y, x + magnifier->width(), 73ed024d218825042ae933e019810d267454a5eb8aJohn Reck y + magnifier->height(), &temp); 74ed024d218825042ae933e019810d267454a5eb8aJohn Reck } 75ed024d218825042ae933e019810d267454a5eb8aJohn Reck } 76ed024d218825042ae933e019810d267454a5eb8aJohn Reck 77ed024d218825042ae933e019810d267454a5eb8aJohn Reck sk_sp<Bitmap> magnifier; 78ed024d218825042ae933e019810d267454a5eb8aJohn Reck}; 79