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