1*b2055c35SXin Li// Copyright 2011 Google Inc. 2*b2055c35SXin Li// 3*b2055c35SXin Li// Use of this source code is governed by a BSD-style license 4*b2055c35SXin Li// that can be found in the COPYING file in the root of the source 5*b2055c35SXin Li// tree. An additional intellectual property rights grant can be found 6*b2055c35SXin Li// in the file PATENTS. All contributing project authors may 7*b2055c35SXin Li// be found in the AUTHORS file in the root of the source tree. 8*b2055c35SXin Li// ----------------------------------------------------------------------------- 9*b2055c35SXin Li// 10*b2055c35SXin Li// libwebp swig interface definition 11*b2055c35SXin Li// 12*b2055c35SXin Li// Author: James Zern ([email protected]) 13*b2055c35SXin Li 14*b2055c35SXin Li/* 15*b2055c35SXin Li Go bindings: 16*b2055c35SXin Li $ swig -go \ 17*b2055c35SXin Li -outdir . \ 18*b2055c35SXin Li -o libwebp_go_wrap.c libwebp.swig 19*b2055c35SXin Li 20*b2055c35SXin Li Java bindings: 21*b2055c35SXin Li $ mkdir -p java/com/google/webp 22*b2055c35SXin Li $ swig -java \ 23*b2055c35SXin Li -package com.google.webp \ 24*b2055c35SXin Li -outdir java/com/google/webp \ 25*b2055c35SXin Li -o libwebp_java_wrap.c libwebp.swig 26*b2055c35SXin Li 27*b2055c35SXin Li Python bindings: 28*b2055c35SXin Li $ swig -python \ 29*b2055c35SXin Li -outdir . \ 30*b2055c35SXin Li -o libwebp_python_wrap.c libwebp.swig 31*b2055c35SXin Li*/ 32*b2055c35SXin Li 33*b2055c35SXin Li#ifdef SWIGPYTHON 34*b2055c35SXin Li%module(package="com.google.webp") libwebp 35*b2055c35SXin Li%begin %{ 36*b2055c35SXin Li#define SWIG_PYTHON_STRICT_BYTE_CHAR 37*b2055c35SXin Li%} 38*b2055c35SXin Li#else 39*b2055c35SXin Li%module libwebp 40*b2055c35SXin Li#endif /* SWIGPYTHON */ 41*b2055c35SXin Li 42*b2055c35SXin Li%include "constraints.i" 43*b2055c35SXin Li%include "typemaps.i" 44*b2055c35SXin Li 45*b2055c35SXin Li#ifdef SWIGGO 46*b2055c35SXin Li%apply (char* STRING, size_t LENGTH) { (const uint8_t* data, size_t data_size) } 47*b2055c35SXin Li 48*b2055c35SXin Li%rename(wrapped_WebPGetInfo) WebPGetInfo(const uint8_t* data, size_t data_size, 49*b2055c35SXin Li int* width, int* height); 50*b2055c35SXin Li#endif /* SWIGGO */ 51*b2055c35SXin Li 52*b2055c35SXin Li#ifdef SWIGJAVA 53*b2055c35SXin Li%include "arrays_java.i"; 54*b2055c35SXin Li%include "enums.swg" /*NB: requires JDK-1.5+ 55*b2055c35SXin Li See: http://www.swig.org/Doc1.3/Java.html#enumerations */ 56*b2055c35SXin Li 57*b2055c35SXin Li// map uint8_t* such that a byte[] is used 58*b2055c35SXin Li%{ 59*b2055c35SXin Li#include "webp/types.h" 60*b2055c35SXin Li%} 61*b2055c35SXin Li// from arrays_java.i (signed char) 62*b2055c35SXin LiJAVA_ARRAYS_DECL(uint8_t, jbyte, Byte, Uint8) 63*b2055c35SXin LiJAVA_ARRAYS_IMPL(uint8_t, jbyte, Byte, Uint8) 64*b2055c35SXin LiJAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B") 65*b2055c35SXin Li%apply uint8_t[] { uint8_t* } 66*b2055c35SXin Li#endif /* SWIGJAVA */ 67*b2055c35SXin Li 68*b2055c35SXin Li#ifdef SWIGPYTHON 69*b2055c35SXin Li%apply (char* STRING, size_t LENGTH) { (const uint8_t* data, size_t data_size) } 70*b2055c35SXin Li%typemap(out) uint8_t* { 71*b2055c35SXin Li $result = PyString_FromStringAndSize( 72*b2055c35SXin Li (const char*)$1, 73*b2055c35SXin Li ($1 == NULL) ? 0 : ReturnedBufferSize("$symname", arg3, arg4)); 74*b2055c35SXin Li} 75*b2055c35SXin Li 76*b2055c35SXin Li%typemap (in) const uint8_t* rgb (Py_buffer rgb_buffer) { 77*b2055c35SXin Li // NB: with Python < 2.6 the old style buffer protocol may be used: 78*b2055c35SXin Li // Py_ssize_t unused; 79*b2055c35SXin Li // PyObject_AsReadBuffer($input, (const void**)(&$1), &unused); 80*b2055c35SXin Li if (!PyObject_CheckBuffer($input)) { 81*b2055c35SXin Li SWIG_exception_fail(SWIG_TypeError, 82*b2055c35SXin Li "in method '$symname', argument $argnum" 83*b2055c35SXin Li " does not support the buffer interface"); 84*b2055c35SXin Li } 85*b2055c35SXin Li if (PyObject_GetBuffer($input, &rgb_buffer, PyBUF_SIMPLE)) { 86*b2055c35SXin Li SWIG_exception_fail(SWIG_RuntimeError, 87*b2055c35SXin Li "in method '$symname', unable to get buffer view"); 88*b2055c35SXin Li } 89*b2055c35SXin Li $1 = ($1_ltype)rgb_buffer.buf; 90*b2055c35SXin Li} 91*b2055c35SXin Li 92*b2055c35SXin Li%typemap(freearg) const uint8_t* rgb { 93*b2055c35SXin Li PyBuffer_Release(&rgb_buffer$argnum); 94*b2055c35SXin Li} 95*b2055c35SXin Li 96*b2055c35SXin Li%define DECODE_AUTODOC(func) 97*b2055c35SXin Li%feature("autodoc", #func "(uint8_t data) -> (rgb, width, height)") func; 98*b2055c35SXin Li%enddef 99*b2055c35SXin Li 100*b2055c35SXin Li%feature("autodoc", "1"); 101*b2055c35SXin LiDECODE_AUTODOC(WebPDecodeRGB); 102*b2055c35SXin LiDECODE_AUTODOC(WebPDecodeRGBA); 103*b2055c35SXin LiDECODE_AUTODOC(WebPDecodeARGB); 104*b2055c35SXin LiDECODE_AUTODOC(WebPDecodeBGR); 105*b2055c35SXin LiDECODE_AUTODOC(WebPDecodeBGRA); 106*b2055c35SXin Li%feature("autodoc", "WebPGetInfo(uint8_t data) -> (width, height)") WebPGetInfo; 107*b2055c35SXin Li#endif /* SWIGPYTHON */ 108*b2055c35SXin Li 109*b2055c35SXin Li//------------------------------------------------------------------------------ 110*b2055c35SXin Li// Decoder specific 111*b2055c35SXin Li 112*b2055c35SXin Li%apply int* OUTPUT { int* width, int* height } 113*b2055c35SXin Li 114*b2055c35SXin Liint WebPGetDecoderVersion(void); 115*b2055c35SXin Liint WebPGetInfo(const uint8_t* data, size_t data_size, 116*b2055c35SXin Li int* width, int* height); 117*b2055c35SXin Li 118*b2055c35SXin Li#if defined(SWIGJAVA) || defined(SWIGPYTHON) 119*b2055c35SXin Li 120*b2055c35SXin Li// free the buffer returned by these functions after copying into 121*b2055c35SXin Li// the native type 122*b2055c35SXin Li%newobject WebPDecodeRGB; 123*b2055c35SXin Li%newobject WebPDecodeRGBA; 124*b2055c35SXin Li%newobject WebPDecodeARGB; 125*b2055c35SXin Li%newobject WebPDecodeBGR; 126*b2055c35SXin Li%newobject WebPDecodeBGRA; 127*b2055c35SXin Li%typemap(newfree) uint8_t* "free($1);" 128*b2055c35SXin Li 129*b2055c35SXin Liuint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, 130*b2055c35SXin Li int* width, int* height); 131*b2055c35SXin Liuint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, 132*b2055c35SXin Li int* width, int* height); 133*b2055c35SXin Liuint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, 134*b2055c35SXin Li int* width, int* height); 135*b2055c35SXin Liuint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, 136*b2055c35SXin Li int* width, int* height); 137*b2055c35SXin Liuint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, 138*b2055c35SXin Li int* width, int* height); 139*b2055c35SXin Li 140*b2055c35SXin Li#endif /* SWIGJAVA || SWIGPYTHON */ 141*b2055c35SXin Li 142*b2055c35SXin Li//------------------------------------------------------------------------------ 143*b2055c35SXin Li// Encoder specific 144*b2055c35SXin Li 145*b2055c35SXin Li#if defined(SWIGJAVA) || defined(SWIGPYTHON) 146*b2055c35SXin Li 147*b2055c35SXin Liint WebPGetEncoderVersion(void); 148*b2055c35SXin Li 149*b2055c35SXin Li#endif /* SWIGJAVA || SWIGPYTHON */ 150*b2055c35SXin Li 151*b2055c35SXin Li//------------------------------------------------------------------------------ 152*b2055c35SXin Li// Wrapper code additions 153*b2055c35SXin Li 154*b2055c35SXin Li%{ 155*b2055c35SXin Li#include "webp/decode.h" 156*b2055c35SXin Li#include "webp/encode.h" 157*b2055c35SXin Li%} 158*b2055c35SXin Li 159*b2055c35SXin Li#ifdef SWIGJAVA 160*b2055c35SXin Li%{ 161*b2055c35SXin Li#define FillMeInAsSizeCannotBeDeterminedAutomatically \ 162*b2055c35SXin Li (result ? (jint)ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0) 163*b2055c35SXin Li%} 164*b2055c35SXin Li#endif /* SWIGJAVA */ 165*b2055c35SXin Li 166*b2055c35SXin Li#if defined(SWIGJAVA) || defined(SWIGPYTHON) 167*b2055c35SXin Li%{ 168*b2055c35SXin Listatic size_t ReturnedBufferSize( 169*b2055c35SXin Li const char* function, int* width, int* height) { 170*b2055c35SXin Li static const struct sizemap { 171*b2055c35SXin Li const char* function; 172*b2055c35SXin Li int size_multiplier; 173*b2055c35SXin Li } size_map[] = { 174*b2055c35SXin Li#ifdef SWIGJAVA 175*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 }, 176*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 }, 177*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 }, 178*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_WebPDecodeBGR", 3 }, 179*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_WebPDecodeBGRA", 4 }, 180*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGB", 1 }, 181*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGR", 1 }, 182*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGBA", 1 }, 183*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGRA", 1 }, 184*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGB", 1 }, 185*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 }, 186*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 }, 187*b2055c35SXin Li { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 }, 188*b2055c35SXin Li#endif 189*b2055c35SXin Li#ifdef SWIGPYTHON 190*b2055c35SXin Li { "WebPDecodeRGB", 3 }, 191*b2055c35SXin Li { "WebPDecodeRGBA", 4 }, 192*b2055c35SXin Li { "WebPDecodeARGB", 4 }, 193*b2055c35SXin Li { "WebPDecodeBGR", 3 }, 194*b2055c35SXin Li { "WebPDecodeBGRA", 4 }, 195*b2055c35SXin Li { "wrap_WebPEncodeRGB", 1 }, 196*b2055c35SXin Li { "wrap_WebPEncodeBGR", 1 }, 197*b2055c35SXin Li { "wrap_WebPEncodeRGBA", 1 }, 198*b2055c35SXin Li { "wrap_WebPEncodeBGRA", 1 }, 199*b2055c35SXin Li { "wrap_WebPEncodeLosslessRGB", 1 }, 200*b2055c35SXin Li { "wrap_WebPEncodeLosslessBGR", 1 }, 201*b2055c35SXin Li { "wrap_WebPEncodeLosslessRGBA", 1 }, 202*b2055c35SXin Li { "wrap_WebPEncodeLosslessBGRA", 1 }, 203*b2055c35SXin Li#endif 204*b2055c35SXin Li { NULL, 0 } 205*b2055c35SXin Li }; 206*b2055c35SXin Li const struct sizemap* p; 207*b2055c35SXin Li size_t size = 0; 208*b2055c35SXin Li 209*b2055c35SXin Li for (p = size_map; p->function; ++p) { 210*b2055c35SXin Li if (!strcmp(function, p->function)) { 211*b2055c35SXin Li size = *width * *height * p->size_multiplier; 212*b2055c35SXin Li break; 213*b2055c35SXin Li } 214*b2055c35SXin Li } 215*b2055c35SXin Li 216*b2055c35SXin Li return size; 217*b2055c35SXin Li} 218*b2055c35SXin Li%} 219*b2055c35SXin Li 220*b2055c35SXin Li%{ 221*b2055c35SXin Litypedef size_t (*WebPEncodeFunction)(const uint8_t* rgb, 222*b2055c35SXin Li int width, int height, int stride, 223*b2055c35SXin Li float quality_factor, uint8_t** output); 224*b2055c35SXin Litypedef size_t (*WebPEncodeLosslessFunction)(const uint8_t* rgb, 225*b2055c35SXin Li int width, int height, int stride, 226*b2055c35SXin Li uint8_t** output); 227*b2055c35SXin Li 228*b2055c35SXin Listatic uint8_t* EncodeLossy(const uint8_t* rgb, 229*b2055c35SXin Li int width, int height, int stride, 230*b2055c35SXin Li float quality_factor, 231*b2055c35SXin Li WebPEncodeFunction encfn, 232*b2055c35SXin Li int* output_size, int* unused) { 233*b2055c35SXin Li uint8_t* output = NULL; 234*b2055c35SXin Li const size_t image_size = 235*b2055c35SXin Li encfn(rgb, width, height, stride, quality_factor, &output); 236*b2055c35SXin Li // the values of following two will be interpreted by ReturnedBufferSize() 237*b2055c35SXin Li // as 'width' and 'height' in the size calculation. 238*b2055c35SXin Li *output_size = image_size; 239*b2055c35SXin Li *unused = 1; 240*b2055c35SXin Li return image_size ? output : NULL; 241*b2055c35SXin Li} 242*b2055c35SXin Li 243*b2055c35SXin Listatic uint8_t* EncodeLossless(const uint8_t* rgb, 244*b2055c35SXin Li int width, int height, int stride, 245*b2055c35SXin Li WebPEncodeLosslessFunction encfn, 246*b2055c35SXin Li int* output_size, int* unused) { 247*b2055c35SXin Li uint8_t* output = NULL; 248*b2055c35SXin Li const size_t image_size = encfn(rgb, width, height, stride, &output); 249*b2055c35SXin Li // the values of the following two will be interpreted by 250*b2055c35SXin Li // ReturnedBufferSize() as 'width' and 'height' in the size calculation. 251*b2055c35SXin Li *output_size = image_size; 252*b2055c35SXin Li *unused = 1; 253*b2055c35SXin Li return image_size ? output : NULL; 254*b2055c35SXin Li} 255*b2055c35SXin Li%} 256*b2055c35SXin Li 257*b2055c35SXin Li#endif /* SWIGJAVA || SWIGPYTHON */ 258*b2055c35SXin Li 259*b2055c35SXin Li//------------------------------------------------------------------------------ 260*b2055c35SXin Li// libwebp/encode wrapper functions 261*b2055c35SXin Li 262*b2055c35SXin Li#if defined(SWIGJAVA) || defined(SWIGPYTHON) 263*b2055c35SXin Li 264*b2055c35SXin Li%apply int* INPUT { int* unused1, int* unused2 } 265*b2055c35SXin Li%apply int* OUTPUT { int* output_size } 266*b2055c35SXin Li 267*b2055c35SXin Li// free the buffer returned by these functions after copying into 268*b2055c35SXin Li// the native type 269*b2055c35SXin Li%newobject wrap_WebPEncodeRGB; 270*b2055c35SXin Li%newobject wrap_WebPEncodeBGR; 271*b2055c35SXin Li%newobject wrap_WebPEncodeRGBA; 272*b2055c35SXin Li%newobject wrap_WebPEncodeBGRA; 273*b2055c35SXin Li%newobject wrap_WebPEncodeLosslessRGB; 274*b2055c35SXin Li%newobject wrap_WebPEncodeLosslessBGR; 275*b2055c35SXin Li%newobject wrap_WebPEncodeLosslessRGBA; 276*b2055c35SXin Li%newobject wrap_WebPEncodeLosslessBGRA; 277*b2055c35SXin Li 278*b2055c35SXin Li#ifdef SWIGJAVA 279*b2055c35SXin Li// There's no reason to call these directly 280*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeRGB "private"; 281*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeBGR "private"; 282*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeRGBA "private"; 283*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeBGRA "private"; 284*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeLosslessRGB "private"; 285*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeLosslessBGR "private"; 286*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeLosslessRGBA "private"; 287*b2055c35SXin Li%javamethodmodifiers wrap_WebPEncodeLosslessBGRA "private"; 288*b2055c35SXin Li#endif /* SWIGJAVA */ 289*b2055c35SXin Li 290*b2055c35SXin Li#ifdef SWIGPYTHON 291*b2055c35SXin Li// This autodoc will serve as a catch-all for wrap_*. 292*b2055c35SXin Li%feature("autodoc", "private, do not call directly."); 293*b2055c35SXin Li#endif 294*b2055c35SXin Li 295*b2055c35SXin Li%inline %{ 296*b2055c35SXin Li// Changes the return type of WebPEncode* to more closely match Decode*. 297*b2055c35SXin Li// This also makes it easier to wrap the output buffer in a native type rather 298*b2055c35SXin Li// than dealing with the return pointer. 299*b2055c35SXin Li// The additional parameters are to allow reuse of ReturnedBufferSize(), 300*b2055c35SXin Li// unused2 and output_size will be used in this case. 301*b2055c35SXin Li#define LOSSY_WRAPPER(FUNC) \ 302*b2055c35SXin Li static uint8_t* wrap_##FUNC( \ 303*b2055c35SXin Li const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ 304*b2055c35SXin Li int width, int height, int stride, float quality_factor) { \ 305*b2055c35SXin Li return EncodeLossy(rgb, width, height, stride, quality_factor, \ 306*b2055c35SXin Li FUNC, output_size, unused2); \ 307*b2055c35SXin Li } \ 308*b2055c35SXin Li 309*b2055c35SXin LiLOSSY_WRAPPER(WebPEncodeRGB) 310*b2055c35SXin LiLOSSY_WRAPPER(WebPEncodeBGR) 311*b2055c35SXin LiLOSSY_WRAPPER(WebPEncodeRGBA) 312*b2055c35SXin LiLOSSY_WRAPPER(WebPEncodeBGRA) 313*b2055c35SXin Li 314*b2055c35SXin Li#undef LOSSY_WRAPPER 315*b2055c35SXin Li 316*b2055c35SXin Li#define LOSSLESS_WRAPPER(FUNC) \ 317*b2055c35SXin Li static uint8_t* wrap_##FUNC( \ 318*b2055c35SXin Li const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ 319*b2055c35SXin Li int width, int height, int stride) { \ 320*b2055c35SXin Li return EncodeLossless(rgb, width, height, stride, \ 321*b2055c35SXin Li FUNC, output_size, unused2); \ 322*b2055c35SXin Li } \ 323*b2055c35SXin Li 324*b2055c35SXin LiLOSSLESS_WRAPPER(WebPEncodeLosslessRGB) 325*b2055c35SXin LiLOSSLESS_WRAPPER(WebPEncodeLosslessBGR) 326*b2055c35SXin LiLOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) 327*b2055c35SXin LiLOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) 328*b2055c35SXin Li 329*b2055c35SXin Li#undef LOSSLESS_WRAPPER 330*b2055c35SXin Li 331*b2055c35SXin Li%} 332*b2055c35SXin Li 333*b2055c35SXin Li#endif /* SWIGJAVA || SWIGPYTHON */ 334*b2055c35SXin Li 335*b2055c35SXin Li//------------------------------------------------------------------------------ 336*b2055c35SXin Li// Language specific 337*b2055c35SXin Li 338*b2055c35SXin Li#ifdef SWIGGO 339*b2055c35SXin Li%insert(go_wrapper) %{ 340*b2055c35SXin Li 341*b2055c35SXin Li// WebPGetInfo has 2 output parameters, provide a version in the more natural 342*b2055c35SXin Li// go idiom: 343*b2055c35SXin Lifunc WebPGetInfo(webp []byte) (ok bool, width int, height int) { 344*b2055c35SXin Li w := []int{0} 345*b2055c35SXin Li h := []int{0} 346*b2055c35SXin Li ok = Wrapped_WebPGetInfo(string(webp), w, h) != 0 347*b2055c35SXin Li width = w[0] 348*b2055c35SXin Li height = h[0] 349*b2055c35SXin Li return 350*b2055c35SXin Li} 351*b2055c35SXin Li 352*b2055c35SXin Li%} 353*b2055c35SXin Li#endif /* SWIGGO */ 354*b2055c35SXin Li 355*b2055c35SXin Li#ifdef SWIGJAVA 356*b2055c35SXin Li%{ 357*b2055c35SXin Li/* Work around broken gcj jni.h */ 358*b2055c35SXin Li#ifdef __GCJ_JNI_H__ 359*b2055c35SXin Li# undef JNIEXPORT 360*b2055c35SXin Li# define JNIEXPORT 361*b2055c35SXin Li# undef JNICALL 362*b2055c35SXin Li# define JNICALL 363*b2055c35SXin Li#endif 364*b2055c35SXin Li%} 365*b2055c35SXin Li 366*b2055c35SXin Li%pragma(java) modulecode=%{ 367*b2055c35SXin Li private static final int UNUSED = 1; 368*b2055c35SXin Li private static int outputSize[] = { 0 }; 369*b2055c35SXin Li%} 370*b2055c35SXin Li 371*b2055c35SXin Li 372*b2055c35SXin Li%define CALL_ENCODE_LOSSY_WRAPPER(func) 373*b2055c35SXin Li%pragma(java) modulecode=%{ 374*b2055c35SXin Li public static byte[] func( 375*b2055c35SXin Li byte[] rgb, int width, int height, int stride, float quality_factor) { 376*b2055c35SXin Li return wrap_##func( 377*b2055c35SXin Li rgb, UNUSED, UNUSED, outputSize, width, height, stride, quality_factor); 378*b2055c35SXin Li } 379*b2055c35SXin Li%} 380*b2055c35SXin Li%enddef 381*b2055c35SXin Li 382*b2055c35SXin Li%define CALL_ENCODE_LOSSLESS_WRAPPER(func) 383*b2055c35SXin Li%pragma(java) modulecode=%{ 384*b2055c35SXin Li public static byte[] func( 385*b2055c35SXin Li byte[] rgb, int width, int height, int stride) { 386*b2055c35SXin Li return wrap_##func( 387*b2055c35SXin Li rgb, UNUSED, UNUSED, outputSize, width, height, stride); 388*b2055c35SXin Li } 389*b2055c35SXin Li%} 390*b2055c35SXin Li%enddef 391*b2055c35SXin Li 392*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGB) 393*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGBA) 394*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGR) 395*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGRA) 396*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) 397*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) 398*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) 399*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) 400*b2055c35SXin Li#endif /* SWIGJAVA */ 401*b2055c35SXin Li 402*b2055c35SXin Li#ifdef SWIGPYTHON 403*b2055c35SXin Li%pythoncode %{ 404*b2055c35SXin Li_UNUSED = 1 405*b2055c35SXin Li%} 406*b2055c35SXin Li 407*b2055c35SXin Li%define CALL_ENCODE_LOSSY_WRAPPER(func) 408*b2055c35SXin Li%pythoncode %{ 409*b2055c35SXin Lidef func(rgb, width, height, stride, quality_factor): 410*b2055c35SXin Li """func(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" 411*b2055c35SXin Li webp = wrap_##func( 412*b2055c35SXin Li rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) 413*b2055c35SXin Li if len(webp[0]) == 0: 414*b2055c35SXin Li return None 415*b2055c35SXin Li return webp[0] 416*b2055c35SXin Li%} 417*b2055c35SXin Li%enddef 418*b2055c35SXin Li 419*b2055c35SXin Li%define CALL_ENCODE_LOSSLESS_WRAPPER(func) 420*b2055c35SXin Li%pythoncode %{ 421*b2055c35SXin Lidef func(rgb, width, height, stride): 422*b2055c35SXin Li """func(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" 423*b2055c35SXin Li webp = wrap_##func(rgb, _UNUSED, _UNUSED, width, height, stride) 424*b2055c35SXin Li if len(webp[0]) == 0: 425*b2055c35SXin Li return None 426*b2055c35SXin Li return webp[0] 427*b2055c35SXin Li%} 428*b2055c35SXin Li%enddef 429*b2055c35SXin Li 430*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGB) 431*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGBA) 432*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGR) 433*b2055c35SXin LiCALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGRA) 434*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) 435*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) 436*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) 437*b2055c35SXin LiCALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) 438*b2055c35SXin Li#endif /* SWIGPYTHON */ 439