1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkArenaAlloc.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOverdrawColorFilter.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPM4f.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRasterPipeline.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkReadBuffer.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "../jumper/SkJumper.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkOverdrawColorFilter::onAppendStages(SkRasterPipeline* p,
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           SkColorSpace* dstCS,
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           SkArenaAlloc* alloc,
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           bool shader_is_opaque) const {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct Ctx : public SkJumper_CallbackCtx {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkPMColor* colors;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // TODO: do we care about transforming to dstCS?
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    auto ctx = alloc->make<Ctx>();
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ctx->colors = fColors;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ctx->fn = [](SkJumper_CallbackCtx* arg, int active_pixels) {
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        auto ctx = (Ctx*)arg;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        auto pixels = (SkPM4f*)ctx->rgba;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < active_pixels; i++) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            uint8_t alpha = (int)(pixels[i].a() * 255);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (alpha >= kNumColors) {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                alpha = kNumColors - 1;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            pixels[i] = SkPM4f::FromPMColor(ctx->colors[alpha]);
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    p->append(SkRasterPipeline::callback, ctx);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkOverdrawColorFilter::toString(SkString* str) const {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    str->append("SkOverdrawColorFilter (");
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < kNumColors; i++) {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        str->appendf("%d: %x\n", i, fColors[i]);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    str->append(")");
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkOverdrawColorFilter::flatten(SkWriteBuffer& buffer) const {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    buffer.writeByteArray(fColors, kNumColors * sizeof(SkPMColor));
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkFlattenable> SkOverdrawColorFilter::CreateProc(SkReadBuffer& buffer) {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPMColor colors[kNumColors];
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t size = buffer.getArrayCount();
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!buffer.validate(size == sizeof(colors))) {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!buffer.readByteArray(colors, sizeof(colors))) {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkOverdrawColorFilter::Make(colors);
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkOverdrawColorFilter)
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkOverdrawColorFilter)
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "effects/GrOverdrawFragmentProcessor.h"
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstd::unique_ptr<GrFragmentProcessor> SkOverdrawColorFilter::asFragmentProcessor(
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrContext*, const GrColorSpaceInfo&) const {
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return GrOverdrawFragmentProcessor::Make(fColors[0], fColors[1], fColors[2], fColors[3],
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             fColors[4], fColors[5]);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
78