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