2 * Copyright 2016 Xamarin Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkColorPriv.h"
12 #include "SkImageInfo.h"
14 #include "SkUnPreMultiply.h"
16 #include "sk_bitmap.h"
18 #include "sk_types_priv.h"
20 static inline void copyAlpha8ToColor(size_t size, const uint8_t* pixels, sk_color_t* colors)
23 const uint8_t* addr = pixels++;
24 *colors++ = SkColorSetA(0, *addr);
28 static inline void copyIndex8ToColor(sk_bitmap_t* cbitmap, size_t size, const uint8_t* pixels, sk_color_t* colors)
30 SkBitmap* bmp = AsBitmap(cbitmap);
31 SkColorTable* ctable = bmp->getColorTable();
33 const uint8_t* addr = pixels++;
34 const SkPMColor c = (*ctable)[*addr];
35 *colors++ = SkUnPreMultiply::PMColorToColor(c);
39 static inline void copyGray8ToColor(size_t size, const uint8_t* pixels, sk_color_t* colors)
42 const uint8_t* addr = pixels++;
43 *colors++ = SkColorSetRGB(*addr, *addr, *addr);
47 static inline void copyRgb565ToColor(size_t size, const uint16_t* pixels, sk_color_t* colors)
50 const uint16_t* addr = pixels++;
51 *colors++ = SkPixel16ToColor(*addr);
54 static inline void copy8888ToColor(size_t size, const uint32_t* pixels, sk_color_t* colors)
57 const uint32_t* addr = pixels++;
58 *colors++ = SkUnPreMultiply::PMColorToColor(*addr);
62 static inline void copyAlpha8FromColor(size_t size, const sk_color_t* colors, uint8_t* pixels)
65 *pixels++ = SkColorGetA(*colors++);
69 static inline void copyGray8FromColor(size_t size, const sk_color_t* colors, uint8_t* pixels)
72 SkColor c = *colors++;
74 uint8_t r = SkColorGetR(c);
75 uint8_t g = SkColorGetG(c);
76 uint8_t b = SkColorGetB(c);
77 uint8_t a = SkColorGetA(c);
79 r = SkMulDiv255Round(r, a);
80 g = SkMulDiv255Round(g, a);
81 b = SkMulDiv255Round(b, a);
83 *pixels++ = SkComputeLuminance(r, g, b);
87 static inline void copyRgb565FromColor(size_t width, size_t height, const sk_color_t* colors, uint16_t* pixels)
89 for (size_t y = 0; y < height; y++) {
91 for (size_t x = 0; x < width; x++) {
92 SkColor c = *colors++;
93 *pixels++ = SkDitherRGBTo565(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), DITHER_VALUE(x));
97 static inline void copy8888FromColor(size_t size, const sk_color_t* colors, uint32_t* pixels)
100 *pixels++ = SkPreMultiplyColor(*colors++);
105 void sk_bitmap_destructor(sk_bitmap_t* cbitmap)
107 delete AsBitmap(cbitmap);
110 sk_bitmap_t* sk_bitmap_new()
112 return (sk_bitmap_t*) new SkBitmap();
115 void sk_bitmap_get_info(sk_bitmap_t* cbitmap, sk_imageinfo_t* info)
117 from_sk(AsBitmap(cbitmap)->info(), info);
120 void* sk_bitmap_get_pixels(sk_bitmap_t* cbitmap, size_t* length)
122 SkBitmap* bmp = AsBitmap(cbitmap);
123 *length = bmp->getSize();
124 return bmp->getPixels();
127 size_t sk_bitmap_get_row_bytes(sk_bitmap_t* cbitmap)
129 return AsBitmap(cbitmap)->rowBytes();
132 size_t sk_bitmap_get_byte_count(sk_bitmap_t* cbitmap)
134 return AsBitmap(cbitmap)->getSize();
137 void sk_bitmap_reset(sk_bitmap_t* cbitmap)
139 AsBitmap(cbitmap)->reset();
142 bool sk_bitmap_is_null(sk_bitmap_t* cbitmap)
144 return AsBitmap(cbitmap)->isNull();
147 bool sk_bitmap_is_immutable(sk_bitmap_t* cbitmap)
149 return AsBitmap(cbitmap)->isImmutable();
152 void sk_bitmap_set_immutable(sk_bitmap_t* cbitmap)
154 AsBitmap(cbitmap)->setImmutable();
157 bool sk_bitmap_is_volatile(sk_bitmap_t* cbitmap)
159 return AsBitmap(cbitmap)->isVolatile();
162 void sk_bitmap_set_volatile(sk_bitmap_t* cbitmap, bool value)
164 AsBitmap(cbitmap)->setIsVolatile(value);
167 void sk_bitmap_erase(sk_bitmap_t* cbitmap, sk_color_t color)
169 AsBitmap(cbitmap)->eraseColor(color);
172 void sk_bitmap_erase_rect(sk_bitmap_t* cbitmap, sk_color_t color, sk_irect_t* rect)
174 AsBitmap(cbitmap)->erase(color, AsIRect(*rect));
177 uint8_t sk_bitmap_get_addr_8(sk_bitmap_t* cbitmap, int x, int y)
179 return *(AsBitmap(cbitmap)->getAddr8(x, y));
182 uint16_t sk_bitmap_get_addr_16(sk_bitmap_t* cbitmap, int x, int y)
184 return *(AsBitmap(cbitmap)->getAddr16(x, y));
187 uint32_t sk_bitmap_get_addr_32(sk_bitmap_t* cbitmap, int x, int y)
189 return *(AsBitmap(cbitmap)->getAddr32(x, y));
192 void* sk_bitmap_get_addr(sk_bitmap_t* cbitmap, int x, int y)
194 return AsBitmap(cbitmap)->getAddr(x, y);
197 sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y)
199 return AsBitmap(cbitmap)->getColor(x, y);
202 sk_pmcolor_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y)
204 return AsBitmap(cbitmap)->getIndex8Color(x, y);
207 void sk_bitmap_set_pixel_color(sk_bitmap_t* cbitmap, int x, int y, sk_color_t color)
209 SkBitmap* bmp = AsBitmap(cbitmap);
211 switch (bmp->colorType()) {
212 case kAlpha_8_SkColorType:
213 copyAlpha8FromColor(1, &color, (uint8_t*)bmp->getAddr8(x, y));
215 case kGray_8_SkColorType:
216 copyGray8FromColor(1, &color, (uint8_t*)bmp->getAddr8(x, y));
218 case kRGB_565_SkColorType:
219 copyRgb565FromColor(1, 1, &color, (uint16_t*)bmp->getAddr16(x, y));
221 case kBGRA_8888_SkColorType:
222 case kRGBA_8888_SkColorType:
223 copy8888FromColor(1, &color, (uint32_t*)bmp->getAddr32(x, y));
230 bool sk_bitmap_ready_to_draw(sk_bitmap_t* cbitmap)
232 return AsBitmap(cbitmap)->readyToDraw();
235 void sk_bitmap_get_pixel_colors(sk_bitmap_t* cbitmap, sk_color_t* colors)
237 SkBitmap* bmp = AsBitmap(cbitmap);
239 size_t size = bmp->height() * bmp->width();
240 const void* pixels = bmp->getPixels();
242 switch (bmp->colorType()) {
243 case kAlpha_8_SkColorType:
244 copyAlpha8ToColor(size, (const uint8_t*)pixels, colors);
246 case kIndex_8_SkColorType:
247 copyIndex8ToColor(cbitmap, size, (const uint8_t*)pixels, colors);
249 case kGray_8_SkColorType:
250 copyGray8ToColor(size, (const uint8_t*)pixels, colors);
252 case kRGB_565_SkColorType:
253 copyRgb565ToColor(size, (const uint16_t*)pixels, colors);
255 case kBGRA_8888_SkColorType:
256 case kRGBA_8888_SkColorType:
257 copy8888ToColor(size, (const uint32_t*)pixels, colors);
264 void sk_bitmap_set_pixel_colors(sk_bitmap_t* cbitmap, const sk_color_t* colors)
266 SkBitmap* bmp = AsBitmap(cbitmap);
268 size_t width = bmp->width();
269 size_t height = bmp->height();
270 size_t size = height * width;
271 void* pixels = bmp->getPixels();
273 switch (bmp->colorType()) {
274 case kAlpha_8_SkColorType:
275 copyAlpha8FromColor(size, colors, (uint8_t*)pixels);
277 case kGray_8_SkColorType:
278 copyGray8FromColor(size, colors, (uint8_t*)pixels);
280 case kRGB_565_SkColorType:
281 copyRgb565FromColor(width, height, colors, (uint16_t*)pixels);
283 case kBGRA_8888_SkColorType:
284 case kRGBA_8888_SkColorType:
285 copy8888FromColor(size, colors, (uint32_t*)pixels);
292 bool sk_bitmap_install_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, sk_colortable_t* ctable, const sk_bitmap_release_proc releaseProc, void* context)
294 SkBitmap* bmp = AsBitmap(cbitmap);
297 from_c(*cinfo, &info);
299 return bmp->installPixels(info, pixels, rowBytes, AsColorTable(ctable), releaseProc, context);
302 bool sk_bitmap_install_pixels_with_pixmap(sk_bitmap_t* cbitmap, const sk_pixmap_t* cpixmap)
304 SkBitmap* bmp = AsBitmap(cbitmap);
305 return bmp->installPixels(AsPixmap(*cpixmap));
308 SK_API bool sk_bitmap_install_mask_pixels(sk_bitmap_t* cbitmap, const sk_mask_t* cmask) {
309 SkBitmap* bmp = AsBitmap(cbitmap);
310 const SkMask* mask = AsMask(cmask);
311 return bmp->installMaskPixels(*mask);
314 bool sk_bitmap_try_alloc_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, size_t rowBytes)
316 SkBitmap* bmp = AsBitmap(cbitmap);
319 from_c(*requestedInfo, &info);
321 return bmp->tryAllocPixels(info, rowBytes);
324 bool sk_bitmap_try_alloc_pixels_with_color_table(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, sk_colortable_t* ctable, uint32_t flags)
326 SkBitmap* bmp = AsBitmap(cbitmap);
329 from_c(*requestedInfo, &info);
331 return bmp->tryAllocPixels(info, sk_ref_sp(AsColorTable(ctable)), flags);
334 sk_colortable_t* sk_bitmap_get_colortable(sk_bitmap_t* cbitmap)
336 return ToColorTable(AsBitmap(cbitmap)->getColorTable());
339 void sk_bitmap_set_pixels(sk_bitmap_t* cbitmap, void* pixels, sk_colortable_t* ctable)
341 SkBitmap* bmp = AsBitmap(cbitmap);
342 bmp->setPixels(pixels, AsColorTable(ctable));
345 bool sk_bitmap_peek_pixels(sk_bitmap_t* cbitmap, sk_pixmap_t* cpixmap)
347 SkBitmap* bmp = AsBitmap(cbitmap);
348 return bmp->peekPixels(AsPixmap(cpixmap));
351 bool sk_bitmap_extract_subset(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, sk_irect_t* subset)
353 SkBitmap* bmp = AsBitmap(cbitmap);
354 SkBitmap* dst = AsBitmap(cdst);
355 return bmp->extractSubset(dst, AsIRect(*subset));
358 bool sk_bitmap_extract_alpha(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, const sk_paint_t* paint, sk_ipoint_t* offset)
360 SkBitmap* bmp = AsBitmap(cbitmap);
361 SkBitmap* dst = AsBitmap(cdst);
362 return bmp->extractAlpha(dst, AsPaint(paint), AsIPoint(offset));
365 void sk_bitmap_notify_pixels_changed(sk_bitmap_t* cbitmap)
367 AsBitmap(cbitmap)->notifyPixelsChanged();
370 void sk_bitmap_swap(sk_bitmap_t* cbitmap, sk_bitmap_t* cother)
372 AsBitmap(cbitmap)->swap(AsBitmap(*cother));