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 <ui/PixelFormat.h> 219c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include <SkGradientShader.h> 229c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#include <SkImagePriv.h> 239c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 249c97e48fbe389180b4b64845f093c53c92c374f3sergeyvclass HwBitmapInCompositeShader; 259c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 269c97e48fbe389180b4b64845f093c53c92c374f3sergeyvstatic TestScene::Registrar _HwBitmapInCompositeShader(TestScene::Info{ 279c97e48fbe389180b4b64845f093c53c92c374f3sergeyv "hwbitmapcompositeshader", 289c97e48fbe389180b4b64845f093c53c92c374f3sergeyv "Draws composite shader with hardware bitmap", 299c97e48fbe389180b4b64845f093c53c92c374f3sergeyv TestScene::simpleCreateScene<HwBitmapInCompositeShader> 309c97e48fbe389180b4b64845f093c53c92c374f3sergeyv}); 319c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 329c97e48fbe389180b4b64845f093c53c92c374f3sergeyvclass HwBitmapInCompositeShader : public TestScene { 339c97e48fbe389180b4b64845f093c53c92c374f3sergeyvpublic: 349c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sp<RenderNode> card; 359c97e48fbe389180b4b64845f093c53c92c374f3sergeyv void createContent(int width, int height, Canvas& canvas) override { 369c97e48fbe389180b4b64845f093c53c92c374f3sergeyv canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); 379c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 389c97e48fbe389180b4b64845f093c53c92c374f3sergeyv uint32_t usage = GraphicBuffer::USAGE_HW_TEXTURE 399c97e48fbe389180b4b64845f093c53c92c374f3sergeyv | GraphicBuffer::USAGE_SW_READ_NEVER 409c97e48fbe389180b4b64845f093c53c92c374f3sergeyv | GRALLOC_USAGE_SW_WRITE_RARELY; 412bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian 422bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian sp<GraphicBuffer> buffer = new GraphicBuffer(400, 200, PIXEL_FORMAT_RGBA_8888, usage); 439c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 449c97e48fbe389180b4b64845f093c53c92c374f3sergeyv unsigned char* pixels = nullptr; 459c97e48fbe389180b4b64845f093c53c92c374f3sergeyv buffer->lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, ((void**)&pixels)); 469c97e48fbe389180b4b64845f093c53c92c374f3sergeyv size_t size = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride() 479c97e48fbe389180b4b64845f093c53c92c374f3sergeyv * buffer->getHeight(); 489c97e48fbe389180b4b64845f093c53c92c374f3sergeyv memset(pixels, 0, size); 499c97e48fbe389180b4b64845f093c53c92c374f3sergeyv for (int i = 0; i < 6000; i++) { 509c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 0] = 255; 519c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 1] = 255; 529c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 2] = 0; 539c97e48fbe389180b4b64845f093c53c92c374f3sergeyv pixels[4000 + 4 * i + 3] = 255; 549c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 559c97e48fbe389180b4b64845f093c53c92c374f3sergeyv buffer->unlock(); 569c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<Bitmap> hardwareBitmap(Bitmap::createFrom(buffer)); 579c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> hardwareShader(createBitmapShader(*hardwareBitmap)); 589c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 599c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkPoint center; 609c97e48fbe389180b4b64845f093c53c92c374f3sergeyv center.set(50, 50); 619c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkColor colors[2]; 629c97e48fbe389180b4b64845f093c53c92c374f3sergeyv colors[0] = Color::Black; 639c97e48fbe389180b4b64845f093c53c92c374f3sergeyv colors[1] = Color::White; 649c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> gradientShader = SkGradientShader::MakeRadial(center, 50, colors, nullptr, 659c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 2, SkShader::TileMode::kRepeat_TileMode); 669c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 679c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> compositeShader( 689c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkShader::MakeComposeShader(hardwareShader, gradientShader, SkBlendMode::kDstATop)); 699c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 709c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkPaint paint; 719c97e48fbe389180b4b64845f093c53c92c374f3sergeyv paint.setShader(std::move(compositeShader)); 729c97e48fbe389180b4b64845f093c53c92c374f3sergeyv canvas.drawRoundRect(0, 0, 400, 200, 10.0f, 10.0f, paint); 739c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 749c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 759c97e48fbe389180b4b64845f093c53c92c374f3sergeyv void doFrame(int frameNr) override { } 769c97e48fbe389180b4b64845f093c53c92c374f3sergeyv 779c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkShader> createBitmapShader(Bitmap& bitmap) { 789c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkBitmap skBitmap; 799c97e48fbe389180b4b64845f093c53c92c374f3sergeyv bitmap.getSkBitmapForShaders(&skBitmap); 809c97e48fbe389180b4b64845f093c53c92c374f3sergeyv sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode); 819c97e48fbe389180b4b64845f093c53c92c374f3sergeyv return image->makeShader(SkShader::TileMode::kClamp_TileMode, 829c97e48fbe389180b4b64845f093c53c92c374f3sergeyv SkShader::TileMode::kClamp_TileMode); 839c97e48fbe389180b4b64845f093c53c92c374f3sergeyv } 842bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian}; 85