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