Author: tack
Date: Sat Sep 30 01:45:34 2006
New Revision: 1910

Modified:
   trunk/evas/src/__init__.py
   trunk/evas/src/engine_buffer.c
   trunk/evas/src/engine_buffer.h
   trunk/evas/src/evas.c

Log:
Move memory allocation for buffer canvases into C, rather than using
array.array.  Speeds up buffer canvas creation by two orders.


Modified: trunk/evas/src/__init__.py
==============================================================================
--- trunk/evas/src/__init__.py  (original)
+++ trunk/evas/src/__init__.py  Sat Sep 30 01:45:34 2006
@@ -506,20 +506,23 @@
         bpp = (4, 4, 3, 3)[ kwargs["depth"] ]
         if not kwargs.get("stride"):
             kwargs["stride"] = size[0] * bpp
-        if not kwargs.get("buffer"):
-            kwargs["buffer"] = array.array('c', '\0'*size[0]*size[1]*bpp)
         kwargs["size"] = size
-        assert type(kwargs["buffer"]) in (array.array, buffer, int)
+        if kwargs.get('buffer'):
+            assert type(kwargs["buffer"]) in (array.array, buffer, int)
 
-        result = self._evas.output_set("buffer", **kwargs)
+        # If buffer wasn't specified, it will be created for us.  In any case
+        # the buffer object will be returned by output_set.  If the buffer is
+        # created, evas depends on the memory backed by the buffer to exist.
+        # So we really need to make sure the buffer doesn't go away, hence the
+        # private member variable.
+        self.__buffer = self._evas.output_set("buffer", **kwargs)
         self.output_size_set(size)
         if not viewport:
             viewport = (0, 0), size
         self.viewport_set(viewport[0], viewport[1])
-        self._buffer = kwargs["buffer"]
 
     def buffer_get(self):
-        return self._buffer
+        return self.__buffer
 
 
 _tsc_factor = None

Modified: trunk/evas/src/engine_buffer.c
==============================================================================
--- trunk/evas/src/engine_buffer.c      (original)
+++ trunk/evas/src/engine_buffer.c      Sat Sep 30 01:45:34 2006
@@ -1,11 +1,11 @@
 #include "engine_buffer.h"
 #include <Evas_Engine_Buffer.h>
 
-int engine_buffer_setup(Evas_PyObject *o, PyObject *kwargs)
+PyObject *engine_buffer_setup(Evas_PyObject *o, PyObject *kwargs)
 {
     Evas_Engine_Info_Buffer *einfo;
-    int res, buflen, w, h;
-    PyObject *value;
+    int buflen, w, h;
+    PyObject *value, *buffer;
 
     BENCH_START
     evas_output_method_set(o->evas, evas_render_method_lookup("buffer"));
@@ -25,19 +25,29 @@
     einfo->info.dest_buffer_row_bytes = 
PyLong_AsLong(PyDict_GetItemString(kwargs, "stride"));
     einfo->info.dest_buffer = 0;
     value = PyDict_GetItemString(kwargs, "buffer");
-    if (PyNumber_Check(value))
-        einfo->info.dest_buffer = (void *) PyLong_AsLong(value);
-    else {
-        res = PyObject_AsWriteBuffer(value, &einfo->info.dest_buffer, &buflen);
-        if (res == -1)
-            return 0;
-        if (buflen < einfo->info.dest_buffer_row_bytes * h) {
-            PyErr_SetString(PyExc_AttributeError, "Buffer not big enough");
+    if (!value || value == Py_None) {
+        buffer = PyBuffer_New(einfo->info.dest_buffer_row_bytes * h);
+        if (PyObject_AsWriteBuffer(buffer, &einfo->info.dest_buffer, &buflen) 
== -1)
             return 0;
+    } else {
+        if (PyNumber_Check(value)) {
+            einfo->info.dest_buffer = (void *) PyLong_AsLong(value);
+            buffer = PyBuffer_FromReadWriteMemory(einfo->info.dest_buffer, 
+                                                  
einfo->info.dest_buffer_row_bytes * h);
+        } else {
+            if (PyObject_AsWriteBuffer(value, &einfo->info.dest_buffer, 
&buflen) == -1)
+                return 0;
+            if (buflen < einfo->info.dest_buffer_row_bytes * h) {
+                PyErr_SetString(PyExc_AttributeError, "Buffer not big enough");
+                return 0;
+            }
+            buffer = value;
+            Py_INCREF(buffer);
         }
     }
+
     BENCH_START
     evas_engine_info_set(o->evas, (Evas_Engine_Info *) einfo);
     BENCH_END
-    return 1;
+    return buffer;
 }

Modified: trunk/evas/src/engine_buffer.h
==============================================================================
--- trunk/evas/src/engine_buffer.h      (original)
+++ trunk/evas/src/engine_buffer.h      Sat Sep 30 01:45:34 2006
@@ -1,3 +1,3 @@
 #include "evas.h"
-int engine_buffer_setup(Evas_PyObject *o, PyObject *kwargs);
+PyObject *engine_buffer_setup(Evas_PyObject *o, PyObject *kwargs);
 

Modified: trunk/evas/src/evas.c
==============================================================================
--- trunk/evas/src/evas.c       (original)
+++ trunk/evas/src/evas.c       Sat Sep 30 01:45:34 2006
@@ -205,15 +205,12 @@
         return NULL;
     }
 
-    BENCH_START
     if (!strcmp(render_method, "buffer")) {
-        if (!engine_buffer_setup(self, kwargs))
-            return NULL;
+        return engine_buffer_setup(self, kwargs);
     } else {
         PyErr_Format(evas_error, "Unsupported output method '%s'.", 
render_method);
         return NULL;
     }
-    BENCH_END
 
     Py_INCREF(Py_None);
     return Py_None;

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to