• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "include/core/SkColorSpace.h"
9 #include "include/core/SkImageInfo.h"
10 
11 #include "include/c/sk_colorspace.h"
12 #include "include/c/sk_imageinfo.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 
from_c_colortype(sk_colortype_t cCT,SkColorType * skCT)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 
to_c_colortype(SkColorType skCT,sk_colortype_t * cCT)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 
from_c_alphatype(sk_alphatype_t cAT,SkAlphaType * skAT)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 
to_c_alphatype(SkAlphaType skAT,sk_alphatype_t * cAT)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 
ToImageInfo(const sk_imageinfo_t * cinfo)84 const SkImageInfo* ToImageInfo(const sk_imageinfo_t* cinfo) {
85     return reinterpret_cast<const SkImageInfo*>(cinfo);
86 }
87 
88 /////////////////////////////////////////////////////////////////////////////////////////////
89 
sk_imageinfo_new(int w,int h,sk_colortype_t cct,sk_alphatype_t cat,sk_colorspace_t * ccs)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 
sk_imageinfo_delete(sk_imageinfo_t * cinfo)103 void sk_imageinfo_delete(sk_imageinfo_t* cinfo) {
104     delete ToImageInfo(cinfo);
105 }
106 
sk_imageinfo_get_width(const sk_imageinfo_t * cinfo)107 int32_t sk_imageinfo_get_width(const sk_imageinfo_t* cinfo) {
108     return ToImageInfo(cinfo)->width();
109 }
110 
sk_imageinfo_get_height(const sk_imageinfo_t * cinfo)111 int32_t sk_imageinfo_get_height(const sk_imageinfo_t* cinfo) {
112     return ToImageInfo(cinfo)->height();
113 }
114 
sk_imageinfo_get_colortype(const sk_imageinfo_t * cinfo)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 
sk_imageinfo_get_alphatype(const sk_imageinfo_t * cinfo)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 
sk_imageinfo_get_colorspace(const sk_imageinfo_t * cinfo)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 
sk_colorspace_new_srgb()132 sk_colorspace_t* sk_colorspace_new_srgb() {
133     return reinterpret_cast<sk_colorspace_t*>(SkColorSpace::MakeSRGB().release());
134 }
135 
sk_colorspace_ref(sk_colorspace_t * cs)136 void sk_colorspace_ref(sk_colorspace_t* cs) {
137     SkSafeRef(reinterpret_cast<SkColorSpace*>(cs));
138 }
139 
sk_colorspace_unref(sk_colorspace_t * cs)140 void sk_colorspace_unref(sk_colorspace_t* cs) {
141     SkSafeUnref(reinterpret_cast<SkColorSpace*>(cs));
142 }
143 
144