1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 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 "include/core/SkColorSpace.h" 9cb93a386Sopenharmony_ci#include "include/core/SkImageInfo.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/c/sk_colorspace.h" 12cb93a386Sopenharmony_ci#include "include/c/sk_imageinfo.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciconst struct { 15cb93a386Sopenharmony_ci sk_colortype_t fC; 16cb93a386Sopenharmony_ci SkColorType fSK; 17cb93a386Sopenharmony_ci} gColorTypeMap[] = { 18cb93a386Sopenharmony_ci { UNKNOWN_SK_COLORTYPE, kUnknown_SkColorType }, 19cb93a386Sopenharmony_ci { RGBA_8888_SK_COLORTYPE, kRGBA_8888_SkColorType }, 20cb93a386Sopenharmony_ci { BGRA_8888_SK_COLORTYPE, kBGRA_8888_SkColorType }, 21cb93a386Sopenharmony_ci { ALPHA_8_SK_COLORTYPE, kAlpha_8_SkColorType }, 22cb93a386Sopenharmony_ci { GRAY_8_SK_COLORTYPE, kGray_8_SkColorType }, 23cb93a386Sopenharmony_ci { RGBA_F16_SK_COLORTYPE, kRGBA_F16_SkColorType }, 24cb93a386Sopenharmony_ci { RGBA_F32_SK_COLORTYPE, kRGBA_F32_SkColorType }, 25cb93a386Sopenharmony_ci}; 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciconst struct { 28cb93a386Sopenharmony_ci sk_alphatype_t fC; 29cb93a386Sopenharmony_ci SkAlphaType fSK; 30cb93a386Sopenharmony_ci} gAlphaTypeMap[] = { 31cb93a386Sopenharmony_ci { OPAQUE_SK_ALPHATYPE, kOpaque_SkAlphaType }, 32cb93a386Sopenharmony_ci { PREMUL_SK_ALPHATYPE, kPremul_SkAlphaType }, 33cb93a386Sopenharmony_ci { UNPREMUL_SK_ALPHATYPE, kUnpremul_SkAlphaType }, 34cb93a386Sopenharmony_ci}; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_cistatic bool from_c_colortype(sk_colortype_t cCT, SkColorType* skCT) { 37cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) { 38cb93a386Sopenharmony_ci if (gColorTypeMap[i].fC == cCT) { 39cb93a386Sopenharmony_ci if (skCT) { 40cb93a386Sopenharmony_ci *skCT = gColorTypeMap[i].fSK; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci return true; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci return false; 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_cistatic bool to_c_colortype(SkColorType skCT, sk_colortype_t* cCT) { 49cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) { 50cb93a386Sopenharmony_ci if (gColorTypeMap[i].fSK == skCT) { 51cb93a386Sopenharmony_ci if (cCT) { 52cb93a386Sopenharmony_ci *cCT = gColorTypeMap[i].fC; 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci return true; 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci return false; 58cb93a386Sopenharmony_ci} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_cistatic bool from_c_alphatype(sk_alphatype_t cAT, SkAlphaType* skAT) { 61cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gAlphaTypeMap); ++i) { 62cb93a386Sopenharmony_ci if (gAlphaTypeMap[i].fC == cAT) { 63cb93a386Sopenharmony_ci if (skAT) { 64cb93a386Sopenharmony_ci *skAT = gAlphaTypeMap[i].fSK; 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci return true; 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci return false; 70cb93a386Sopenharmony_ci} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_cistatic bool to_c_alphatype(SkAlphaType skAT, sk_alphatype_t* cAT) { 73cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gAlphaTypeMap); ++i) { 74cb93a386Sopenharmony_ci if (gAlphaTypeMap[i].fSK == skAT) { 75cb93a386Sopenharmony_ci if (cAT) { 76cb93a386Sopenharmony_ci *cAT = gAlphaTypeMap[i].fC; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci return true; 79cb93a386Sopenharmony_ci } 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci return false; 82cb93a386Sopenharmony_ci} 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ciconst SkImageInfo* ToImageInfo(const sk_imageinfo_t* cinfo) { 85cb93a386Sopenharmony_ci return reinterpret_cast<const SkImageInfo*>(cinfo); 86cb93a386Sopenharmony_ci} 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////// 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_cisk_imageinfo_t* sk_imageinfo_new(int w, int h, sk_colortype_t cct, sk_alphatype_t cat, 91cb93a386Sopenharmony_ci sk_colorspace_t* ccs) { 92cb93a386Sopenharmony_ci SkColorType ct; 93cb93a386Sopenharmony_ci SkAlphaType at; 94cb93a386Sopenharmony_ci if (!from_c_colortype(cct, &ct) || !from_c_alphatype(cat, &at)) { 95cb93a386Sopenharmony_ci return nullptr; 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci SkColorSpace* cs = (SkColorSpace*)ccs; 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci SkImageInfo* info = new SkImageInfo(SkImageInfo::Make(w, h, ct, at, sk_ref_sp(cs))); 100cb93a386Sopenharmony_ci return reinterpret_cast<sk_imageinfo_t*>(info); 101cb93a386Sopenharmony_ci} 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_civoid sk_imageinfo_delete(sk_imageinfo_t* cinfo) { 104cb93a386Sopenharmony_ci delete ToImageInfo(cinfo); 105cb93a386Sopenharmony_ci} 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ciint32_t sk_imageinfo_get_width(const sk_imageinfo_t* cinfo) { 108cb93a386Sopenharmony_ci return ToImageInfo(cinfo)->width(); 109cb93a386Sopenharmony_ci} 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ciint32_t sk_imageinfo_get_height(const sk_imageinfo_t* cinfo) { 112cb93a386Sopenharmony_ci return ToImageInfo(cinfo)->height(); 113cb93a386Sopenharmony_ci} 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_cisk_colortype_t sk_imageinfo_get_colortype(const sk_imageinfo_t* cinfo) { 116cb93a386Sopenharmony_ci sk_colortype_t ct; 117cb93a386Sopenharmony_ci return to_c_colortype(ToImageInfo(cinfo)->colorType(), &ct) ? ct : UNKNOWN_SK_COLORTYPE; 118cb93a386Sopenharmony_ci} 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_cisk_alphatype_t sk_imageinfo_get_alphatype(const sk_imageinfo_t* cinfo) { 121cb93a386Sopenharmony_ci sk_alphatype_t at; 122cb93a386Sopenharmony_ci // odd that we return premul on failure... 123cb93a386Sopenharmony_ci return to_c_alphatype(ToImageInfo(cinfo)->alphaType(), &at) ? at : PREMUL_SK_ALPHATYPE; 124cb93a386Sopenharmony_ci} 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_cisk_colorspace_t* sk_imageinfo_get_colorspace(const sk_imageinfo_t* cinfo) { 127cb93a386Sopenharmony_ci return reinterpret_cast<sk_colorspace_t*>(ToImageInfo(cinfo)->colorSpace()); 128cb93a386Sopenharmony_ci} 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////// 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_cisk_colorspace_t* sk_colorspace_new_srgb() { 133cb93a386Sopenharmony_ci return reinterpret_cast<sk_colorspace_t*>(SkColorSpace::MakeSRGB().release()); 134cb93a386Sopenharmony_ci} 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_civoid sk_colorspace_ref(sk_colorspace_t* cs) { 137cb93a386Sopenharmony_ci SkSafeRef(reinterpret_cast<SkColorSpace*>(cs)); 138cb93a386Sopenharmony_ci} 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_civoid sk_colorspace_unref(sk_colorspace_t* cs) { 141cb93a386Sopenharmony_ci SkSafeUnref(reinterpret_cast<SkColorSpace*>(cs)); 142cb93a386Sopenharmony_ci} 143cb93a386Sopenharmony_ci 144