Differentiate between unpremultiplied color and premultiplied color
authorMatthew Leibowitz <mattleibow@live.com>
Thu, 2 Mar 2017 04:03:02 +0000 (06:03 +0200)
committerMatthew Leibowitz <mattleibow@live.com>
Thu, 2 Mar 2017 04:03:02 +0000 (06:03 +0200)
include/c/sk_bitmap.h
include/c/sk_codec.h
include/c/sk_colortable.h
include/c/sk_pixmap.h
include/c/sk_types.h
src/c/sk_bitmap.cpp
src/c/sk_codec.cpp
src/c/sk_colortable.cpp
src/c/sk_pixmap.cpp

index 45ff463..26ef39f 100644 (file)
@@ -34,7 +34,7 @@ SK_C_API uint16_t sk_bitmap_get_addr_16(sk_bitmap_t* cbitmap, int x, int y);
 SK_C_API uint32_t sk_bitmap_get_addr_32(sk_bitmap_t* cbitmap, int x, int y);
 SK_C_API void* sk_bitmap_get_addr(sk_bitmap_t* cbitmap, int x, int y);
 SK_C_API sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y);
-SK_C_API sk_color_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y);
+SK_C_API sk_pmcolor_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y);
 SK_C_API void sk_bitmap_set_pixel_color(sk_bitmap_t* cbitmap, int x, int y, sk_color_t color);
 SK_C_API bool sk_bitmap_ready_to_draw(sk_bitmap_t* cbitmap);
 SK_C_API bool sk_bitmap_copy_pixels_to(sk_bitmap_t* cbitmap, void* const dst, size_t dstSize, size_t dstRowBytes, bool preserveDstPad);
index 290a6f5..28ac2d1 100644 (file)
@@ -27,11 +27,11 @@ SK_C_API sk_codec_origin_t sk_codec_get_origin(sk_codec_t* codec);
 SK_C_API void sk_codec_get_scaled_dimensions(sk_codec_t* codec, float desiredScale, sk_isize_t* dimensions);
 SK_C_API bool sk_codec_get_valid_subset(sk_codec_t* codec, sk_irect_t* desiredSubset);
 SK_C_API sk_encoded_format_t sk_codec_get_encoded_format(sk_codec_t* codec);
-SK_C_API sk_codec_result_t sk_codec_get_pixels(sk_codec_t* codec, const sk_imageinfo_t* info, void* pixels, size_t rowBytes, const sk_codec_options_t* options, sk_color_t ctable[], int* ctableCount);
+SK_C_API sk_codec_result_t sk_codec_get_pixels(sk_codec_t* codec, const sk_imageinfo_t* info, void* pixels, size_t rowBytes, const sk_codec_options_t* options, sk_pmcolor_t ctable[], int* ctableCount);
 SK_C_API sk_codec_result_t sk_codec_get_pixels_using_defaults(sk_codec_t* codec, const sk_imageinfo_t* info, void* pixels, size_t rowBytes);
-SK_C_API sk_codec_result_t sk_codec_start_incremental_decode(sk_codec_t* codec, const sk_imageinfo_t* info, void* pixels, size_t rowBytes, const sk_codec_options_t* options, sk_color_t ctable[], int* ctableCount);
+SK_C_API sk_codec_result_t sk_codec_start_incremental_decode(sk_codec_t* codec, const sk_imageinfo_t* info, void* pixels, size_t rowBytes, const sk_codec_options_t* options, sk_pmcolor_t ctable[], int* ctableCount);
 SK_C_API sk_codec_result_t sk_codec_incremental_decode(sk_codec_t* codec, int* rowsDecoded);
-SK_C_API sk_codec_result_t sk_codec_start_scanline_decode(sk_codec_t* codec, const sk_imageinfo_t* info, const sk_codec_options_t* options, sk_color_t ctable[], int* ctableCount);
+SK_C_API sk_codec_result_t sk_codec_start_scanline_decode(sk_codec_t* codec, const sk_imageinfo_t* info, const sk_codec_options_t* options, sk_pmcolor_t ctable[], int* ctableCount);
 SK_C_API int sk_codec_get_scanlines(sk_codec_t* codec, void* dst, int countLines, size_t rowBytes);
 SK_C_API bool sk_codec_skip_scanlines(sk_codec_t* codec, int countLines);
 SK_C_API sk_codec_scanline_order_t sk_codec_get_scanline_order(sk_codec_t* codec);
index f573308..3b69a67 100644 (file)
@@ -16,9 +16,9 @@
 SK_C_PLUS_PLUS_BEGIN_GUARD
 
 SK_C_API void sk_colortable_unref(sk_colortable_t* ctable);
-SK_C_API sk_colortable_t* sk_colortable_new(const sk_color_t* colors, int count);
+SK_C_API sk_colortable_t* sk_colortable_new(const sk_pmcolor_t* colors, int count);
 SK_C_API int sk_colortable_count(const sk_colortable_t* ctable);
-SK_C_API void sk_colortable_read_colors(const sk_colortable_t* ctable, sk_color_t** colors);
+SK_C_API void sk_colortable_read_colors(const sk_colortable_t* ctable, sk_pmcolor_t** colors);
 
 SK_C_PLUS_PLUS_END_GUARD
 
index 59fcb13..4cf7216 100644 (file)
@@ -27,6 +27,11 @@ SK_C_API sk_colortable_t* sk_pixmap_get_colortable(sk_pixmap_t* cpixmap);
 
 SK_C_API bool sk_bitmapscaler_resize(const sk_pixmap_t* dst, const sk_pixmap_t* src, sk_bitmapscaler_resizemethod_t method);
 
+SK_C_API sk_color_t sk_color_unpremultiply(const sk_pmcolor_t pmcolor);
+SK_C_API sk_pmcolor_t sk_color_premultiply(const sk_color_t color);
+SK_C_API void sk_color_unpremultiply_array(const sk_pmcolor_t* pmcolors, int size, sk_color_t* colors);
+SK_C_API void sk_color_premultiply_array(const sk_color_t* colors, int size, sk_pmcolor_t* pmcolors);
+
 SK_C_PLUS_PLUS_END_GUARD
 
 #endif
index 44feeee..840a98a 100644 (file)
@@ -44,6 +44,7 @@
 SK_C_PLUS_PLUS_BEGIN_GUARD
 
 typedef uint32_t sk_color_t;
+typedef uint32_t sk_pmcolor_t;
 
 /* This macro assumes all arguments are >=0 and <=255. */
 #define sk_color_set_argb(a, r, g, b)   (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
index 12a1741..10f300a 100644 (file)
@@ -199,7 +199,7 @@ sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y)
     return AsBitmap(cbitmap)->getColor(x, y);
 }
 
-sk_color_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y)
+sk_pmcolor_t sk_bitmap_get_index8_color(sk_bitmap_t* cbitmap, int x, int y)
 {
     return AsBitmap(cbitmap)->getIndex8Color(x, y);
 }
index 6e49d6f..c01dbb5 100644 (file)
@@ -61,7 +61,7 @@ sk_encoded_format_t sk_codec_get_encoded_format(sk_codec_t* codec)
     return (sk_encoded_format_t)AsCodec(codec)->getEncodedFormat();
 }
 
-sk_codec_result_t sk_codec_get_pixels(sk_codec_t* codec, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_codec_options_t* coptions, sk_color_t ctable[], int* ctableCount)
+sk_codec_result_t sk_codec_get_pixels(sk_codec_t* codec, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_codec_options_t* coptions, sk_pmcolor_t ctable[], int* ctableCount)
 {
     SkImageInfo info;
     from_c(*cinfo, &info);
@@ -75,7 +75,7 @@ sk_codec_result_t sk_codec_get_pixels_using_defaults(sk_codec_t* codec, const sk
     return (sk_codec_result_t)AsCodec(codec)->getPixels(info, pixels, rowBytes);
 }
 
-sk_codec_result_t sk_codec_start_incremental_decode(sk_codec_t* codec, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_codec_options_t* coptions, sk_color_t ctable[], int* ctableCount)
+sk_codec_result_t sk_codec_start_incremental_decode(sk_codec_t* codec, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_codec_options_t* coptions, sk_pmcolor_t ctable[], int* ctableCount)
 {
     SkImageInfo info;
     from_c(*cinfo, &info);
@@ -87,7 +87,7 @@ sk_codec_result_t sk_codec_incremental_decode(sk_codec_t* codec, int* rowsDecode
     return (sk_codec_result_t)AsCodec(codec)->incrementalDecode(rowsDecoded);
 }
 
-sk_codec_result_t sk_codec_start_scanline_decode(sk_codec_t* codec, const sk_imageinfo_t* cinfo, const sk_codec_options_t* coptions, sk_color_t ctable[], int* ctableCount)
+sk_codec_result_t sk_codec_start_scanline_decode(sk_codec_t* codec, const sk_imageinfo_t* cinfo, const sk_codec_options_t* coptions, sk_pmcolor_t ctable[], int* ctableCount)
 {
     SkImageInfo info;
     from_c(*cinfo, &info);
index 738216e..e302464 100644 (file)
@@ -15,7 +15,7 @@ void sk_colortable_unref(sk_colortable_t* ctable) {
     SkSafeUnref(AsColorTable(ctable));
 }
 
-sk_colortable_t* sk_colortable_new(const sk_color_t* colors, int count) {
+sk_colortable_t* sk_colortable_new(const sk_pmcolor_t* colors, int count) {
     return ToColorTable(new SkColorTable(colors, count));
 }
 
@@ -23,6 +23,6 @@ int sk_colortable_count(const sk_colortable_t* ctable) {
     return AsColorTable(ctable)->count();
 }
 
-void sk_colortable_read_colors(const sk_colortable_t* ctable, sk_color_t** colors) {
+void sk_colortable_read_colors(const sk_colortable_t* ctable, sk_pmcolor_t** colors) {
     *colors = (SkColor*) AsColorTable(ctable)->readColors();
 }
index 8a94b4f..fbe1ce0 100644 (file)
@@ -70,3 +70,27 @@ bool sk_bitmapscaler_resize(const sk_pixmap_t* cdst, const sk_pixmap_t* csrc, sk
     const SkPixmap& src = AsPixmap(*csrc);
     return SkBitmapScaler::Resize(dst, src, (SkBitmapScaler::ResizeMethod)method);
 }
+
+sk_color_t sk_color_unpremultiply(const sk_pmcolor_t pmcolor)
+{
+    return SkUnPreMultiply::PMColorToColor(pmcolor);
+}
+
+sk_pmcolor_t sk_color_premultiply(const sk_color_t color)
+{
+    return SkPreMultiplyColor(color);
+}
+
+void sk_color_unpremultiply_array(const sk_pmcolor_t* pmcolors, int size, sk_color_t* colors)
+{
+    for (int i = 0; i < size; ++i) {
+        colors[i] = SkUnPreMultiply::PMColorToColor(pmcolors[i]);
+    }
+}
+
+void sk_color_premultiply_array(const sk_color_t* colors, int size, sk_pmcolor_t* pmcolors)
+{
+    for (int i = 0; i < size; ++i) {
+        pmcolors[i] = SkPreMultiplyColor(colors[i]);
+    }
+}