• 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