Added C API for SkCodec scanline decoding
authorMatthew Leibowitz <mattleibow@live.com>
Mon, 6 Feb 2017 11:16:38 +0000 (05:16 -0600)
committerMatthew Leibowitz <mattleibow@live.com>
Mon, 6 Feb 2017 11:16:38 +0000 (05:16 -0600)
include/c/sk_codec.h
include/c/sk_types.h
src/c/sk_codec.cpp
src/c/sk_enums.cpp

index 5245ef5..290a6f5 100644 (file)
@@ -31,6 +31,12 @@ SK_C_API sk_codec_result_t sk_codec_get_pixels(sk_codec_t* codec, const sk_image
 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_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 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);
+SK_C_API int sk_codec_next_scanline(sk_codec_t* codec);
+SK_C_API int sk_codec_output_scanline(sk_codec_t* codec, int inputScanline);
 SK_C_API int sk_codec_get_frame_count(sk_codec_t* codec);
 SK_C_API void sk_codec_get_frame_info(sk_codec_t* codec, sk_codec_frameinfo_t* frameInfo);
 SK_C_API int sk_codec_get_repetition_count(sk_codec_t* codec);
index c51194e..db43f1e 100644 (file)
@@ -468,6 +468,11 @@ typedef struct {
     bool fHasPriorFrame;
 } sk_codec_options_t;
 
+typedef enum {
+    TOP_DOWN_SK_CODEC_SCANLINE_ORDER,
+    BOTTOM_UP_SK_CODEC_SCANLINE_ORDER,
+} sk_codec_scanline_order_t;
+
 // The verbs that can be foudn on a path
 typedef enum {
     MOVE_SK_PATH_VERB,
index e4d9a1e..6e49d6f 100644 (file)
@@ -87,6 +87,38 @@ 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)
+{
+    SkImageInfo info;
+    from_c(*cinfo, &info);
+    return (sk_codec_result_t)AsCodec(codec)->startScanlineDecode(info, AsCodecOptions(coptions), ctable, ctableCount);
+}
+
+int sk_codec_get_scanlines(sk_codec_t* codec, void* dst, int countLines, size_t rowBytes)
+{
+    return AsCodec(codec)->getScanlines(dst, countLines, rowBytes);
+}
+
+bool sk_codec_skip_scanlines(sk_codec_t* codec, int countLines)
+{
+    return AsCodec(codec)->skipScanlines(countLines);
+}
+
+sk_codec_scanline_order_t sk_codec_get_scanline_order(sk_codec_t* codec)
+{
+    return (sk_codec_scanline_order_t)AsCodec(codec)->getScanlineOrder();
+}
+
+int sk_codec_next_scanline(sk_codec_t* codec)
+{
+    return AsCodec(codec)->nextScanline();
+}
+
+int sk_codec_output_scanline(sk_codec_t* codec, int inputScanline)
+{
+    return AsCodec(codec)->outputScanline(inputScanline);
+}
+
 int sk_codec_get_frame_count(sk_codec_t* codec) {
     return AsCodec(codec)->getFrameInfo().size();
 }
index 8baac76..42059e5 100644 (file)
@@ -242,6 +242,10 @@ static_assert ((int)SkCodec::Result::kUnimplemented       == (int)UNIMPLEMENTED_
 static_assert ((int)SkCodec::ZeroInitialized::kYes_ZeroInitialized   == (int)YES_SK_CODEC_ZERO_INITIALIZED,   ASSERT_MSG(SkCodec::ZeroInitialized, sk_codec_zero_initialized_t));
 static_assert ((int)SkCodec::ZeroInitialized::kNo_ZeroInitialized    == (int)NO_SK_CODEC_ZERO_INITIALIZED,    ASSERT_MSG(SkCodec::ZeroInitialized, sk_codec_zero_initialized_t));
 
+// sk_codec_scanline_order_t
+static_assert ((int)SkCodec::SkScanlineOrder::kTopDown_SkScanlineOrder    == (int)TOP_DOWN_SK_CODEC_SCANLINE_ORDER,    ASSERT_MSG(SkCodec::SkScanlineOrder, sk_codec_scanline_order_t));
+static_assert ((int)SkCodec::SkScanlineOrder::kBottomUp_SkScanlineOrder   == (int)BOTTOM_UP_SK_CODEC_SCANLINE_ORDER,   ASSERT_MSG(SkCodec::SkScanlineOrder, sk_codec_scanline_order_t));
+
 // sk_path_effect_1d_style_t
 static_assert ((int)SkPath1DPathEffect::Style::kTranslate_Style   == (int)TRANSLATE_SK_PATH_EFFECT_1D_STYLE,   ASSERT_MSG(SkPath1DPathEffect::Style, sk_path_effect_1d_style_t));
 static_assert ((int)SkPath1DPathEffect::Style::kRotate_Style      == (int)ROTATE_SK_PATH_EFFECT_1D_STYLE,      ASSERT_MSG(SkPath1DPathEffect::Style, sk_path_effect_1d_style_t));