Update of /cvsroot/freevo/kaa/canvas/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30980
Modified Files:
canvasobject.py
Log Message:
Implemented CanvasText; big refactoring of the way properties are
synchronized.
Index: canvasobject.py
===================================================================
RCS file: /cvsroot/freevo/kaa/canvas/src/canvasobject.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** canvasobject.py 13 Jul 2005 20:45:23 -0000 1.1
--- canvasobject.py 14 Jul 2005 03:35:36 -0000 1.2
***************
*** 24,28 ****
--- 24,30 ----
def __init__(self):
+ self._supported_properties = ["pos", "visible", "layer", "color",
"size"]
self._properties = {}
+ self._changed_since_sync = {}
self._properties_serial = 0
self._relative_values_cache = { "serial": -1 }
***************
*** 56,63 ****
--- 58,72 ----
else:
self._set_property_generic(key, value)
+ self._inc_properties_serial()
+
+ def _inc_properties_serial(self):
self._properties_serial += 1
def _set_property_generic(self, key, value):
self._properties[key] = value
+ if self._changed_since_sync != None:
+ self._changed_since_sync[key] = True
+ if self._o:
+ self._sync_properties()
self._queue_render()
***************
*** 72,75 ****
--- 81,85 ----
self._o._canvas_object = weakref(self)
+ self._sync_properties()
self._queue_render()
***************
*** 112,118 ****
parent = self._parent
while parent:
! pos = map(lambda x,y: x+y, pos, parent["pos"])
! layer += parent["layer"]
! visible = visible and parent["visible"]
color = map(_blend_pixel, color, parent["color"])
--- 122,136 ----
parent = self._parent
while parent:
! # We're not interested in most properties of the canvas itself,
! # because it usually maps to a physical window. For example,
! # the window may be positioned at (50, 50) on the screen, so
! # we obviously don't want all objects on the canvas relative to
! # that ...
! if parent != self._canvas:
! pos = map(lambda x,y: x+y, pos, parent["pos"])
! visible = visible and parent["visible"]
! layer += parent["layer"]
!
! # ... except for color, which is a special case.
color = map(_blend_pixel, color, parent["color"])
***************
*** 140,160 ****
def _sync_properties(self):
! if not isinstance(self._o, evas.Object):
! return
! props = self._get_relative_values()
! cur_pos, cur_size = self._o.geometry_get()
! if props["pos"] != cur_pos:
! self._o.move(props["pos"])
! if props["visible"] != self._o.visible_get():
! self._o.visible_set(props["visible"])
! if props["layer"] != self._o.layer_get():
! self._o.layer_set(props["layer"])
! if props["color"] != self._o.color_get():
! self._o.color_set(*props["color"])
! if self["size"] != (-1, -1) and self["size"] != cur_size:
! self._o.resize(self._get_computed_size(self["size"]))
def _get_computed_size(self, (w, h)):
--- 158,197 ----
def _sync_properties(self):
! if len(self._changed_since_sync) == 0:
! return False
! changed = self._changed_since_sync
! # Prevents reentry.
! self._changed_since_sync = None
! #print "SYNC PROPERTIES", self, changed
+ for prop in self._supported_properties:
+ if prop not in changed:
+ continue
+ getattr(self, "_sync_property_" + prop)()
+ del changed[prop]
+
+ self._changed_since_sync = changed
+ return True
+
+
+ def _sync_property_pos(self):
+ self._o.move(self._get_relative_values()["pos"])
+
+ def _sync_property_visible(self):
+ self._o.visible_set(self._get_relative_values()["visible"])
+
+ def _sync_property_layer(self):
+ self._o.layer_set(self._get_relative_values()["layer"])
+
+ def _sync_property_color(self):
+ self._o.color_set(*self._get_relative_values()["color"])
+
+ def _sync_property_size(self):
+ if self["size"] == (-1, -1):
+ return
+
+ self._o.resize(self._get_computed_size(self["size"]))
def _get_computed_size(self, (w, h)):
***************
*** 225,236 ****
def _uncanvased(self):
for child in self._children:
child._uncanvased()
! def __setitem__(self, key, value):
! super(CanvasContainer, self).__setitem__(key, value)
for child in self._children:
child._properties_serial += 1
!
def _sync_properties(self):
--- 262,274 ----
def _uncanvased(self):
+ super(CanvasContainer, self)._uncanvased()
for child in self._children:
child._uncanvased()
! def _inc_properties_serial(self):
! super(CanvasContainer, self)._inc_properties_serial()
for child in self._children:
child._properties_serial += 1
!
def _sync_properties(self):
***************
*** 265,291 ****
# Convenience functions for object creation.
! def add_container(self, pos = (0, 0), visible = True, color = (255, 255,
255, 255), layer = 0, name = None):
! c = CanvasContainer()
! c.move(pos)
! c.set_layer(layer)
! c.set_color(*color)
! c.set_visible(visible)
! c.set_name(name)
! self.add_child(c)
! return c
! def add_image(self, image, dst_pos = (0, 0), dst_size = (-1, -1),
! src_pos = (0, 0), src_size = (-1, -1), visible = True,
! color = (255, 255, 255, 255), layer = 0, name = None):
img = CanvasImage(image)
! img.move(dst_pos)
! img.resize(dst_size)
! # Do src_pos/size via crop
! img.set_layer(layer)
! img.set_color(*color)
! img.set_visible(visible)
! img.set_name(name)
! self.add_child(img)
! return img
--- 303,383 ----
# Convenience functions for object creation.
! def _add_common(self, o, kwargs):
! if "pos" in kwargs: o.move(kwargs["pos"])
! if "visible" in kwargs: o.set_visible(kwargs["visible"])
! if "color" in kwargs: o.set_color(*kwargs["color"])
! if "name" in kwargs: o.set_name(kwargs["name"])
! if "layer" in kwargs: o.set_layer(kwargs["layer"])
! self.add_child(o)
! return o
!
! def add_container(self, **kwargs):
! return self._add_common(CanvasContainer(), kwargs)
!
! def add_image(self, image, **kwargs):
img = CanvasImage(image)
! if "dst_size" in kwargs:
! img.resize(kwargs["dst_size"])
! # TODO: Do src_pos/size via crop
! if "dst_pos" in kwargs:
! kwargs["pos"] = kwargs["dst_pos"]
! return self._add_common(img, kwargs)
!
! def add_text(self, text = None, **kwargs):
! return self._add_common(CanvasText(text), kwargs)
!
!
! class CanvasText(CanvasObject):
!
! def __init__(self, text = None, font = "arial", size = 24, color = None):
! super(CanvasText, self).__init__()
!
! self._supported_properties += [ "text", "font" ]
!
! self.set_font(font, size)
! if text != None:
! self.set_text(text)
! if color != None:
! self.set_color(color)
!
! def _canvased(self, canvas):
! super(CanvasText, self)._canvased(canvas)
!
! if self._o:
! o = self._o
! else:
! o = canvas.get_evas().object_text_add()
!
! self._wrap(o)
!
!
! def set_font(self, font, size):
! self["font"] = (font, size)
!
!
! def get_font(self):
! if isinstance(self._o, evas.Object):
! return self._o.font_get()
! return self["font"]
!
!
! def set_text(self, text, color = None):
! self["text"] = text
! if color:
! self.set_color(color)
!
!
! def get_text(self):
! if isinstance(self._o, evas.Object):
! return self._o.text_get()
! return self["text"]
!
!
! def _sync_property_font(self):
! self._o.font_set(*self["font"])
!
! def _sync_property_text(self):
! self._o.text_set(self["text"])
***************
*** 294,301 ****
class CanvasImage(CanvasObject):
def __init__(self, image_or_file = None):
super(CanvasImage, self).__init__()
! self["loaded"] = False
self["has_alpha"] = True
if image_or_file:
self.set_image(image_or_file)
--- 386,401 ----
class CanvasImage(CanvasObject):
+ PIXEL_FORMAT_NONE = 0
+ PIXEL_FORMAT_ARGB32 = 1
+ PIXEL_FORMAT_YUV420P_601 = 2
+
def __init__(self, image_or_file = None):
super(CanvasImage, self).__init__()
!
! self._supported_properties += ["image", "filename", "pixels",
"dirty", "size", "has_alpha"]
!
! self._loaded = False
self["has_alpha"] = True
+
if image_or_file:
self.set_image(image_or_file)
***************
*** 303,316 ****
def set_image(self, image_or_file):
! del self["filename"], self["image"]
if type(image_or_file) in types.StringTypes:
self["filename"] = image_or_file
elif imlib2 and type(image_or_file) == imlib2.Image:
self["image"] = image_or_file
self["image"].signals["changed"].connect_weak(self.set_dirty)
else:
raise ValueError, "Unsupported argument to set_image: " +
repr(type(image_or_file))
! self["loaded"] = False
--- 403,418 ----
def set_image(self, image_or_file):
! del self["filename"], self["image"], self["pixels"]
if type(image_or_file) in types.StringTypes:
self["filename"] = image_or_file
elif imlib2 and type(image_or_file) == imlib2.Image:
self["image"] = image_or_file
+ # Use weakref connection because we already hold a ref to the
+ # image: avoids cycle.
self["image"].signals["changed"].connect_weak(self.set_dirty)
else:
raise ValueError, "Unsupported argument to set_image: " +
repr(type(image_or_file))
! self._loaded = False
***************
*** 323,333 ****
o = canvas.get_evas().object_image_add()
- o.alpha_set(True)
self._wrap(o)
def _set_property_filename(self, filename):
! if self._o:
! self._o.load(filename)
self._set_property_generic("filename", filename)
--- 425,433 ----
o = canvas.get_evas().object_image_add()
self._wrap(o)
def _set_property_filename(self, filename):
! assert(type(filename) == str)
self._set_property_generic("filename", filename)
***************
*** 338,373 ****
! def _sync_properties(self):
! super(CanvasImage, self)._sync_properties()
! if not self["loaded"]:
! if "image" in self:
! size = self["image"].size
! print "Importing imlib2 image"
! self._o.size_set(size)
! self._o.resize(size)
! self._o.fill_set((0, 0), size)
! self._o.data_set(self["image"].get_raw_data(), copy = False)
! elif "filename" in self:
! self._o.load(self["filename"])
! self["loaded"] = True
- if self["size"] != (-1, -1) and ((0,0), self.get_size()) !=
self._o.fill_get():
- print "SET FILL"
- self._o.fill_set((0, 0), self.get_size())
! if self["has_alpha"] and self._o.alpha_get() != self["has_alpha"]:
! self._o.alpha_set(self["has_alpha"])
! if self["dirty"]:
! self._o.pixels_dirty_set()
! if self["image"]:
! # Even though we're sharing the memory between the evas image
buffer
! # and the Imlib2 image's buffer, we need to call this function
! # for canvas backends where this data gets copied again (like
GL
! # textures).
! self._o.data_set(self["image"].get_raw_data(), copy = False)
! self["dirty"] = False
--- 438,488 ----
! def _sync_property_image(self):
! if self._loaded:
! return
! size = self["image"].size
! self._o.size_set(size)
! self._o.resize(size)
! self._o.fill_set((0, 0), size)
! self._o.data_set(self["image"].get_raw_data(), copy = False)
! self._loaded = True
! def _sync_property_filename(self):
! if self._loaded:
! return
! self._o.load(self["filename"])
! self._loaded = True
! def _sync_property_pixels(self):
! if self._loaded:
! return
! data, w, h, format = self["pixels"]
! self._o.size_set((w, h))
! self._o.resize((w,h))
! self._o.fill_set((0, 0), (w,h))
! self._o.pixels_import(data, w, h, format)
! self._o.pixels_dirty_set()
! self._loaded = True
! def _sync_property_size(self):
! super(CanvasImage, self)._sync_property_size()
! self._o.fill_set((0, 0), self.get_size())
!
! def _sync_property_has_alpha(self):
! self._o.alpha_set(self["has_alpha"])
!
! def _sync_property_dirty(self):
! if not self["dirty"]:
! return
! self._o.pixels_dirty_set()
! if self["image"]:
! # Even though we're sharing the memory between the evas image
buffer
! # and the Imlib2 image's buffer, we need to call this function
! # for canvas backends where this data gets copied again (like GL
! # textures).
! self._o.data_set(self["image"].get_raw_data(), copy = False)
! self["dirty"] = False
***************
*** 375,378 ****
--- 490,498 ----
self["dirty"] = dirty
+ def import_pixels(self, data, w, h, format):
+ del self["filename"], self["image"], self["pixels"]
+ self["pixels"] = (data, w, h, format)
+ self._loaded = False
+
def as_image(self):
***************
*** 382,386 ****
if not self["image"]:
# No existing Imlib2 image, so we need to make one.
! if self["loaded"]:
# The evas object already exists, so create an Imlib2 image
# from evas data and use the Imlib2 image as the buffer for
--- 502,506 ----
if not self["image"]:
# No existing Imlib2 image, so we need to make one.
! if self._loaded:
# The evas object already exists, so create an Imlib2 image
# from evas data and use the Imlib2 image as the buffer for
***************
*** 389,397 ****
self["image"] = imlib2.new(size, self._o.data_get())
self._o.data_set(self["image"].get_raw_data(), copy = False)
- print "MAKING IMAGE FROM EVAS OBJECT"
elif self["filename"]:
# Evas object not created yet,
self["image"] = imlib2.open(self["filename"])
self["image"].signals["changed"].connect_weak(self.set_dirty)
--- 509,520 ----
self["image"] = imlib2.new(size, self._o.data_get())
self._o.data_set(self["image"].get_raw_data(), copy = False)
elif self["filename"]:
# Evas object not created yet,
self["image"] = imlib2.open(self["filename"])
+
+ elif self["pixels"]:
+ raise CanvasError, "Can't convert not-yet-imported pixels to
image."
+
self["image"].signals["changed"].connect_weak(self.set_dirty)
***************
*** 406,410 ****
self["has_alpha"] = has_alpha
-
--- 529,532 ----
***************
*** 424,428 ****
--- 546,562 ----
super(Canvas, self).__init__()
+ def __getattr__(self, attr):
+ if attr == "fontpath":
+ return self.get_evas().fontpath
+ return CanvasContainer.__getattr__(self, attr)
+
+ def __setattr__(self, attr, value):
+ if attr == "fontpath":
+ self.get_evas().fontpath = value
+ else:
+ CanvasContainer.__setattr__(self, attr, value)
+
def _register_object_name(self, name, object):
+ # FIXME: handle cleanup
self._names[name] = weakref(object)
***************
*** 431,435 ****
del self._names[name]
! def find_object_by_name(self, name):
if name in self._names:
object = self._names[name]
--- 565,569 ----
del self._names[name]
! def find_object(self, name):
if name in self._names:
object = self._names[name]
***************
*** 482,486 ****
! def _sync_properties(self):
self._visibility_on_next_render = self["visible"]
--- 616,620 ----
! def _sync_property_visible(self):
self._visibility_on_next_render = self["visible"]
***************
*** 509,512 ****
--- 643,647 ----
if vis == False:
self._window.hide()
+ print "Render canvas right now"
self._o.render()
if vis == True:
-------------------------------------------------------
This SF.Net email is sponsored by the 'Do More With Dual!' webinar happening
July 14 at 8am PDT/11am EDT. We invite you to explore the latest in dual
core and dual graphics technology at this free one hour event hosted by HP,
AMD, and NVIDIA. To register visit http://www.hp.com/go/dualwebinar
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog