1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "TestSceneBase.h"
18 
19 #include <SkBitmap.h>
20 #include <SkCanvas.h>
21 #include <SkPaint.h>
22 #include <SkRect.h>
23 #include <SkRefCnt.h>
24 
25 class ReadbackFromHardware;
26 
27 static TestScene::Registrar _SaveLayer(TestScene::Info{
28         "readbackFromHBitmap", "Allocates hardware bitmap and readback data from it.",
29         TestScene::simpleCreateScene<ReadbackFromHardware>});
30 
31 class ReadbackFromHardware : public TestScene {
32 public:
createHardwareBitmap()33     static sk_sp<Bitmap> createHardwareBitmap() {
34         SkBitmap skBitmap;
35         SkImageInfo info = SkImageInfo::Make(400, 400, kN32_SkColorType, kPremul_SkAlphaType);
36         skBitmap.allocPixels(info);
37         skBitmap.eraseColor(Color::Red_500);
38         SkCanvas canvas(skBitmap);
39         SkPaint paint;
40         paint.setColor(Color::Blue_500);
41         canvas.drawRect(SkRect::MakeXYWH(30, 30, 30, 150), paint);
42         canvas.drawRect(SkRect::MakeXYWH(30, 30, 100, 30), paint);
43         canvas.drawRect(SkRect::MakeXYWH(30, 100, 70, 30), paint);
44         return Bitmap::allocateHardwareBitmap(skBitmap);
45     }
46 
createContent(int width,int height,Canvas & canvas)47     void createContent(int width, int height, Canvas& canvas) override {
48         canvas.drawColor(Color::White, SkBlendMode::kSrcOver);  // background
49 
50         sk_sp<Bitmap> hardwareBitmap(createHardwareBitmap());
51 
52         SkBitmap readback;
53         hardwareBitmap->getSkBitmap(&readback);
54 
55         SkBitmap canvasBitmap;
56         sk_sp<Bitmap> heapBitmap(TestUtils::createBitmap(hardwareBitmap->width(),
57                                                          hardwareBitmap->height(), &canvasBitmap));
58 
59         SkCanvas skCanvas(canvasBitmap);
60         skCanvas.drawImage(readback.asImage(), 0, 0);
61         canvas.drawBitmap(*heapBitmap, 0, 0, nullptr);
62 
63         canvas.drawBitmap(*hardwareBitmap, 0, 500, nullptr);
64     }
65 
doFrame(int frameNr)66     void doFrame(int frameNr) override {}
67 };
68