1 import gfxprim_core_c
as core
2 import gfxprim_loaders_c
as loaders
4 def extend(cls
, name
=None):
8 funname
= method
.__name
__
9 type.__setattr
__(cls
, funname
, method
)
13 def add_swig_getmethod(cls
, name
=None):
17 propname
= method
.__name
__
18 cls
.__swig
_getmethods
__[propname
] = method
21 def add_swig_setmethod(cls
, name
=None):
25 propname
= method
.__name
__
26 cls
.__swig
_setmethods
__[propname
] = method
30 def extend_context_class(_context_class
= core
.Context
):
32 Extends _context_class class with convenience methods.
33 Called on module inicialization.
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
)
49 return core
.GP_ContextW(self
)
51 @add_swig_getmethod(_context_class
)
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
)
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
84 format
= filename
.rsplit('.', 1)[-1]
85 format
= format
.lower()
87 res
= loaders
.GP_SaveJPG(filename
, self
, None)
89 res
= loaders
.GP_SavePNG(filename
, self
, None)
91 res
= loaders
.GP_SavePBM(filename
, self
, None)
93 res
= loaders
.GP_SavePGM(filename
, self
, None)
95 res
= loaders
.GP_SavePPM(filename
, self
, None)
97 raise Exception("Format %r not supported.", format
)
99 raise Exception("Error saving %r (code %d)", filename
, res
)
101 @extend(_context_class
, name
='create')
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
)
111 @extend(_context_class
, name
='load')
114 "Load image from given file, guess type."
115 c
= loaders
.GP_LoadImage_SWIG(filename
)
120 extend_context_class()