HwBitmapInCompositeShader.cpp revision 9c97e48fbe389180b4b64845f093c53c92c374f3
1/* 2 * Copyright (C) 2016 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#include "utils/Color.h" 19 20#include <gui/IGraphicBufferAlloc.h> 21#include <gui/ISurfaceComposer.h> 22#include <private/gui/ComposerService.h> 23#include <binder/IServiceManager.h> 24#include <ui/PixelFormat.h> 25#include <SkGradientShader.h> 26#include <SkImagePriv.h> 27 28class HwBitmapInCompositeShader; 29 30static TestScene::Registrar _HwBitmapInCompositeShader(TestScene::Info{ 31 "hwbitmapcompositeshader", 32 "Draws composite shader with hardware bitmap", 33 TestScene::simpleCreateScene<HwBitmapInCompositeShader> 34}); 35 36class HwBitmapInCompositeShader : public TestScene { 37public: 38 sp<RenderNode> card; 39 void createContent(int width, int height, Canvas& canvas) override { 40 canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); 41 42 status_t error; 43 sp<ISurfaceComposer> composer(ComposerService::getComposerService()); 44 sp<IGraphicBufferAlloc> alloc(composer->createGraphicBufferAlloc()); 45 uint32_t usage = GraphicBuffer::USAGE_HW_TEXTURE 46 | GraphicBuffer::USAGE_SW_READ_NEVER 47 | GRALLOC_USAGE_SW_WRITE_RARELY; 48 sp<GraphicBuffer> buffer = alloc->createGraphicBuffer(400, 200, PIXEL_FORMAT_RGBA_8888, 1, 49 usage, &error); 50 51 unsigned char* pixels = nullptr; 52 buffer->lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, ((void**)&pixels)); 53 size_t size = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride() 54 * buffer->getHeight(); 55 memset(pixels, 0, size); 56 for (int i = 0; i < 6000; i++) { 57 pixels[4000 + 4 * i + 0] = 255; 58 pixels[4000 + 4 * i + 1] = 255; 59 pixels[4000 + 4 * i + 2] = 0; 60 pixels[4000 + 4 * i + 3] = 255; 61 } 62 buffer->unlock(); 63 sk_sp<Bitmap> hardwareBitmap(Bitmap::createFrom(buffer)); 64 sk_sp<SkShader> hardwareShader(createBitmapShader(*hardwareBitmap)); 65 66 SkPoint center; 67 center.set(50, 50); 68 SkColor colors[2]; 69 colors[0] = Color::Black; 70 colors[1] = Color::White; 71 sk_sp<SkShader> gradientShader = SkGradientShader::MakeRadial(center, 50, colors, nullptr, 72 2, SkShader::TileMode::kRepeat_TileMode); 73 74 sk_sp<SkShader> compositeShader( 75 SkShader::MakeComposeShader(hardwareShader, gradientShader, SkBlendMode::kDstATop)); 76 77 SkPaint paint; 78 paint.setShader(std::move(compositeShader)); 79 canvas.drawRoundRect(0, 0, 400, 200, 10.0f, 10.0f, paint); 80 } 81 82 void doFrame(int frameNr) override { } 83 84 sk_sp<SkShader> createBitmapShader(Bitmap& bitmap) { 85 SkBitmap skBitmap; 86 bitmap.getSkBitmapForShaders(&skBitmap); 87 sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode); 88 return image->makeShader(SkShader::TileMode::kClamp_TileMode, 89 SkShader::TileMode::kClamp_TileMode); 90 } 91};