Remove forgotten debug messages
[gfxprim.git] / pylib / context.py
blobd65008a19a1d7ec154510a368f4d099ba10170a2
1 import gfxprim_core_c as core
2 import gfxprim_loaders_c as loaders
4 def extend(cls, name=None):
5 def decf(method):
6 funname = name
7 if not funname:
8 funname = method.__name__
9 type.__setattr__(cls, funname, method)
10 return method
11 return decf
13 def add_swig_getmethod(cls, name=None):
14 def decf(method):
15 propname = name
16 if not propname:
17 propname = method.__name__
18 cls.__swig_getmethods__[propname] = method
19 return decf
21 def add_swig_setmethod(cls, name=None):
22 def decf(method):
23 propname = name
24 if not propname:
25 propname = method.__name__
26 cls.__swig_setmethods__[propname] = method
27 return decf
30 def extend_context_class(_context_class = core.Context):
31 """
32 Extends _context_class class with convenience methods.
33 Called on module inicialization.
34 """
36 # Add "parent" attribute
37 extend(_context_class, name='parent')(None)
39 @extend(_context_class, name='__str__')
40 @extend(_context_class, name='__repr__')
41 def context_str(self):
42 return "<Context %dx%d, %dbpp, GP_Context %sowned, %s parent>" % (
43 self.w, self.h, self._bpp,
44 "" if self.thisown else "not ",
45 "with" if self.parent else "no")
47 @add_swig_getmethod(_context_class)
48 def w(self):
49 return core.GP_ContextW(self)
51 @add_swig_getmethod(_context_class)
52 def h(self):
53 return core.GP_ContextH(self)
55 @extend(_context_class)
56 def subcontext(self, x, y, w, h):
57 "Create a subcontext (rectangular view)."
58 c = core.GP_ContextSubContext(self, None, x, y, w, h)
59 c.parent = self
60 return c
62 @extend(_context_class)
63 def copy(self, withdata):
64 "Copy the context to a new context. Pixel data are copie optionally."
65 flags = core.GP_COPY_WITH_PIXELS if withdata else 0
66 return core.GP_ContextCopy(self, flags)
68 @extend(_context_class)
69 def convert(self, target_type):
70 """Converts context to a different pixel type, allocates new context.
71 See GP_ContextConvert() for details."""
72 pixeltype_no = target_type ## TODO also accept PixelType
73 return core.GP_ContextConvert(self, pixeltype_no)
76 @extend(_context_class)
77 def save(self, filename, format=None):
78 """Save the image in given format (or guess it from the extension)
80 Currently, JPG, PNG and P[BGP]M are supported, but not for all
81 context pixel types.
82 """
83 if not format:
84 format = filename.rsplit('.', 1)[-1]
85 format = format.lower()
86 if format == 'jpg':
87 res = loaders.GP_SaveJPG(filename, self, None)
88 elif format == 'png':
89 res = loaders.GP_SavePNG(filename, self, None)
90 elif format == 'pbm':
91 res = loaders.GP_SavePBM(filename, self, None)
92 elif format == 'pgm':
93 res = loaders.GP_SavePGM(filename, self, None)
94 elif format == 'ppm':
95 res = loaders.GP_SavePPM(filename, self, None)
96 else:
97 raise Exception("Format %r not supported.", format)
98 if res != 0:
99 raise Exception("Error saving %r (code %d)", filename, res)
101 @extend(_context_class, name='create')
102 @staticmethod
103 def create(w, h, pixeltype):
104 "Allocate a new w*h bitmap of given type."
106 pixeltype_no = pixeltype if isinstance(pixeltype, int) else 0 # !!!
107 # TODO: actually accept a PixelType
108 c = core.GP_ContextAlloc(w, h, pixeltype_no)
109 return c
111 @extend(_context_class, name='load')
112 @staticmethod
113 def load(filename):
114 "Load image from given file, guess type."
115 c = loaders.GP_LoadImage_SWIG(filename)
116 return c
120 extend_context_class()