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:
301bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    static sk_sp<Bitmap> allocateHeapBitmap(int width, int height, SkColorType colorType,
311bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                            std::function<void(SkBitmap& bitmap)> setup) {
321bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        sk_sp<Bitmap> bitmap = TestUtils::createBitmap(width, height, colorType);
331bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        SkBitmap skBitmap;
341bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        bitmap->getSkBitmap(&skBitmap);
351bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        setup(skBitmap);
361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        return bitmap;
37694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
38694d499662838123f474f41b31dea84ec5d563f0sergeyv
391bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    static sk_sp<Bitmap> allocateHardwareBitmap(int width, int height, SkColorType colorType,
401bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                                std::function<void(SkBitmap& bitmap)> setup) {
41694d499662838123f474f41b31dea84ec5d563f0sergeyv        SkBitmap skBitmap;
4291d6354cde90b6625d4af6a5d909d886bf602a49sergeyv        SkImageInfo info = SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType);
4391d6354cde90b6625d4af6a5d909d886bf602a49sergeyv        skBitmap.setInfo(info);
44f51a80d2b074d1971b11b19e890c936af5aa57a3Leon Scroggins III        sk_sp<Bitmap> heapBitmap(Bitmap::allocateHeapBitmap(&skBitmap));
45694d499662838123f474f41b31dea84ec5d563f0sergeyv        setup(skBitmap);
46694d499662838123f474f41b31dea84ec5d563f0sergeyv        return Bitmap::allocateHardwareBitmap(skBitmap);
47694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
48694d499662838123f474f41b31dea84ec5d563f0sergeyv
491bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    typedef sk_sp<Bitmap> (*BitmapAllocator)(int, int, SkColorType,
501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                             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>
581bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    static bool registerBitmapAllocationScene(std::string name, std::string description) {
591bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        TestScene::registerScene({name + "GlTex", description + " (GlTex version).",
601bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                  createBitmapAllocationScene<BaseScene, &allocateHeapBitmap>});
61694d499662838123f474f41b31dea84ec5d563f0sergeyv
621bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        TestScene::registerScene({name + "EglImage", description + " (EglImage version).",
631bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                  createBitmapAllocationScene<BaseScene, &allocateHardwareBitmap>});
64694d499662838123f474f41b31dea84ec5d563f0sergeyv        return true;
65694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
66694d499662838123f474f41b31dea84ec5d563f0sergeyv};
67694d499662838123f474f41b31dea84ec5d563f0sergeyv
681bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}  // namespace test
691bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}  // namespace uirenderer
701bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}  // namespace android
71