2 * Copyright 2014 Google Inc.
3 * Copyright 2015 Xamarin Inc.
4 * Copyright 2017 Microsoft Corporation. All rights reserved.
6 * Use of this source code is governed by a BSD-style license that can be
7 * found in the LICENSE file.
12 #include "SkColorPriv.h"
14 #include "SkImageInfo.h"
16 #include "SkUnPreMultiply.h"
18 #include "sk_bitmap.h"
20 #include "sk_types_priv.h"
22 static inline void copyAlpha8ToColor(size_t size, const uint8_t* pixels, sk_color_t* colors)
25 const uint8_t* addr = pixels++;
26 *colors++ = SkColorSetA(0, *addr);
30 static inline void copyIndex8ToColor(sk_bitmap_t* cbitmap, size_t size, const uint8_t* pixels, sk_color_t* colors)
32 SkBitmap* bmp = AsBitmap(cbitmap);
33 SkColorTable* ctable = bmp->getColorTable();
35 const uint8_t* addr = pixels++;
36 const SkPMColor c = (*ctable)[*addr];
37 *colors++ = SkUnPreMultiply::PMColorToColor(c);
41 static inline void copyGray8ToColor(size_t size, const uint8_t* pixels, sk_color_t* colors)
44 const uint8_t* addr = pixels++;
45 *colors++ = SkColorSetRGB(*addr, *addr, *addr);
49 static inline void copyRgb565ToColor(size_t size, const uint16_t* pixels, sk_color_t* colors)
52 const uint16_t* addr = pixels++;
53 *colors++ = SkPixel16ToColor(*addr);
56 static inline void copy8888ToColor(size_t size, const uint32_t* pixels, sk_color_t* colors)
59 const uint32_t* addr = pixels++;
60 *colors++ = SkUnPreMultiply::PMColorToColor(*addr);
64 static inline void copyAlpha8FromColor(size_t size, const sk_color_t* colors, uint8_t* pixels)
67 *pixels++ = SkColorGetA(*colors++);
71 static inline void copyGray8FromColor(size_t size, const sk_color_t* colors, uint8_t* pixels)
74 SkColor c = *colors++;
76 uint8_t r = SkColorGetR(c);
77 uint8_t g = SkColorGetG(c);
78 uint8_t b = SkColorGetB(c);
79 uint8_t a = SkColorGetA(c);
81 r = SkMulDiv255Round(r, a);
82 g = SkMulDiv255Round(g, a);
83 b = SkMulDiv255Round(b, a);
85 *pixels++ = SkComputeLuminance(r, g, b);
89 static inline void copyRgb565FromColor(size_t width, size_t height, const sk_color_t* colors, uint16_t* pixels)
91 for (size_t y = 0; y < height; y++) {
93 for (size_t x = 0; x < width; x++) {
94 SkColor c = *colors++;
95 *pixels++ = SkDitherRGBTo565(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), DITHER_VALUE(x));
99 static inline void copy8888FromColor(size_t size, const sk_color_t* colors, uint32_t* pixels)
101 while (size-- != 0) {
102 *pixels++ = SkPreMultiplyColor(*colors++);
107 void sk_bitmap_destructor(sk_bitmap_t* cbitmap)
109 delete AsBitmap(cbitmap);
112 sk_bitmap_t* sk_bitmap_new()
114 return (sk_bitmap_t*) new SkBitmap();
117 void sk_bitmap_get_info(sk_bitmap_t* cbitmap, sk_imageinfo_t* info)
119 from_sk(AsBitmap(cbitmap)->info(), info);
122 void* sk_bitmap_get_pixels(sk_bitmap_t* cbitmap, size_t* length)
124 SkBitmap* bmp = AsBitmap(cbitmap);
125 *length = bmp->getSize();
126 return bmp->getPixels();
129 size_t sk_bitmap_get_row_bytes(sk_bitmap_t* cbitmap)
131 return AsBitmap(cbitmap)->rowBytes();
134 size_t sk_bitmap_get_byte_count(sk_bitmap_t* cbitmap)
136 return AsBitmap(cbitmap)->getSize();
139 void sk_bitmap_reset(sk_bitmap_t* cbitmap)
141 AsBitmap(cbitmap)->reset();
144 bool sk_bitmap_is_null(sk_bitmap_t* cbitmap)
146 return AsBitmap(cbitmap)->isNull();
149 bool sk_bitmap_is_immutable(sk_bitmap_t* cbitmap)
151 return AsBitmap(cbitmap)->isImmutable();
154 void sk_bitmap_set_immutable(sk_bitmap_t* cbitmap)
156 AsBitmap(cbitmap)->setImmutable();
159 bool sk_bitmap_is_volatile(sk_bitmap_t* cbitmap)
161 return AsBitmap(cbitmap)->isVolatile();
164 void sk_bitmap_set_volatile(sk_bitmap_t* cbitmap, bool value)
166 AsBitmap(cbitmap)->setIsVolatile(value);
169 void sk_bitmap_erase(sk_bitmap_t* cbitmap, sk_color_t color)
171 AsBitmap(cbitmap)->eraseColor(color);
174 void sk_bitmap_erase_rect(sk_bitmap_t* cbitmap, sk_color_t color, sk_irect_t* rect)
176 AsBitmap(cbitmap)->erase(color, AsIRect(*rect));
179 uint8_t sk_bitmap_get_addr_8(sk_bitmap_t* cbitmap, int x, int y)
181 return *(AsBitmap(cbitmap)->getAddr8(x, y));
184 uint16_t sk_bitmap_get_addr_16(sk_bitmap_t* cbitmap, int x, int y)
186 return *(AsBitmap(cbitmap)->getAddr16(x, y));
189 uint32_t sk_bitmap_get_addr_32(sk_bitmap_t* cbitmap, int x, int y)
191 return *(AsBitmap(cbitmap)->getAddr32(x, y));
194 void* sk_bitmap_get_addr(sk_bitmap_t* cbitmap, int x, int y)
196 return AsBitmap(cbitmap)->getAddr(x, y);
199 sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y)
201 return AsBitmap(cbitmap)->getColor(x, y);
204 sk_pmcolor_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y)
206 return AsBitmap(cbitmap)->getIndex8Color(x, y);
209 void sk_bitmap_set_pixel_color(sk_bitmap_t* cbitmap, int x, int y, sk_color_t color)
211 SkBitmap* bmp = AsBitmap(cbitmap);
213 switch (bmp->colorType()) {
214 case kAlpha_8_SkColorType:
215 copyAlpha8FromColor(1, &color, (uint8_t*)bmp->getAddr8(x, y));
217 case kGray_8_SkColorType:
218 copyGray8FromColor(1, &color, (uint8_t*)bmp->getAddr8(x, y));
220 case kRGB_565_SkColorType:
221 copyRgb565FromColor(1, 1, &color, (uint16_t*)bmp->getAddr16(x, y));
223 case kBGRA_8888_SkColorType:
224 case kRGBA_8888_SkColorType:
225 copy8888FromColor(1, &color, (uint32_t*)bmp->getAddr32(x, y));
232 bool sk_bitmap_ready_to_draw(sk_bitmap_t* cbitmap)
234 return AsBitmap(cbitmap)->readyToDraw();
237 void sk_bitmap_get_pixel_colors(sk_bitmap_t* cbitmap, sk_color_t* colors)
239 SkBitmap* bmp = AsBitmap(cbitmap);
241 size_t size = bmp->height() * bmp->width();
242 const void* pixels = bmp->getPixels();
244 switch (bmp->colorType()) {
245 case kAlpha_8_SkColorType:
246 copyAlpha8ToColor(size, (const uint8_t*)pixels, colors);
248 case kIndex_8_SkColorType:
249 copyIndex8ToColor(cbitmap, size, (const uint8_t*)pixels, colors);
251 case kGray_8_SkColorType:
252 copyGray8ToColor(size, (const uint8_t*)pixels, colors);
254 case kRGB_565_SkColorType:
255 copyRgb565ToColor(size, (const uint16_t*)pixels, colors);
257 case kBGRA_8888_SkColorType:
258 case kRGBA_8888_SkColorType:
259 copy8888ToColor(size, (const uint32_t*)pixels, colors);
266 void sk_bitmap_set_pixel_colors(sk_bitmap_t* cbitmap, const sk_color_t* colors)
268 SkBitmap* bmp = AsBitmap(cbitmap);
270 size_t width = bmp->width();
271 size_t height = bmp->height();
272 size_t size = height * width;
273 void* pixels = bmp->getPixels();
275 switch (bmp->colorType()) {
276 case kAlpha_8_SkColorType:
277 copyAlpha8FromColor(size, colors, (uint8_t*)pixels);
279 case kGray_8_SkColorType:
280 copyGray8FromColor(size, colors, (uint8_t*)pixels);
282 case kRGB_565_SkColorType:
283 copyRgb565FromColor(width, height, colors, (uint16_t*)pixels);
285 case kBGRA_8888_SkColorType:
286 case kRGBA_8888_SkColorType:
287 copy8888FromColor(size, colors, (uint32_t*)pixels);
294 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)
296 SkBitmap* bmp = AsBitmap(cbitmap);
299 from_c(*cinfo, &info);
301 return bmp->installPixels(info, pixels, rowBytes, AsColorTable(ctable), releaseProc, context);
304 bool sk_bitmap_install_pixels_with_pixmap(sk_bitmap_t* cbitmap, const sk_pixmap_t* cpixmap)
306 SkBitmap* bmp = AsBitmap(cbitmap);
307 return bmp->installPixels(AsPixmap(*cpixmap));
310 SK_API bool sk_bitmap_install_mask_pixels(sk_bitmap_t* cbitmap, const sk_mask_t* cmask) {
311 SkBitmap* bmp = AsBitmap(cbitmap);
312 const SkMask* mask = AsMask(cmask);
313 return bmp->installMaskPixels(*mask);
316 bool sk_bitmap_try_alloc_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, size_t rowBytes)
318 SkBitmap* bmp = AsBitmap(cbitmap);
321 from_c(*requestedInfo, &info);
323 return bmp->tryAllocPixels(info, rowBytes);
326 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)
328 SkBitmap* bmp = AsBitmap(cbitmap);
331 from_c(*requestedInfo, &info);
333 return bmp->tryAllocPixels(info, sk_ref_sp(AsColorTable(ctable)), flags);
336 sk_colortable_t* sk_bitmap_get_colortable(sk_bitmap_t* cbitmap)
338 return ToColorTable(AsBitmap(cbitmap)->getColorTable());
341 void sk_bitmap_set_pixels(sk_bitmap_t* cbitmap, void* pixels, sk_colortable_t* ctable)
343 SkBitmap* bmp = AsBitmap(cbitmap);
344 bmp->setPixels(pixels, AsColorTable(ctable));
347 bool sk_bitmap_peek_pixels(sk_bitmap_t* cbitmap, sk_pixmap_t* cpixmap)
349 SkBitmap* bmp = AsBitmap(cbitmap);
350 return bmp->peekPixels(AsPixmap(cpixmap));
353 bool sk_bitmap_extract_subset(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, sk_irect_t* subset)
355 SkBitmap* bmp = AsBitmap(cbitmap);
356 SkBitmap* dst = AsBitmap(cdst);
357 return bmp->extractSubset(dst, AsIRect(*subset));
360 bool sk_bitmap_extract_alpha(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, const sk_paint_t* paint, sk_ipoint_t* offset)
362 SkBitmap* bmp = AsBitmap(cbitmap);
363 SkBitmap* dst = AsBitmap(cdst);
364 return bmp->extractAlpha(dst, AsPaint(paint), AsIPoint(offset));
367 void sk_bitmap_notify_pixels_changed(sk_bitmap_t* cbitmap)
369 AsBitmap(cbitmap)->notifyPixelsChanged();
372 void sk_bitmap_swap(sk_bitmap_t* cbitmap, sk_bitmap_t* cother)
374 AsBitmap(cbitmap)->swap(AsBitmap(*cother));