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