1 | /* |
---|---|
2 | * Copyright 2019 Google LLC |
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/gpu/GrSwizzle.h" |
9 | |
10 | #include "src/core/SkRasterPipeline.h" |
11 | |
12 | void GrSwizzle::apply(SkRasterPipeline* pipeline) const { |
13 | SkASSERT(pipeline); |
14 | switch (fKey) { |
15 | case GrSwizzle("rgba").asKey(): |
16 | return; |
17 | case GrSwizzle("bgra").asKey(): |
18 | pipeline->append(SkRasterPipeline::swap_rb); |
19 | return; |
20 | case GrSwizzle("aaa1").asKey(): |
21 | pipeline->append(SkRasterPipeline::alpha_to_gray); |
22 | return; |
23 | case GrSwizzle("rgb1").asKey(): |
24 | pipeline->append(SkRasterPipeline::force_opaque); |
25 | return; |
26 | default: { |
27 | static_assert(sizeof(uintptr_t) >= 4 * sizeof(char)); |
28 | // Rather than allocate the 4 control bytes on the heap somewhere, just jam them right |
29 | // into a uintptr_t context. |
30 | uintptr_t ctx; |
31 | memcpy(&ctx, this->asString().c_str(), 4 * sizeof(char)); |
32 | pipeline->append(SkRasterPipeline::swizzle, ctx); |
33 | return; |
34 | } |
35 | } |
36 | } |
37 | |
38 | SkString GrSwizzle::asString() const { |
39 | char swiz[5]; |
40 | uint16_t key = fKey; |
41 | for (int i = 0; i < 4; ++i) { |
42 | swiz[i] = IToC(key & 0xfU); |
43 | key >>= 4; |
44 | } |
45 | swiz[4] = '\0'; |
46 | return SkString(swiz); |
47 | } |
48 |