mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-25 13:18:22 +01:00
swig: add python (decode) support
similar to Java, simple interface only Change-Id: I8a3d344e5d89f73627e4e0cb2067512260d46fdd
This commit is contained in:
parent
7f5f42bb36
commit
f980faf417
17
swig/README
17
swig/README
@ -37,3 +37,20 @@ public class libwebp_jni_example {
|
|||||||
|
|
||||||
$ javac -cp libwebp.jar libwebp_jni_example.java
|
$ javac -cp libwebp.jar libwebp_jni_example.java
|
||||||
$ java -Djava.library.path=. -cp libwebp.jar:. libwebp_jni_example
|
$ java -Djava.library.path=. -cp libwebp.jar:. libwebp_jni_example
|
||||||
|
|
||||||
|
Python SWIG bindings:
|
||||||
|
---------------------
|
||||||
|
$ python setup.py build_ext
|
||||||
|
$ python setup.py install --prefix=pylocal
|
||||||
|
|
||||||
|
-------------------------------------- BEGIN PSEUDO EXAMPLE
|
||||||
|
import glob
|
||||||
|
import sys
|
||||||
|
sys.path.append(glob.glob('pylocal/lib/python*/site-packages')[0])
|
||||||
|
|
||||||
|
from com.google.webp import libwebp
|
||||||
|
print "libwebp decoder version: %x" % libwebp.WebPGetDecoderVersion()
|
||||||
|
|
||||||
|
print "libwebp attributes:"
|
||||||
|
for attr in dir(libwebp): print attr
|
||||||
|
-------------------------------------- END PSEUDO EXAMPLE
|
||||||
|
@ -8,15 +8,26 @@
|
|||||||
// libwebp swig interface definition
|
// libwebp swig interface definition
|
||||||
//
|
//
|
||||||
// Author: James Zern (jzern@google.com)
|
// Author: James Zern (jzern@google.com)
|
||||||
//
|
|
||||||
// For java bindings compile with:
|
/*
|
||||||
// $ mkdir -p java/com/google/webp
|
Java bindings:
|
||||||
// $ swig -ignoremissing -I../src \
|
$ mkdir -p java/com/google/webp
|
||||||
// -java \
|
$ swig -java \
|
||||||
// -package com.google.webp \
|
-package com.google.webp \
|
||||||
// -outdir java/com/google/webp \
|
-outdir java/com/google/webp \
|
||||||
// -o libwebp_java_wrap.c libwebp.i
|
-o libwebp_java_wrap.c libwebp.i
|
||||||
|
|
||||||
|
Python bindings:
|
||||||
|
$ swig -python \
|
||||||
|
-outdir . \
|
||||||
|
-o libwebp_python_wrap.c libwebp.i
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
%module(package="com.google.webp") libwebp
|
||||||
|
#else
|
||||||
%module libwebp
|
%module libwebp
|
||||||
|
#endif /* SWIGPYTHON */
|
||||||
|
|
||||||
%include "constraints.i"
|
%include "constraints.i"
|
||||||
%include "typemaps.i"
|
%include "typemaps.i"
|
||||||
@ -31,6 +42,14 @@
|
|||||||
%apply signed char[] { uint8_t* }
|
%apply signed char[] { uint8_t* }
|
||||||
#endif /* SWIGJAVA */
|
#endif /* SWIGJAVA */
|
||||||
|
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
%apply (char* STRING, size_t LENGTH) { (const uint8_t* data, size_t data_size) }
|
||||||
|
%typemap(out) uint8_t* {
|
||||||
|
$result = PyString_FromStringAndSize(
|
||||||
|
(const char*)$1, ReturnedBufferSize("$symname", arg3, arg4));
|
||||||
|
}
|
||||||
|
#endif /* SWIGPYTHON */
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Decoder specific
|
// Decoder specific
|
||||||
|
|
||||||
@ -76,14 +95,19 @@ int WebPGetEncoderVersion(void);
|
|||||||
#ifdef SWIGJAVA
|
#ifdef SWIGJAVA
|
||||||
%{
|
%{
|
||||||
#define FillMeInAsSizeCannotBeDeterminedAutomatically \
|
#define FillMeInAsSizeCannotBeDeterminedAutomatically \
|
||||||
(result ? ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0)
|
(result ? (jint)ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0)
|
||||||
|
%}
|
||||||
|
#endif /* SWIGJAVA */
|
||||||
|
|
||||||
static jint ReturnedBufferSize(
|
#if defined(SWIGJAVA) || defined(SWIGPYTHON)
|
||||||
|
%{
|
||||||
|
static size_t ReturnedBufferSize(
|
||||||
const char* function, int* width, int* height) {
|
const char* function, int* width, int* height) {
|
||||||
static const struct sizemap {
|
static const struct sizemap {
|
||||||
const char* function;
|
const char* function;
|
||||||
int size_multiplier;
|
int size_multiplier;
|
||||||
} size_map[] = {
|
} size_map[] = {
|
||||||
|
#ifdef SWIGJAVA
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 },
|
||||||
@ -97,12 +121,20 @@ static jint ReturnedBufferSize(
|
|||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 },
|
||||||
|
#endif
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
{ "WebPDecodeRGB", 3 },
|
||||||
|
{ "WebPDecodeRGBA", 4 },
|
||||||
|
{ "WebPDecodeARGB", 4 },
|
||||||
|
{ "WebPDecodeBGR", 3 },
|
||||||
|
{ "WebPDecodeBGRA", 4 },
|
||||||
|
#endif
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
const struct sizemap* p;
|
const struct sizemap* p;
|
||||||
jint size = -1;
|
size_t size = 0;
|
||||||
|
|
||||||
for (p = size_map; p->function; p++) {
|
for (p = size_map; p->function; ++p) {
|
||||||
if (!strcmp(function, p->function)) {
|
if (!strcmp(function, p->function)) {
|
||||||
size = *width * *height * p->size_multiplier;
|
size = *width * *height * p->size_multiplier;
|
||||||
break;
|
break;
|
||||||
@ -112,10 +144,9 @@ static jint ReturnedBufferSize(
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
#endif /* SWIGJAVA */
|
#endif /* SWIGJAVA || SWIGPYTHON */
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
|
||||||
typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb,
|
typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb,
|
||||||
int width, int height, int stride,
|
int width, int height, int stride,
|
||||||
float quality_factor, uint8_t** output);
|
float quality_factor, uint8_t** output);
|
||||||
|
136
swig/libwebp.py
Normal file
136
swig/libwebp.py
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
# This file was automatically generated by SWIG (http://www.swig.org).
|
||||||
|
# Version 2.0.4
|
||||||
|
#
|
||||||
|
# Do not make changes to this file unless you know what you are doing--modify
|
||||||
|
# the SWIG interface file instead.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from sys import version_info
|
||||||
|
if version_info >= (2,6,0):
|
||||||
|
def swig_import_helper():
|
||||||
|
from os.path import dirname
|
||||||
|
import imp
|
||||||
|
fp = None
|
||||||
|
try:
|
||||||
|
fp, pathname, description = imp.find_module('_libwebp', [dirname(__file__)])
|
||||||
|
except ImportError:
|
||||||
|
import _libwebp
|
||||||
|
return _libwebp
|
||||||
|
if fp is not None:
|
||||||
|
try:
|
||||||
|
_mod = imp.load_module('_libwebp', fp, pathname, description)
|
||||||
|
finally:
|
||||||
|
fp.close()
|
||||||
|
return _mod
|
||||||
|
_libwebp = swig_import_helper()
|
||||||
|
del swig_import_helper
|
||||||
|
else:
|
||||||
|
import _libwebp
|
||||||
|
del version_info
|
||||||
|
try:
|
||||||
|
_swig_property = property
|
||||||
|
except NameError:
|
||||||
|
pass # Python < 2.2 doesn't have 'property'.
|
||||||
|
def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
|
||||||
|
if (name == "thisown"): return self.this.own(value)
|
||||||
|
if (name == "this"):
|
||||||
|
if type(value).__name__ == 'SwigPyObject':
|
||||||
|
self.__dict__[name] = value
|
||||||
|
return
|
||||||
|
method = class_type.__swig_setmethods__.get(name,None)
|
||||||
|
if method: return method(self,value)
|
||||||
|
if (not static):
|
||||||
|
self.__dict__[name] = value
|
||||||
|
else:
|
||||||
|
raise AttributeError("You cannot add attributes to %s" % self)
|
||||||
|
|
||||||
|
def _swig_setattr(self,class_type,name,value):
|
||||||
|
return _swig_setattr_nondynamic(self,class_type,name,value,0)
|
||||||
|
|
||||||
|
def _swig_getattr(self,class_type,name):
|
||||||
|
if (name == "thisown"): return self.this.own()
|
||||||
|
method = class_type.__swig_getmethods__.get(name,None)
|
||||||
|
if method: return method(self)
|
||||||
|
raise AttributeError(name)
|
||||||
|
|
||||||
|
def _swig_repr(self):
|
||||||
|
try: strthis = "proxy of " + self.this.__repr__()
|
||||||
|
except: strthis = ""
|
||||||
|
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
|
||||||
|
|
||||||
|
try:
|
||||||
|
_object = object
|
||||||
|
_newclass = 1
|
||||||
|
except AttributeError:
|
||||||
|
class _object : pass
|
||||||
|
_newclass = 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def WebPGetDecoderVersion():
|
||||||
|
return _libwebp.WebPGetDecoderVersion()
|
||||||
|
WebPGetDecoderVersion = _libwebp.WebPGetDecoderVersion
|
||||||
|
|
||||||
|
def WebPGetInfo(*args):
|
||||||
|
return _libwebp.WebPGetInfo(*args)
|
||||||
|
WebPGetInfo = _libwebp.WebPGetInfo
|
||||||
|
|
||||||
|
def WebPDecodeRGB(*args):
|
||||||
|
return _libwebp.WebPDecodeRGB(*args)
|
||||||
|
WebPDecodeRGB = _libwebp.WebPDecodeRGB
|
||||||
|
|
||||||
|
def WebPDecodeRGBA(*args):
|
||||||
|
return _libwebp.WebPDecodeRGBA(*args)
|
||||||
|
WebPDecodeRGBA = _libwebp.WebPDecodeRGBA
|
||||||
|
|
||||||
|
def WebPDecodeARGB(*args):
|
||||||
|
return _libwebp.WebPDecodeARGB(*args)
|
||||||
|
WebPDecodeARGB = _libwebp.WebPDecodeARGB
|
||||||
|
|
||||||
|
def WebPDecodeBGR(*args):
|
||||||
|
return _libwebp.WebPDecodeBGR(*args)
|
||||||
|
WebPDecodeBGR = _libwebp.WebPDecodeBGR
|
||||||
|
|
||||||
|
def WebPDecodeBGRA(*args):
|
||||||
|
return _libwebp.WebPDecodeBGRA(*args)
|
||||||
|
WebPDecodeBGRA = _libwebp.WebPDecodeBGRA
|
||||||
|
|
||||||
|
def WebPGetEncoderVersion():
|
||||||
|
return _libwebp.WebPGetEncoderVersion()
|
||||||
|
WebPGetEncoderVersion = _libwebp.WebPGetEncoderVersion
|
||||||
|
|
||||||
|
def wrap_WebPEncodeRGB(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeRGB(*args)
|
||||||
|
wrap_WebPEncodeRGB = _libwebp.wrap_WebPEncodeRGB
|
||||||
|
|
||||||
|
def wrap_WebPEncodeBGR(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeBGR(*args)
|
||||||
|
wrap_WebPEncodeBGR = _libwebp.wrap_WebPEncodeBGR
|
||||||
|
|
||||||
|
def wrap_WebPEncodeRGBA(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeRGBA(*args)
|
||||||
|
wrap_WebPEncodeRGBA = _libwebp.wrap_WebPEncodeRGBA
|
||||||
|
|
||||||
|
def wrap_WebPEncodeBGRA(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeBGRA(*args)
|
||||||
|
wrap_WebPEncodeBGRA = _libwebp.wrap_WebPEncodeBGRA
|
||||||
|
|
||||||
|
def wrap_WebPEncodeLosslessRGB(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeLosslessRGB(*args)
|
||||||
|
wrap_WebPEncodeLosslessRGB = _libwebp.wrap_WebPEncodeLosslessRGB
|
||||||
|
|
||||||
|
def wrap_WebPEncodeLosslessBGR(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeLosslessBGR(*args)
|
||||||
|
wrap_WebPEncodeLosslessBGR = _libwebp.wrap_WebPEncodeLosslessBGR
|
||||||
|
|
||||||
|
def wrap_WebPEncodeLosslessRGBA(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeLosslessRGBA(*args)
|
||||||
|
wrap_WebPEncodeLosslessRGBA = _libwebp.wrap_WebPEncodeLosslessRGBA
|
||||||
|
|
||||||
|
def wrap_WebPEncodeLosslessBGRA(*args):
|
||||||
|
return _libwebp.wrap_WebPEncodeLosslessBGRA(*args)
|
||||||
|
wrap_WebPEncodeLosslessBGRA = _libwebp.wrap_WebPEncodeLosslessBGRA
|
||||||
|
# This file is compatible with both classic and new-style classes.
|
||||||
|
|
||||||
|
|
@ -813,14 +813,16 @@ jdoubleArray SWIG_JavaArrayOutDouble (JNIEnv *jenv, double *result, jsize sz) {
|
|||||||
|
|
||||||
|
|
||||||
#define FillMeInAsSizeCannotBeDeterminedAutomatically \
|
#define FillMeInAsSizeCannotBeDeterminedAutomatically \
|
||||||
(result ? ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0)
|
(result ? (jint)ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0)
|
||||||
|
|
||||||
static jint ReturnedBufferSize(
|
|
||||||
|
static size_t ReturnedBufferSize(
|
||||||
const char* function, int* width, int* height) {
|
const char* function, int* width, int* height) {
|
||||||
static const struct sizemap {
|
static const struct sizemap {
|
||||||
const char* function;
|
const char* function;
|
||||||
int size_multiplier;
|
int size_multiplier;
|
||||||
} size_map[] = {
|
} size_map[] = {
|
||||||
|
#ifdef SWIGJAVA
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 },
|
{ "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 },
|
||||||
@ -834,12 +836,20 @@ static jint ReturnedBufferSize(
|
|||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 },
|
||||||
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 },
|
{ "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 },
|
||||||
|
#endif
|
||||||
|
#ifdef SWIGPYTHON
|
||||||
|
{ "WebPDecodeRGB", 3 },
|
||||||
|
{ "WebPDecodeRGBA", 4 },
|
||||||
|
{ "WebPDecodeARGB", 4 },
|
||||||
|
{ "WebPDecodeBGR", 3 },
|
||||||
|
{ "WebPDecodeBGRA", 4 },
|
||||||
|
#endif
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
const struct sizemap* p;
|
const struct sizemap* p;
|
||||||
jint size = -1;
|
size_t size = 0;
|
||||||
|
|
||||||
for (p = size_map; p->function; p++) {
|
for (p = size_map; p->function; ++p) {
|
||||||
if (!strcmp(function, p->function)) {
|
if (!strcmp(function, p->function)) {
|
||||||
size = *width * *height * p->size_multiplier;
|
size = *width * *height * p->size_multiplier;
|
||||||
break;
|
break;
|
||||||
@ -850,7 +860,6 @@ static jint ReturnedBufferSize(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb,
|
typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb,
|
||||||
int width, int height, int stride,
|
int width, int height, int stride,
|
||||||
float quality_factor, uint8_t** output);
|
float quality_factor, uint8_t** output);
|
||||||
|
5257
swig/libwebp_python_wrap.c
Normal file
5257
swig/libwebp_python_wrap.c
Normal file
File diff suppressed because it is too large
Load Diff
40
swig/setup.py
Normal file
40
swig/setup.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
"""distutils script for libwebp python module."""
|
||||||
|
|
||||||
|
from distutils.core import setup
|
||||||
|
from distutils.extension import Extension
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
tmpdir = tempfile.mkdtemp()
|
||||||
|
package = "com.google.webp"
|
||||||
|
package_path = os.path.join(tmpdir, *package.split("."))
|
||||||
|
os.makedirs(package_path)
|
||||||
|
|
||||||
|
# Create __init_.py files along the package path.
|
||||||
|
initpy_path = tmpdir
|
||||||
|
for d in package.split("."):
|
||||||
|
initpy_path = os.path.join(initpy_path, d)
|
||||||
|
open(os.path.join(initpy_path, "__init__.py"), "w").close()
|
||||||
|
|
||||||
|
shutil.copy2("libwebp.py", package_path)
|
||||||
|
setup(name="libwebp",
|
||||||
|
version="0.0",
|
||||||
|
description="libwebp python wrapper",
|
||||||
|
long_description="Provides access to 'simple' libwebp decode interface",
|
||||||
|
license="BSD",
|
||||||
|
url="http://developers.google.com/speed/webp",
|
||||||
|
ext_package=package,
|
||||||
|
ext_modules=[Extension("_libwebp",
|
||||||
|
["libwebp_python_wrap.c"],
|
||||||
|
libraries=["webp"],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
package_dir={"": tmpdir},
|
||||||
|
packages=["com", "com.google", "com.google.webp"],
|
||||||
|
py_modules=[package + ".libwebp"],
|
||||||
|
)
|
||||||
|
|
||||||
|
shutil.rmtree(tmpdir)
|
Loading…
Reference in New Issue
Block a user