xref: /aosp_15_r20/external/skia/src/effects/colorfilters/SkTableColorFilter.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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