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