summaryrefslogtreecommitdiffstats
path: root/libdimension-python
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension-python')
-rw-r--r--libdimension-python/dimension.pxd2
-rw-r--r--libdimension-python/dimension.pyx44
2 files changed, 39 insertions, 7 deletions
diff --git a/libdimension-python/dimension.pxd b/libdimension-python/dimension.pxd
index 1164be5..b70508c 100644
--- a/libdimension-python/dimension.pxd
+++ b/libdimension-python/dimension.pxd
@@ -195,6 +195,8 @@ cdef extern from "../libdimension/dimension.h":
int dmnsn_png_optimize_canvas(dmnsn_canvas *canvas)
int dmnsn_png_write_canvas(dmnsn_canvas *canvas, FILE *file)
dmnsn_progress *dmnsn_png_write_canvas_async(dmnsn_canvas *canvas, FILE *file)
+ dmnsn_canvas *dmnsn_png_read_canvas(FILE *file)
+ dmnsn_progress *dmnsn_png_read_canvas_async(dmnsn_canvas **canvas, FILE *file)
int dmnsn_gl_optimize_canvas(dmnsn_canvas *canvas)
int dmnsn_gl_write_canvas(dmnsn_canvas *canvas)
diff --git a/libdimension-python/dimension.pyx b/libdimension-python/dimension.pyx
index 0fed65f..b8855fe 100644
--- a/libdimension-python/dimension.pyx
+++ b/libdimension-python/dimension.pyx
@@ -25,6 +25,13 @@ Dimension: a high-performance photo-realistic 3D renderer.
import os
###########
+# Helpers #
+###########
+
+cdef _raise_OSError():
+ raise OSError(errno, os.strerror(errno))
+
+###########
# Globals #
###########
@@ -536,12 +543,12 @@ cdef class Canvas:
def optimize_PNG(self):
"""Optimize a canvas for PNG output."""
if dmnsn_png_optimize_canvas(self._canvas) != 0:
- raise OSError(errno, os.strerror(errno))
+ _raise_OSError()
def optimize_GL(self):
"""Optimize a canvas for OpenGL output."""
if dmnsn_gl_optimize_canvas(self._canvas) != 0:
- raise OSError(errno, os.strerror(errno))
+ _raise_OSError()
def clear(self, c):
"""Clear a canvas with a solid color."""
@@ -556,11 +563,11 @@ cdef class Canvas:
cdef char *cpath = bpath
cdef FILE *file = fopen(cpath, "wb")
if file == NULL:
- raise OSError(errno, os.strerror(errno))
+ _raise_OSError()
def finalize():
if fclose(file) != 0:
- raise OSError(errno, os.strerror(errno))
+ _raise_OSError()
progress = _Progress(dmnsn_png_write_canvas_async(self._canvas, file))
progress._finalizer = finalize
@@ -569,7 +576,7 @@ cdef class Canvas:
def draw_GL(self):
"""Export the canvas to the current OpenGL context."""
if dmnsn_gl_write_canvas(self._canvas) != 0:
- raise OSError(errno, os.strerror(errno))
+ _raise_OSError()
cdef class _CanvasProxy:
cdef dmnsn_canvas *_canvas
@@ -677,6 +684,29 @@ cdef Pigment _Pigment(dmnsn_pigment *pigment):
DMNSN_INCREF(self._pigment)
return self
+cdef class ImageMap(Pigment):
+ """An image-mapped pigment."""
+ def __init__(self, path, *args, **kwargs):
+ """
+ Create an ImageMap.
+
+ Keyword arguments:
+ path -- the path of the PNG file to open
+ """
+ bpath = path.encode("UTF-8")
+ cdef char *cpath = bpath
+ cdef FILE *file = fopen(cpath, "rb")
+ if file == NULL:
+ _raise_OSError()
+ cdef dmnsn_canvas *canvas = dmnsn_png_read_canvas(file)
+ if canvas == NULL:
+ _raise_OSError()
+ if fclose(file) != 0:
+ _raise_OSError()
+
+ self._pigment = dmnsn_new_canvas_pigment(canvas)
+ Pigment.__init__(self, *args, **kwargs)
+
cdef class PigmentMap(Pigment):
"""A pigment map."""
def __init__(self, Pattern pattern not None, map, bool sRGB not None = True,
@@ -696,13 +726,13 @@ cdef class PigmentMap(Pigment):
if hasattr(map, "items"):
for i, pigment in map.items():
pigment = Pigment(pigment)
- real_pigment = (<Pigment?>pigment)._pigment
+ real_pigment = (<Pigment>pigment)._pigment
DMNSN_INCREF(real_pigment)
dmnsn_add_map_entry(pigment_map, i, &real_pigment)
else:
for i, pigment in enumerate(map):
pigment = Pigment(pigment)
- real_pigment = (<Pigment?>pigment)._pigment
+ real_pigment = (<Pigment>pigment)._pigment
DMNSN_INCREF(real_pigment)
dmnsn_add_map_entry(pigment_map, i/len(map), &real_pigment)