1694d499662838123f474f41b31dea84ec5d563f0sergeyv/*
2694d499662838123f474f41b31dea84ec5d563f0sergeyv * Copyright (C) 2015 The Android Open Source Project
3694d499662838123f474f41b31dea84ec5d563f0sergeyv *
4694d499662838123f474f41b31dea84ec5d563f0sergeyv * Licensed under the Apache License, Version 2.0 (the "License");
5694d499662838123f474f41b31dea84ec5d563f0sergeyv * you may not use this file except in compliance with the License.
6694d499662838123f474f41b31dea84ec5d563f0sergeyv * You may obtain a copy of the License at
7694d499662838123f474f41b31dea84ec5d563f0sergeyv *
8694d499662838123f474f41b31dea84ec5d563f0sergeyv *      http://www.apache.org/licenses/LICENSE-2.0
9694d499662838123f474f41b31dea84ec5d563f0sergeyv *
10694d499662838123f474f41b31dea84ec5d563f0sergeyv * Unless required by applicable law or agreed to in writing, software
11694d499662838123f474f41b31dea84ec5d563f0sergeyv * distributed under the License is distributed on an "AS IS" BASIS,
12694d499662838123f474f41b31dea84ec5d563f0sergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13694d499662838123f474f41b31dea84ec5d563f0sergeyv * See the License for the specific language governing permissions and
14694d499662838123f474f41b31dea84ec5d563f0sergeyv * limitations under the License.
15694d499662838123f474f41b31dea84ec5d563f0sergeyv */
16694d499662838123f474f41b31dea84ec5d563f0sergeyv
17694d499662838123f474f41b31dea84ec5d563f0sergeyv#pragma once
18694d499662838123f474f41b31dea84ec5d563f0sergeyv
19694d499662838123f474f41b31dea84ec5d563f0sergeyv#include "TestScene.h"
20694d499662838123f474f41b31dea84ec5d563f0sergeyv
21694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <SkBitmap.h>
22694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <string>
23694d499662838123f474f41b31dea84ec5d563f0sergeyv
24694d499662838123f474f41b31dea84ec5d563f0sergeyvnamespace android {
25694d499662838123f474f41b31dea84ec5d563f0sergeyvnamespace uirenderer {
26694d499662838123f474f41b31dea84ec5d563f0sergeyvnamespace test {
27694d499662838123f474f41b31dea84ec5d563f0sergeyv
28694d499662838123f474f41b31dea84ec5d563f0sergeyvclass BitmapAllocationTestUtils {
29694d499662838123f474f41b31dea84ec5d563f0sergeyvpublic:
30694d499662838123f474f41b31dea84ec5d563f0sergeyv    static sk_sp<Bitmap> allocateHeapBitmap(int width, int height,
31694d499662838123f474f41b31dea84ec5d563f0sergeyv            SkColorType colorType, std::function<void(SkBitmap& bitmap)> setup) {
32694d499662838123f474f41b31dea84ec5d563f0sergeyv         sk_sp<Bitmap> bitmap = TestUtils::createBitmap(width, height, colorType);
33694d499662838123f474f41b31dea84ec5d563f0sergeyv         SkBitmap skBitmap;
34694d499662838123f474f41b31dea84ec5d563f0sergeyv         bitmap->getSkBitmap(&skBitmap);
35694d499662838123f474f41b31dea84ec5d563f0sergeyv         setup(skBitmap);
36694d499662838123f474f41b31dea84ec5d563f0sergeyv         return bitmap;
37694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
38694d499662838123f474f41b31dea84ec5d563f0sergeyv
39694d499662838123f474f41b31dea84ec5d563f0sergeyv    static sk_sp<Bitmap> allocateHardwareBitmap(int width, int height,
40694d499662838123f474f41b31dea84ec5d563f0sergeyv            SkColorType colorType, std::function<void(SkBitmap& bitmap)> setup) {
41694d499662838123f474f41b31dea84ec5d563f0sergeyv        SkBitmap skBitmap;
4291d6354cde90b6625d4af6a5d909d886bf602a49sergeyv        SkImageInfo info = SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType);
4391d6354cde90b6625d4af6a5d909d886bf602a49sergeyv        skBitmap.setInfo(info);
4491d6354cde90b6625d4af6a5d909d886bf602a49sergeyv        sk_sp<Bitmap> heapBitmap(Bitmap::allocateHeapBitmap(&skBitmap, nullptr));
45694d499662838123f474f41b31dea84ec5d563f0sergeyv        setup(skBitmap);
46694d499662838123f474f41b31dea84ec5d563f0sergeyv        return Bitmap::allocateHardwareBitmap(skBitmap);
47694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
48694d499662838123f474f41b31dea84ec5d563f0sergeyv
49694d499662838123f474f41b31dea84ec5d563f0sergeyv    typedef sk_sp<Bitmap> (*BitmapAllocator) (int, int, SkColorType,
50694d499662838123f474f41b31dea84ec5d563f0sergeyv            std::function<void(SkBitmap& bitmap)> setup);
51694d499662838123f474f41b31dea84ec5d563f0sergeyv
52694d499662838123f474f41b31dea84ec5d563f0sergeyv    template <class T, BitmapAllocator allocator>
53694d499662838123f474f41b31dea84ec5d563f0sergeyv    static test::TestScene* createBitmapAllocationScene(const TestScene::Options&) {
54694d499662838123f474f41b31dea84ec5d563f0sergeyv        return new T(allocator);
55694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
56694d499662838123f474f41b31dea84ec5d563f0sergeyv
57694d499662838123f474f41b31dea84ec5d563f0sergeyv    template <class BaseScene>
58694d499662838123f474f41b31dea84ec5d563f0sergeyv    static bool registerBitmapAllocationScene(std::string name, std::string  description) {
59694d499662838123f474f41b31dea84ec5d563f0sergeyv        TestScene::registerScene({
60694d499662838123f474f41b31dea84ec5d563f0sergeyv            name + "GlTex",
61694d499662838123f474f41b31dea84ec5d563f0sergeyv            description + " (GlTex version).",
62694d499662838123f474f41b31dea84ec5d563f0sergeyv            createBitmapAllocationScene<BaseScene, &allocateHeapBitmap>
63694d499662838123f474f41b31dea84ec5d563f0sergeyv        });
64694d499662838123f474f41b31dea84ec5d563f0sergeyv
65694d499662838123f474f41b31dea84ec5d563f0sergeyv        TestScene::registerScene({
66694d499662838123f474f41b31dea84ec5d563f0sergeyv            name + "EglImage",
67694d499662838123f474f41b31dea84ec5d563f0sergeyv            description + " (EglImage version).",
68694d499662838123f474f41b31dea84ec5d563f0sergeyv            createBitmapAllocationScene<BaseScene, &allocateHardwareBitmap>
69694d499662838123f474f41b31dea84ec5d563f0sergeyv        });
70694d499662838123f474f41b31dea84ec5d563f0sergeyv        return true;
71694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
72694d499662838123f474f41b31dea84ec5d563f0sergeyv};
73694d499662838123f474f41b31dea84ec5d563f0sergeyv
74694d499662838123f474f41b31dea84ec5d563f0sergeyv} // namespace test
75694d499662838123f474f41b31dea84ec5d563f0sergeyv} // namespace uirenderer
76694d499662838123f474f41b31dea84ec5d563f0sergeyv} // namespace android