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
14const 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
27const 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
36static 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
48static 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
60static 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
72static 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
84const SkImageInfo* ToImageInfo(const sk_imageinfo_t* cinfo) {
85 return reinterpret_cast<const SkImageInfo*>(cinfo);
86}
87
88/////////////////////////////////////////////////////////////////////////////////////////////
89
90sk_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
103void sk_imageinfo_delete(sk_imageinfo_t* cinfo) {
104 delete ToImageInfo(cinfo);
105}
106
107int32_t sk_imageinfo_get_width(const sk_imageinfo_t* cinfo) {
108 return ToImageInfo(cinfo)->width();
109}
110
111int32_t sk_imageinfo_get_height(const sk_imageinfo_t* cinfo) {
112 return ToImageInfo(cinfo)->height();
113}
114
115sk_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
120sk_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
126sk_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
132sk_colorspace_t* sk_colorspace_new_srgb() {
133 return reinterpret_cast<sk_colorspace_t*>(SkColorSpace::MakeSRGB().release());
134}
135
136void sk_colorspace_ref(sk_colorspace_t* cs) {
137 SkSafeRef(reinterpret_cast<SkColorSpace*>(cs));
138}
139
140void sk_colorspace_unref(sk_colorspace_t* cs) {
141 SkSafeUnref(reinterpret_cast<SkColorSpace*>(cs));
142}
143
144