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