19c97e48fbe389180b4b64845f093c53c92c374f3sergeyv/* 29c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * Copyright (C) 2016 The Android Open Source Project 39c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * 49c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * Licensed under the Apache License, Version 2.0 (the "License"); 59c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * you may not use this file except in compliance with the License. 69c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * You may obtain a copy of the License at 79c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * 89c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * http://www.apache.org/licenses/LICENSE-2.0 99c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * 109c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * Unless required by applicable law or agreed to in writing, software 119c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * distributed under the License is distributed on an "AS IS" BASIS, 129c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * See the License for the specific language governing permissions and 149c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * limitations under the License. 159c97e48fbe389180b4b64845f093c53c92c374f3sergeyv */ 169c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 179c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include "TestSceneBase.h" 189c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include "utils/Color.h" 199c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 209c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include <SkGradientShader.h> 219c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include <SkImagePriv.h> 221bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include <ui/PixelFormat.h> 239c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 249c97e48fbe389180b4b64845f093c53c92c374f3sergeyvclass HwBitmapInCompositeShader; 259c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 269c97e48fbe389180b4b64845f093c53c92c374f3sergeyvstatic TestScene::Registrar _HwBitmapInCompositeShader(TestScene::Info{ 271bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck "hwbitmapcompositeshader", "Draws composite shader with hardware bitmap", 281bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck TestScene::simpleCreateScene<HwBitmapInCompositeShader>}); 299c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 309c97e48fbe389180b4b64845f093c53c92c374f3sergeyvclass HwBitmapInCompositeShader : public TestScene { 319c97e48fbe389180b4b64845f093c53c92c374f3sergeyvpublic: 329c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sp<RenderNode> card; 339c97e48fbe389180b4b64845f093c53c92c374f3sergeyv void createContent(int width, int height, Canvas& canvas) override { 349c97e48fbe389180b4b64845f093c53c92c374f3sergeyv canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); 359c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck uint32_t usage = GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_READ_NEVER | 371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck GRALLOC_USAGE_SW_WRITE_RARELY; 382bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian 392bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian sp<GraphicBuffer> buffer = new GraphicBuffer(400, 200, PIXEL_FORMAT_RGBA_8888, usage); 409c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 419c97e48fbe389180b4b64845f093c53c92c374f3sergeyv unsigned char* pixels = nullptr; 429c97e48fbe389180b4b64845f093c53c92c374f3sergeyv buffer->lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, ((void**)&pixels)); 431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck size_t size = 441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride() * buffer->getHeight(); 459c97e48fbe389180b4b64845f093c53c92c374f3sergeyv memset(pixels, 0, size); 469c97e48fbe389180b4b64845f093c53c92c374f3sergeyv for (int i = 0; i < 6000; i++) { 479c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 0] = 255; 489c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 1] = 255; 499c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 2] = 0; 509c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 3] = 255; 519c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 529c97e48fbe389180b4b64845f093c53c92c374f3sergeyv buffer->unlock(); 539c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<Bitmap> hardwareBitmap(Bitmap::createFrom(buffer)); 549c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> hardwareShader(createBitmapShader(*hardwareBitmap)); 559c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 569c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkPoint center; 579c97e48fbe389180b4b64845f093c53c92c374f3sergeyv center.set(50, 50); 589c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkColor colors[2]; 599c97e48fbe389180b4b64845f093c53c92c374f3sergeyv colors[0] = Color::Black; 609c97e48fbe389180b4b64845f093c53c92c374f3sergeyv colors[1] = Color::White; 611bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck sk_sp<SkShader> gradientShader = SkGradientShader::MakeRadial( 621bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck center, 50, colors, nullptr, 2, SkShader::TileMode::kRepeat_TileMode); 639c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 649c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> compositeShader( 659c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkShader::MakeComposeShader(hardwareShader, gradientShader, SkBlendMode::kDstATop)); 669c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 679c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkPaint paint; 689c97e48fbe389180b4b64845f093c53c92c374f3sergeyv paint.setShader(std::move(compositeShader)); 699c97e48fbe389180b4b64845f093c53c92c374f3sergeyv canvas.drawRoundRect(0, 0, 400, 200, 10.0f, 10.0f, paint); 709c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 719c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 721bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck void doFrame(int frameNr) override {} 739c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 749c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> createBitmapShader(Bitmap& bitmap) { 75fb0c8fc3d5413a3ec357680d85084a17bb9ef64fDerek Sollenberger sk_sp<SkColorFilter> colorFilter; 76fb0c8fc3d5413a3ec357680d85084a17bb9ef64fDerek Sollenberger sk_sp<SkImage> image = bitmap.makeImage(&colorFilter); 779c97e48fbe389180b4b64845f093c53c92c374f3sergeyv return image->makeShader(SkShader::TileMode::kClamp_TileMode, 781bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck SkShader::TileMode::kClamp_TileMode); 799c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 802bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian}; 81