159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv/* 259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * Copyright (C) 2015 The Android Open Source Project 359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * 459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * Licensed under the Apache License, Version 2.0 (the "License"); 559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * you may not use this file except in compliance with the License. 659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * You may obtain a copy of the License at 759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * 859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * http://www.apache.org/licenses/LICENSE-2.0 959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * 1059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * Unless required by applicable law or agreed to in writing, software 1159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * distributed under the License is distributed on an "AS IS" BASIS, 1259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * See the License for the specific language governing permissions and 1459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv * limitations under the License. 1559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv */ 1659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 1759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv#include "TestSceneBase.h" 1859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 1959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyvclass ReadbackFromHardware; 2059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 2159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyvstatic TestScene::Registrar _SaveLayer(TestScene::Info{ 2259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv "readbackFromHBitmap", 2359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv "Allocates hardware bitmap and readback data from it.", 2459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv TestScene::simpleCreateScene<ReadbackFromHardware> 2559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv}); 2659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 2759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyvclass ReadbackFromHardware : public TestScene { 2859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyvpublic: 2959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv static sk_sp<Bitmap> createHardwareBitmap() { 3059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkBitmap skBitmap; 3159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkImageInfo info = SkImageInfo::Make(400, 400, kN32_SkColorType, kPremul_SkAlphaType); 3259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv skBitmap.allocPixels(info); 3359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv skBitmap.eraseColor(Color::Red_500); 3459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkCanvas canvas(skBitmap); 3559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkPaint paint; 3659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv paint.setColor(Color::Blue_500); 3759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawRect(SkRect::MakeXYWH(30, 30, 30, 150), paint); 3859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawRect(SkRect::MakeXYWH(30, 30, 100, 30), paint); 3959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawRect(SkRect::MakeXYWH(30, 100, 70, 30), paint); 4059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv return Bitmap::allocateHardwareBitmap(skBitmap); 4159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv } 4259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 4359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv void createContent(int width, int height, Canvas& canvas) override { 4459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawColor(Color::White, SkBlendMode::kSrcOver); // background 4559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 4659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv sk_sp<Bitmap> hardwareBitmap(createHardwareBitmap()); 4759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 4859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkBitmap readback; 4959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv hardwareBitmap->getSkBitmap(&readback); 5059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 5159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkBitmap canvasBitmap; 5259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv sk_sp<Bitmap> heapBitmap(TestUtils::createBitmap(hardwareBitmap->width(), 5359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv hardwareBitmap->height(), &canvasBitmap)); 5459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 5559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv SkCanvas skCanvas(canvasBitmap); 5659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv skCanvas.drawBitmap(readback, 0, 0); 5759eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawBitmap(*heapBitmap, 0, 0, nullptr); 5859eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 5959eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv canvas.drawBitmap(*hardwareBitmap, 0, 500, nullptr); 6059eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv } 6159eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv 6259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv void doFrame(int frameNr) override { } 6359eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv}; 64