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