1 /*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "src/effects/colorfilters/SkTableColorFilter.h"
9
10 #include "include/core/SkColorFilter.h"
11 #include "include/core/SkColorTable.h"
12 #include "include/core/SkFlattenable.h"
13 #include "include/core/SkRefCnt.h"
14 #include "include/core/SkTypes.h"
15 #include "src/base/SkArenaAlloc.h"
16 #include "src/core/SkEffectPriv.h"
17 #include "src/core/SkRasterPipeline.h"
18 #include "src/core/SkRasterPipelineOpContexts.h"
19 #include "src/core/SkRasterPipelineOpList.h"
20 #include "src/effects/colorfilters/SkColorFilterBase.h"
21
22 #include <cstdint>
23 #include <utility>
24
appendStages(const SkStageRec & rec,bool shaderIsOpaque) const25 bool SkTableColorFilter::appendStages(const SkStageRec& rec, bool shaderIsOpaque) const {
26 SkRasterPipeline* p = rec.fPipeline;
27 if (!shaderIsOpaque) {
28 p->append(SkRasterPipelineOp::unpremul);
29 }
30
31 SkRasterPipeline_TablesCtx* tables = rec.fAlloc->make<SkRasterPipeline_TablesCtx>();
32 tables->a = fTable->alphaTable();
33 tables->r = fTable->redTable();
34 tables->g = fTable->greenTable();
35 tables->b = fTable->blueTable();
36 p->append(SkRasterPipelineOp::byte_tables, tables);
37
38 bool definitelyOpaque = shaderIsOpaque && tables->a[0xff] == 0xff;
39 if (!definitelyOpaque) {
40 p->append(SkRasterPipelineOp::premul);
41 }
42 return true;
43 }
44
flatten(SkWriteBuffer & buffer) const45 void SkTableColorFilter::flatten(SkWriteBuffer& buffer) const {
46 fTable->flatten(buffer);
47 }
48
CreateProc(SkReadBuffer & buffer)49 sk_sp<SkFlattenable> SkTableColorFilter::CreateProc(SkReadBuffer& buffer) {
50 return SkColorFilters::Table(SkColorTable::Deserialize(buffer));
51 }
52
53 ///////////////////////////////////////////////////////////////////////////////
54
Table(const uint8_t table[256])55 sk_sp<SkColorFilter> SkColorFilters::Table(const uint8_t table[256]) {
56 return SkColorFilters::Table(SkColorTable::Make(table));
57 }
58
TableARGB(const uint8_t tableA[256],const uint8_t tableR[256],const uint8_t tableG[256],const uint8_t tableB[256])59 sk_sp<SkColorFilter> SkColorFilters::TableARGB(const uint8_t tableA[256],
60 const uint8_t tableR[256],
61 const uint8_t tableG[256],
62 const uint8_t tableB[256]) {
63 return SkColorFilters::Table(SkColorTable::Make(tableA, tableR, tableG, tableB));
64 }
65
Table(sk_sp<SkColorTable> table)66 sk_sp<SkColorFilter> SkColorFilters::Table(sk_sp<SkColorTable> table) {
67 if (!table) {
68 return nullptr;
69 }
70 return sk_make_sp<SkTableColorFilter>(std::move(table));
71 }
72
SkRegisterTableColorFilterFlattenable()73 void SkRegisterTableColorFilterFlattenable() {
74 SK_REGISTER_FLATTENABLE(SkTableColorFilter);
75 // Previous name
76 SkFlattenable::Register("SkTable_ColorFilter", SkTableColorFilter::CreateProc);
77 }
78