Merge changes If4debc15,I437a5d5f into 0.4.1

* changes:
  restore encode API compatibility
  restore decode API compatibility
This commit is contained in:
James Zern 2014-07-23 13:56:27 -07:00 committed by Gerrit Code Review
commit d713a69644
15 changed files with 101 additions and 33 deletions

4
README
View File

@ -152,8 +152,6 @@ Options:
default, photo, picture, default, photo, picture,
drawing, icon, text drawing, icon, text
-preset must come first, as it overwrites other parameters -preset must come first, as it overwrites other parameters
-z <int> ............... activates lossless preset with given
level in [0:fast, ..., 9:slowest]
-m <int> ............... compression method (0=fast, 6=slowest) -m <int> ............... compression method (0=fast, 6=slowest)
-segments <int> ........ number of segments to use (1..4) -segments <int> ........ number of segments to use (1..4)
@ -270,11 +268,9 @@ Use following options to convert into alternate image formats:
-nofilter .... disable in-loop filtering -nofilter .... disable in-loop filtering
-nodither .... disable dithering -nodither .... disable dithering
-dither <d> .. dithering strength (in 0..100) -dither <d> .. dithering strength (in 0..100)
-alpha_dither use alpha-plane dithering if needed
-mt .......... use multi-threading -mt .......... use multi-threading
-crop <x> <y> <w> <h> ... crop output with the given rectangle -crop <x> <y> <w> <h> ... crop output with the given rectangle
-scale <w> <h> .......... scale the output (*after* any cropping) -scale <w> <h> .......... scale the output (*after* any cropping)
-flip ........ flip the output vertically
-alpha ....... only save the alpha plane -alpha ....... only save the alpha plane
-incremental . use incremental decoding (useful for tests) -incremental . use incremental decoding (useful for tests)
-h ....... this help message -h ....... this help message

View File

@ -573,8 +573,10 @@ static void HelpLong(void) {
printf(" default, photo, picture,\n"); printf(" default, photo, picture,\n");
printf(" drawing, icon, text\n"); printf(" drawing, icon, text\n");
printf(" -preset must come first, as it overwrites other parameters\n"); printf(" -preset must come first, as it overwrites other parameters\n");
#if WEBP_ENCODER_ABI_VERSION > 0x0202
printf(" -z <int> ............... activates lossless preset with given\n" printf(" -z <int> ............... activates lossless preset with given\n"
" level in [0:fast, ..., 9:slowest]\n"); " level in [0:fast, ..., 9:slowest]\n");
#endif
printf("\n"); printf("\n");
printf(" -m <int> ............... compression method (0=fast, 6=slowest)\n"); printf(" -m <int> ............... compression method (0=fast, 6=slowest)\n");
printf(" -segments <int> ........ number of segments to use (1..4)\n"); printf(" -segments <int> ........ number of segments to use (1..4)\n");
@ -676,8 +678,10 @@ int main(int argc, const char *argv[]) {
uint32_t background_color = 0xffffffu; uint32_t background_color = 0xffffffu;
int crop = 0, crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0; int crop = 0, crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0;
int resize_w = 0, resize_h = 0; int resize_w = 0, resize_h = 0;
#if WEBP_ENCODER_ABI_VERSION > 0x0202
int lossless_preset = 6; int lossless_preset = 6;
int use_lossless_preset = -1; // -1=unset, 0=don't use, 1=use it int use_lossless_preset = -1; // -1=unset, 0=don't use, 1=use it
#endif
int show_progress = 0; int show_progress = 0;
int keep_metadata = 0; int keep_metadata = 0;
int metadata_written = 0; int metadata_written = 0;
@ -732,13 +736,17 @@ int main(int argc, const char *argv[]) {
picture.height = strtol(argv[++c], NULL, 0); picture.height = strtol(argv[++c], NULL, 0);
} else if (!strcmp(argv[c], "-m") && c < argc - 1) { } else if (!strcmp(argv[c], "-m") && c < argc - 1) {
config.method = strtol(argv[++c], NULL, 0); config.method = strtol(argv[++c], NULL, 0);
#if WEBP_ENCODER_ABI_VERSION > 0x0202
use_lossless_preset = 0; // disable -z option use_lossless_preset = 0; // disable -z option
#endif
} else if (!strcmp(argv[c], "-q") && c < argc - 1) { } else if (!strcmp(argv[c], "-q") && c < argc - 1) {
config.quality = (float)strtod(argv[++c], NULL); config.quality = (float)strtod(argv[++c], NULL);
#if WEBP_ENCODER_ABI_VERSION > 0x0202
use_lossless_preset = 0; // disable -z option use_lossless_preset = 0; // disable -z option
} else if (!strcmp(argv[c], "-z") && c < argc - 1) { } else if (!strcmp(argv[c], "-z") && c < argc - 1) {
lossless_preset = strtol(argv[++c], NULL, 0); lossless_preset = strtol(argv[++c], NULL, 0);
if (use_lossless_preset != 0) use_lossless_preset = 1; if (use_lossless_preset != 0) use_lossless_preset = 1;
#endif
} else if (!strcmp(argv[c], "-alpha_q") && c < argc - 1) { } else if (!strcmp(argv[c], "-alpha_q") && c < argc - 1) {
config.alpha_quality = strtol(argv[++c], NULL, 0); config.alpha_quality = strtol(argv[++c], NULL, 0);
} else if (!strcmp(argv[c], "-alpha_method") && c < argc - 1) { } else if (!strcmp(argv[c], "-alpha_method") && c < argc - 1) {
@ -919,12 +927,14 @@ int main(int argc, const char *argv[]) {
goto Error; goto Error;
} }
#if WEBP_ENCODER_ABI_VERSION > 0x0202
if (use_lossless_preset == 1) { if (use_lossless_preset == 1) {
if (!WebPConfigLosslessPreset(&config, lossless_preset)) { if (!WebPConfigLosslessPreset(&config, lossless_preset)) {
fprintf(stderr, "Invalid lossless preset (-z %d)\n", lossless_preset); fprintf(stderr, "Invalid lossless preset (-z %d)\n", lossless_preset);
goto Error; goto Error;
} }
} }
#endif
// Check for unsupported command line options for lossless mode and log // Check for unsupported command line options for lossless mode and log
// warning for such options. // warning for such options.
@ -1116,7 +1126,11 @@ int main(int argc, const char *argv[]) {
return_value = 0; return_value = 0;
Error: Error:
#if WEBP_ENCODER_ABI_VERSION > 0x0202
WebPMemoryWriterClear(&memory_writer); WebPMemoryWriterClear(&memory_writer);
#else
free(memory_writer.mem);
#endif
free(picture.extra_info); free(picture.extra_info);
MetadataFree(&metadata); MetadataFree(&metadata);
WebPPictureFree(&picture); WebPPictureFree(&picture);

View File

@ -557,11 +557,15 @@ static void Help(void) {
" -nofilter .... disable in-loop filtering\n" " -nofilter .... disable in-loop filtering\n"
" -nodither .... disable dithering\n" " -nodither .... disable dithering\n"
" -dither <d> .. dithering strength (in 0..100)\n" " -dither <d> .. dithering strength (in 0..100)\n"
#if WEBP_DECODER_ABI_VERSION > 0x0203
" -alpha_dither use alpha-plane dithering if needed\n" " -alpha_dither use alpha-plane dithering if needed\n"
#endif
" -mt .......... use multi-threading\n" " -mt .......... use multi-threading\n"
" -crop <x> <y> <w> <h> ... crop output with the given rectangle\n" " -crop <x> <y> <w> <h> ... crop output with the given rectangle\n"
" -scale <w> <h> .......... scale the output (*after* any cropping)\n" " -scale <w> <h> .......... scale the output (*after* any cropping)\n"
#if WEBP_DECODER_ABI_VERSION > 0x0203
" -flip ........ flip the output vertically\n" " -flip ........ flip the output vertically\n"
#endif
" -alpha ....... only save the alpha plane\n" " -alpha ....... only save the alpha plane\n"
" -incremental . use incremental decoding (useful for tests)\n" " -incremental . use incremental decoding (useful for tests)\n"
" -h ....... this help message\n" " -h ....... this help message\n"
@ -624,8 +628,10 @@ int main(int argc, const char *argv[]) {
format = YUV; format = YUV;
} else if (!strcmp(argv[c], "-mt")) { } else if (!strcmp(argv[c], "-mt")) {
config.options.use_threads = 1; config.options.use_threads = 1;
#if WEBP_DECODER_ABI_VERSION > 0x0203
} else if (!strcmp(argv[c], "-alpha_dither")) { } else if (!strcmp(argv[c], "-alpha_dither")) {
config.options.alpha_dithering_strength = 100; config.options.alpha_dithering_strength = 100;
#endif
} else if (!strcmp(argv[c], "-nodither")) { } else if (!strcmp(argv[c], "-nodither")) {
config.options.dithering_strength = 0; config.options.dithering_strength = 0;
} else if (!strcmp(argv[c], "-dither") && c < argc - 1) { } else if (!strcmp(argv[c], "-dither") && c < argc - 1) {
@ -640,8 +646,10 @@ int main(int argc, const char *argv[]) {
config.options.use_scaling = 1; config.options.use_scaling = 1;
config.options.scaled_width = strtol(argv[++c], NULL, 0); config.options.scaled_width = strtol(argv[++c], NULL, 0);
config.options.scaled_height = strtol(argv[++c], NULL, 0); config.options.scaled_height = strtol(argv[++c], NULL, 0);
#if WEBP_DECODER_ABI_VERSION > 0x0203
} else if (!strcmp(argv[c], "-flip")) { } else if (!strcmp(argv[c], "-flip")) {
config.options.flip = 1; config.options.flip = 1;
#endif
} else if (!strcmp(argv[c], "-v")) { } else if (!strcmp(argv[c], "-v")) {
verbose = 1; verbose = 1;
#ifndef WEBP_DLL #ifndef WEBP_DLL

View File

@ -475,10 +475,20 @@ static WebPEncodingError SetFrame(const WebPConfig* const config,
// TODO(later): Perhaps a rough SSIM/PSNR produced by the encoder should // TODO(later): Perhaps a rough SSIM/PSNR produced by the encoder should
// also be a criteria, in addition to sizes. // also be a criteria, in addition to sizes.
if (mem1.size <= mem2.size) { if (mem1.size <= mem2.size) {
#if WEBP_ENCODER_ABI_VERSION > 0x0202
WebPMemoryWriterClear(&mem2); WebPMemoryWriterClear(&mem2);
#else
free(mem2.mem);
memset(&mem2, 0, sizeof(mem2));
#endif
GetEncodedData(&mem1, encoded_data); GetEncodedData(&mem1, encoded_data);
} else { } else {
#if WEBP_ENCODER_ABI_VERSION > 0x0202
WebPMemoryWriterClear(&mem1); WebPMemoryWriterClear(&mem1);
#else
free(mem1.mem);
memset(&mem1, 0, sizeof(mem1));
#endif
GetEncodedData(&mem2, encoded_data); GetEncodedData(&mem2, encoded_data);
} }
} else { } else {
@ -487,8 +497,13 @@ static WebPEncodingError SetFrame(const WebPConfig* const config,
return error_code; return error_code;
Err: Err:
#if WEBP_ENCODER_ABI_VERSION > 0x0202
WebPMemoryWriterClear(&mem1); WebPMemoryWriterClear(&mem1);
WebPMemoryWriterClear(&mem2); WebPMemoryWriterClear(&mem2);
#else
free(mem1.mem);
free(mem2.mem);
#endif
return error_code; return error_code;
} }

View File

@ -400,7 +400,9 @@ int main(int argc, char *argv[]) {
return -1; return -1;
} }
config->options.dithering_strength = 50; config->options.dithering_strength = 50;
#if WEBP_DECODER_ABI_VERSION > 0x0203
config->options.alpha_dithering_strength = 100; config->options.alpha_dithering_strength = 100;
#endif
kParams.use_color_profile = 1; kParams.use_color_profile = 1;
for (c = 1; c < argc; ++c) { for (c = 1; c < argc; ++c) {
@ -413,8 +415,10 @@ int main(int argc, char *argv[]) {
config->options.no_fancy_upsampling = 1; config->options.no_fancy_upsampling = 1;
} else if (!strcmp(argv[c], "-nofilter")) { } else if (!strcmp(argv[c], "-nofilter")) {
config->options.bypass_filtering = 1; config->options.bypass_filtering = 1;
#if WEBP_DECODER_ABI_VERSION > 0x0203
} else if (!strcmp(argv[c], "-noalphadither")) { } else if (!strcmp(argv[c], "-noalphadither")) {
config->options.alpha_dithering_strength = 0; config->options.alpha_dithering_strength = 0;
#endif
} else if (!strcmp(argv[c], "-dither") && c + 1 < argc) { } else if (!strcmp(argv[c], "-dither") && c + 1 < argc) {
config->options.dithering_strength = strtol(argv[++c], NULL, 0); config->options.dithering_strength = strtol(argv[++c], NULL, 0);
} else if (!strcmp(argv[c], "-info")) { } else if (!strcmp(argv[c], "-info")) {

View File

@ -1,5 +1,5 @@
.\" Hey, EMACS: -*- nroff -*- .\" Hey, EMACS: -*- nroff -*-
.TH CWEBP 1 "April 19, 2014" .TH CWEBP 1 "July 22, 2014"
.SH NAME .SH NAME
cwebp \- compress an image file to a WebP file cwebp \- compress an image file to a WebP file
.SH SYNOPSIS .SH SYNOPSIS
@ -38,21 +38,22 @@ Print the version number (as major.minor.revision) and exit.
.BI \-q " float .BI \-q " float
Specify the compression factor for RGB channels between 0 and 100. The default Specify the compression factor for RGB channels between 0 and 100. The default
is 75. is 75.
.TP .\" TODO(jzern): restore post-v0.4.1
.BI \-z " int .\" .TP
Switch on \fBlossless\fP compression mode with the specified level between 0 .\" .BI \-z " int
and 9, with level 0 being the fastest, 9 being the slowest. Fast mode .\" Switch on \fBlossless\fP compression mode with the specified level between 0
produces larger file size than slower ones. A good default is \-z 6. .\" and 9, with level 0 being the fastest, 9 being the slowest. Fast mode
This option is actually a shortcut for some predefined settings for quality .\" produces larger file size than slower ones. A good default is \-z 6.
and method. If options \-q or \-m are subsequently used, they will invalidate .\" This option is actually a shortcut for some predefined settings for quality
the effect of this \-z option. .\" and method. If options \-q or \-m are subsequently used, they will invalidate
.br .\" the effect of this \-z option.
In case of lossy compression (default), a small factor produces a smaller file .\" .br
with lower quality. Best quality is achieved by using a value of 100. .\" In case of lossy compression (default), a small factor produces a smaller file
.br .\" with lower quality. Best quality is achieved by using a value of 100.
In case of lossless compression (specified by the \-lossless option), a small .\" .br
factor enables faster compression speed, but produces a larger file. Maximum .\" In case of lossless compression (specified by the \-lossless option), a small
compression is achieved by using a value of 100. .\" factor enables faster compression speed, but produces a larger file. Maximum
.\" compression is achieved by using a value of 100.
.TP .TP
.BI \-alpha_q " int .BI \-alpha_q " int
Specify the compression factor for alpha compression between 0 and 100. Specify the compression factor for alpha compression between 0 and 100.

View File

@ -1,5 +1,5 @@
.\" Hey, EMACS: -*- nroff -*- .\" Hey, EMACS: -*- nroff -*-
.TH DWEBP 1 "June 13, 2014" .TH DWEBP 1 "July 22, 2014"
.SH NAME .SH NAME
dwebp \- decompress a WebP file to an image file dwebp \- decompress a WebP file to an image file
.SH SYNOPSIS .SH SYNOPSIS
@ -67,11 +67,12 @@ but it will make the decoding faster.
Specify a dithering \fBstrength\fP between 0 and 100. Dithering is a Specify a dithering \fBstrength\fP between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy compression. post-processing effect applied to chroma components in lossy compression.
It helps by smoothing gradients and avoiding banding artifacts. It helps by smoothing gradients and avoiding banding artifacts.
.TP .\" TODO(jzern): restore post-v0.4.1
.BI \-alpha_dither .\" .TP
If the compressed file contains a transparency plane that was quantized .\" .BI \-alpha_dither
during compression, this flag will allow dithering the reconstructed plane .\" If the compressed file contains a transparency plane that was quantized
in order to generate smoother transparency gradients. .\" during compression, this flag will allow dithering the reconstructed plane
.\" in order to generate smoother transparency gradients.
.TP .TP
.B \-nodither .B \-nodither
Disable all dithering (default). Disable all dithering (default).
@ -86,9 +87,10 @@ This cropping area must be fully contained within the source rectangle.
The top-left corner will be snapped to even coordinates if needed. The top-left corner will be snapped to even coordinates if needed.
This option is meant to reduce the memory needed for cropping large images. This option is meant to reduce the memory needed for cropping large images.
Note: the cropping is applied \fIbefore\fP any scaling. Note: the cropping is applied \fIbefore\fP any scaling.
.TP .\" TODO(jzern): restore post-v0.4.1
.B \-flip .\" .TP
Flip decoded image vertically (can be useful for OpenGL textures for instance). .\" .B \-flip
.\" Flip decoded image vertically (can be useful for OpenGL textures for instance).
.TP .TP
.BI \-scale " width height .BI \-scale " width height
Rescale the decoded picture to dimension \fBwidth\fP x \fBheight\fP. This Rescale the decoded picture to dimension \fBwidth\fP x \fBheight\fP. This

View File

@ -195,10 +195,12 @@ VP8StatusCode WebPAllocateDecBuffer(int w, int h,
status = AllocateBuffer(out); status = AllocateBuffer(out);
if (status != VP8_STATUS_OK) return status; if (status != VP8_STATUS_OK) return status;
#if WEBP_DECODER_ABI_VERSION > 0x0203
// Use the stride trick if vertical flip is needed. // Use the stride trick if vertical flip is needed.
if (options != NULL && options->flip) { if (options != NULL && options->flip) {
status = WebPFlipBuffer(out); status = WebPFlipBuffer(out);
} }
#endif
return status; return status;
} }

View File

@ -177,6 +177,7 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
dec->dither_ = 1; dec->dither_ = 1;
} }
} }
#if WEBP_DECODER_ABI_VERSION > 0x0203
// potentially allow alpha dithering // potentially allow alpha dithering
dec->alpha_dithering_ = options->alpha_dithering_strength; dec->alpha_dithering_ = options->alpha_dithering_strength;
if (dec->alpha_dithering_ > 100) { if (dec->alpha_dithering_ > 100) {
@ -184,6 +185,7 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
} else if (dec->alpha_dithering_ < 0) { } else if (dec->alpha_dithering_ < 0) {
dec->alpha_dithering_ = 0; dec->alpha_dithering_ = 0;
} }
#endif
} }
} }

View File

@ -240,15 +240,17 @@ static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) {
// To be called last. // To be called last.
static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) { static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
#if WEBP_DECODER_ABI_VERSION > 0x0203
const WebPDecoderOptions* const options = idec->params_.options; const WebPDecoderOptions* const options = idec->params_.options;
WebPDecBuffer* const output = idec->params_.output; WebPDecBuffer* const output = idec->params_.output;
idec->state_ = STATE_DONE; idec->state_ = STATE_DONE;
if (options != NULL && options->flip) { if (options != NULL && options->flip) {
return WebPFlipBuffer(output); return WebPFlipBuffer(output);
} else {
return VP8_STATUS_OK;
} }
#endif
idec->state_ = STATE_DONE;
return VP8_STATUS_OK;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -521,9 +521,11 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
WebPFreeDecBuffer(params->output); WebPFreeDecBuffer(params->output);
} }
#if WEBP_DECODER_ABI_VERSION > 0x0203
if (params->options != NULL && params->options->flip) { if (params->options != NULL && params->options->flip) {
status = WebPFlipBuffer(params->output); status = WebPFlipBuffer(params->output);
} }
#endif
return status; return status;
} }

View File

@ -138,6 +138,7 @@ int WebPValidateConfig(const WebPConfig* config) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#if WEBP_ENCODER_ABI_VERSION > 0x0202
#define MAX_LEVEL 9 #define MAX_LEVEL 9
// Mapping between -z level and -m / -q parameter settings. // Mapping between -z level and -m / -q parameter settings.
@ -156,5 +157,6 @@ int WebPConfigLosslessPreset(WebPConfig* config, int level) {
config->quality = kLosslessPresets[level].quality_; config->quality = kLosslessPresets[level].quality_;
return 1; return 1;
} }
#endif
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -571,6 +571,10 @@ int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#if WEBP_ENCODER_ABI_VERSION <= 0x0202
void WebPMemoryWriterClear(WebPMemoryWriter* writer);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif

View File

@ -20,7 +20,7 @@
extern "C" { extern "C" {
#endif #endif
#define WEBP_DECODER_ABI_VERSION 0x0205 // MAJOR(8b) + MINOR(8b) #define WEBP_DECODER_ABI_VERSION 0x0203 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++, // Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference. // the types are left here for reference.
@ -442,13 +442,19 @@ struct WebPDecoderOptions {
int scaled_width, scaled_height; // final resolution int scaled_width, scaled_height; // final resolution
int use_threads; // if true, use multi-threaded decoding int use_threads; // if true, use multi-threaded decoding
int dithering_strength; // dithering strength (0=Off, 100=full) int dithering_strength; // dithering strength (0=Off, 100=full)
#if WEBP_DECODER_ABI_VERSION > 0x0203
int flip; // flip output vertically int flip; // flip output vertically
int alpha_dithering_strength; // alpha dithering strength in [0..100] int alpha_dithering_strength; // alpha dithering strength in [0..100]
#endif
// Unused for now: // Unused for now:
int force_rotation; // forced rotation (to be applied _last_) int force_rotation; // forced rotation (to be applied _last_)
int no_enhancement; // if true, discard enhancement layer int no_enhancement; // if true, discard enhancement layer
#if WEBP_DECODER_ABI_VERSION > 0x0203
uint32_t pad[3]; // padding for later use uint32_t pad[3]; // padding for later use
#else
uint32_t pad[5]; // padding for later use
#endif
}; };
// Main object storing the configuration for advanced decoding. // Main object storing the configuration for advanced decoding.

View File

@ -20,7 +20,7 @@
extern "C" { extern "C" {
#endif #endif
#define WEBP_ENCODER_ABI_VERSION 0x0205 // MAJOR(8b) + MINOR(8b) #define WEBP_ENCODER_ABI_VERSION 0x0202 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++, // Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference. // the types are left here for reference.
@ -167,6 +167,7 @@ static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
WEBP_ENCODER_ABI_VERSION); WEBP_ENCODER_ABI_VERSION);
} }
#if WEBP_ENCODER_ABI_VERSION > 0x0202
// Activate the lossless compression mode with the desired efficiency level // Activate the lossless compression mode with the desired efficiency level
// between 0 (fastest, lowest compression) and 9 (slower, best compression). // between 0 (fastest, lowest compression) and 9 (slower, best compression).
// A good default level is '6', providing a fair tradeoff between compression // A good default level is '6', providing a fair tradeoff between compression
@ -174,6 +175,7 @@ static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
// This function will overwrite several fields from config: 'method', 'quality' // This function will overwrite several fields from config: 'method', 'quality'
// and 'lossless'. Returns false in case of parameter error. // and 'lossless'. Returns false in case of parameter error.
WEBP_EXTERN(int) WebPConfigLosslessPreset(WebPConfig* config, int level); WEBP_EXTERN(int) WebPConfigLosslessPreset(WebPConfig* config, int level);
#endif
// Returns true if 'config' is non-NULL and all configuration parameters are // Returns true if 'config' is non-NULL and all configuration parameters are
// within their valid ranges. // within their valid ranges.
@ -229,12 +231,18 @@ struct WebPMemoryWriter {
// The following must be called first before any use. // The following must be called first before any use.
WEBP_EXTERN(void) WebPMemoryWriterInit(WebPMemoryWriter* writer); WEBP_EXTERN(void) WebPMemoryWriterInit(WebPMemoryWriter* writer);
#if WEBP_ENCODER_ABI_VERSION > 0x0202
// The following must be called to deallocate writer->mem memory. The 'writer' // The following must be called to deallocate writer->mem memory. The 'writer'
// object itself is not deallocated. // object itself is not deallocated.
WEBP_EXTERN(void) WebPMemoryWriterClear(WebPMemoryWriter* writer); WEBP_EXTERN(void) WebPMemoryWriterClear(WebPMemoryWriter* writer);
#endif
// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon // The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
// completion, writer.mem and writer.size will hold the coded data. // completion, writer.mem and writer.size will hold the coded data.
#if WEBP_ENCODER_ABI_VERSION > 0x0202
// writer.mem must be freed by calling WebPMemoryWriterClear. // writer.mem must be freed by calling WebPMemoryWriterClear.
#else
// writer.mem must be freed by calling 'free(writer.mem)'.
#endif
WEBP_EXTERN(int) WebPMemoryWrite(const uint8_t* data, size_t data_size, WEBP_EXTERN(int) WebPMemoryWrite(const uint8_t* data, size_t data_size,
const WebPPicture* picture); const WebPPicture* picture);