Port all buffer related code to the new Shiboken buffer interface.

Reviewer: Renato Araújo <renato.filho@openbossa.org>
          Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Hugo Parente Lima 2011-06-01 15:40:48 -03:00
commit f1c7c78694
3 changed files with 36 additions and 66 deletions

View file

@ -518,9 +518,9 @@
<replace-type modified-type="PyObject" /> <replace-type modified-type="PyObject" />
</modify-argument> </modify-argument>
<inject-code> <inject-code>
const uchar* d = %CPPSELF.%FUNCTION_NAME(); const void* d = %CPPSELF.%FUNCTION_NAME();
if (d) { if (d) {
%PYARG_0 = PyBuffer_FromMemory(const_cast&lt;uchar*>(d), %CPPSELF.size()); %PYARG_0 = Shiboken::Buffer::newObject(d, %CPPSELF.size());
} else { } else {
Py_INCREF(Py_None); Py_INCREF(Py_None);
%PYARG_0 = Py_None; %PYARG_0 = Py_None;
@ -528,21 +528,13 @@
</inject-code> </inject-code>
</modify-function> </modify-function>
<template name="QResource_registerResource"> <template name="QResource_registerResource">
PyTypeObject* pyType = %PYARG_1->ob_type; uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
if (pyType->tp_as_buffer %PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>(ptr), %2));
&amp;&amp; pyType->tp_as_buffer->bf_getreadbuffer
&amp;&amp; pyType->tp_as_buffer->bf_getsegcount(%PYARG_1, 0) == 1) {
void* ptr;
pyType->tp_as_buffer->bf_getreadbuffer(%PYARG_1, 0, &amp;ptr);
%PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>((uchar*)ptr), %2));
} else {
PyErr_SetString(PyExc_TypeError, "The object must support buffer protocol with just one segment.");
}
</template> </template>
<modify-function signature="unregisterResource(const uchar*, const QString&amp;)" rename="unregisterResourceData"> <modify-function signature="unregisterResource(const uchar*, const QString&amp;)" rename="unregisterResourceData">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
<insert-template name="QResource_registerResource" /> <insert-template name="QResource_registerResource" />
@ -550,7 +542,7 @@
</modify-function> </modify-function>
<modify-function signature="registerResource(const uchar*, const QString&amp;)" rename="registerResourceData"> <modify-function signature="registerResource(const uchar*, const QString&amp;)" rename="registerResourceData">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
<insert-template name="QResource_registerResource" /> <insert-template name="QResource_registerResource" />
@ -1968,15 +1960,13 @@
<replace-type modified-type="PyBuffer"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
const void* ptr; uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
Py_ssize_t len; %PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(ptr));
PyObject_AsReadBuffer(%PYARG_1, &amp;ptr, &amp;len);
%PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME((uchar*)ptr));
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)"> <modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)">
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromReadWriteMemory(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite);
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="remove()" allow-thread="yes"/> <modify-function signature="remove()" allow-thread="yes"/>
@ -2175,22 +2165,15 @@
<object-type name="QTranslator"> <object-type name="QTranslator">
<modify-function signature="load(const uchar*, int)"> <modify-function signature="load(const uchar*, int)">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyObject" /> <replace-type modified-type="PyBuffer" />
</modify-argument> </modify-argument>
<modify-argument index="2"> <modify-argument index="2">
<remove-argument /> <remove-argument />
</modify-argument> </modify-argument>
<inject-code> <inject-code>
PyTypeObject* pyType = %PYARG_1->ob_type; Py_ssize_t size;
if (pyType->tp_as_buffer uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1, &amp;size);
&amp;&amp; pyType->tp_as_buffer->bf_getreadbuffer %PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>(ptr), size));
&amp;&amp; pyType->tp_as_buffer->bf_getsegcount(%PYARG_1, 0) == 1) {
void* ptr;
Py_ssize_t size = pyType->tp_as_buffer->bf_getreadbuffer(%PYARG_1, 0, &amp;ptr);
%PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>((uchar*)ptr), size));
} else {
PyErr_SetString(PyExc_TypeError, "The object must support buffer protocol with just one segment.");
}
</inject-code> </inject-code>
</modify-function> </modify-function>
</object-type> </object-type>
@ -2309,15 +2292,13 @@
<replace-type modified-type="PyBuffer"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
const void* ptr; uchar* ptr = (uchar*)Shiboken::Buffer::getPointer(%PYARG_1);
Py_ssize_t len; %PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME(ptr));
PyObject_AsReadBuffer(%PYARG_1, &amp;ptr, &amp;len);
%PYARG_0 = %CONVERTTOPYTHON[bool](%CPPSELF.%FUNCTION_NAME((uchar*)ptr));
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)"> <modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)">
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromReadWriteMemory(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite);
</inject-code> </inject-code>
</modify-function> </modify-function>
@ -2983,8 +2964,8 @@
</object-type> </object-type>
<!-- We will use inject code to implement the function below --> <!-- We will use inject code to implement the function below -->
<rejection class="QEasingCurve" function-name="setCustomType" /> <rejection class="QEasingCurve" function-name="setCustomType" />
<rejection class="QEasingCurve" function-name="customType" /> <rejection class="QEasingCurve" function-name="customType" />
<value-type name="QEasingCurve" since="4.6"> <value-type name="QEasingCurve" since="4.6">
<extra-includes> <extra-includes>
<include file-name="pysideweakref.h" location="global"/> <include file-name="pysideweakref.h" location="global"/>

View file

@ -415,13 +415,11 @@
<value-type name="QBitmap" > <value-type name="QBitmap" >
<modify-function signature="fromData(QSize,const uchar*,QImage::Format)"> <modify-function signature="fromData(QSize,const uchar*,QImage::Format)">
<modify-argument index="2"> <modify-argument index="2">
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
const void* buffer; uchar* buffer = (uchar*) Shiboken::Buffer::getPointer(%PYARG_2);
Py_ssize_t size; %PYARG_0 = %CONVERTTOPYTHON[QBitmap](QBitmap::fromData(%1, buffer, %3));
if (PyObject_AsReadBuffer(%PYARG_2, &amp;buffer, &amp;size) != -1)
%PYARG_0 = %CONVERTTOPYTHON[QBitmap](QBitmap::fromData(%1, (const uchar*)buffer, %3));
</inject-code> </inject-code>
</modify-function> </modify-function>
</value-type> </value-type>
@ -553,25 +551,24 @@
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyObject"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromMemory(const_cast&lt;char*&gt;(%CPPSELF.data()), %CPPSELF.size()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.data(), %CPPSELF.size());
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="setData(const char*,uint)"> <modify-function signature="setData(const char*,uint)">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyBuffer"/> <replace-type modified-type="PyBuffer"/>
<conversion-rule class="target"> <conversion-rule class="target">
PyObject *%out = PyBuffer_FromMemory(const_cast&lt;char*&gt;(%in), size); PyObject* %out = Shiboken::Buffer::newObject(%in, size);
</conversion-rule> </conversion-rule>
<conversion-rule class="native"> <conversion-rule class="native">
const char *%out; Py_ssize_t bufferLen;
Py_ssize_t buffer_len; char* %out = (char*) Shiboken::Buffer::getPointer(arg, &amp;bufferLen);
PyObject_AsCharBuffer(arg, &amp;%out, &amp;buffer_len);
</conversion-rule> </conversion-rule>
</modify-argument> </modify-argument>
<modify-argument index="2"> <modify-argument index="2">
<remove-argument/> <remove-argument/>
<conversion-rule class="native"> <conversion-rule class="native">
uint %out = buffer_len; uint %out = bufferLen;
</conversion-rule> </conversion-rule>
</modify-argument> </modify-argument>
</modify-function> </modify-function>
@ -975,20 +972,12 @@
</extra-includes> </extra-includes>
<template name="qimage_buffer_constructor"> <template name="qimage_buffer_constructor">
PyTypeObject* pyType = reinterpret_cast&lt;PyTypeObject*>(%PYARG_1->ob_type); uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
if (pyType->tp_as_buffer %0 = new %TYPE(ptr, %ARGS);
&amp;&amp; pyType->tp_as_buffer->bf_getreadbuffer
&amp;&amp; pyType->tp_as_buffer->bf_getsegcount(%PYARG_1, 0) == 1) {
void* ptr;
pyType->tp_as_buffer->bf_getreadbuffer(%PYARG_1, 0, &amp;ptr);
%0 = new %TYPE((uchar*)ptr, %ARGS);
} else {
PyErr_SetString(PyExc_TypeError, "The object must support buffer protocol with just one segment.");
}
</template> </template>
<modify-function signature="QImage(uchar *,int,int,int,QImage::Format)"> <modify-function signature="QImage(uchar *,int,int,int,QImage::Format)">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
<insert-template name="qimage_buffer_constructor"> <insert-template name="qimage_buffer_constructor">
@ -998,7 +987,7 @@
</modify-function> </modify-function>
<modify-function signature="QImage(uchar*,int,int,QImage::Format)"> <modify-function signature="QImage(uchar*,int,int,QImage::Format)">
<modify-argument index="1"> <modify-argument index="1">
<replace-type modified-type="PyObject"/> <replace-type modified-type="PyBuffer"/>
</modify-argument> </modify-argument>
<inject-code> <inject-code>
<insert-template name="qimage_buffer_constructor"> <insert-template name="qimage_buffer_constructor">
@ -1054,23 +1043,23 @@
<modify-function signature="constBits()const" since="4.7"> <modify-function signature="constBits()const" since="4.7">
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromMemory(const_cast&lt;uchar*>(%CPPSELF.%FUNCTION_NAME()), %CPPSELF.byteCount()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.byteCount());
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="bits()"> <modify-function signature="bits()">
<inject-code> <inject-code>
// byteCount() is only available on Qt4.7, so we use bytesPerLine * height // byteCount() is only available on Qt4.7, so we use bytesPerLine * height
%PYARG_0 = PyBuffer_FromReadWriteMemory(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.bytesPerLine() * %CPPSELF.height()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.bytesPerLine() * %CPPSELF.height(), Shiboken::Buffer::ReadWrite);
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="constScanLine(int)const" since="4.7"> <modify-function signature="constScanLine(int)const" since="4.7">
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromMemory(const_cast&lt;uchar*>(%CPPSELF.%FUNCTION_NAME(%1)), %CPPSELF.bytesPerLine()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine());
</inject-code> </inject-code>
</modify-function> </modify-function>
<modify-function signature="scanLine(int)"> <modify-function signature="scanLine(int)">
<inject-code> <inject-code>
%PYARG_0 = PyBuffer_FromReadWriteMemory(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine(), Shiboken::Buffer::ReadWrite);
</inject-code> </inject-code>
</modify-function> </modify-function>
<!-- <!--

View file

@ -130,9 +130,9 @@
Py_INCREF(Py_None); Py_INCREF(Py_None);
%PYARG_0 = Py_None; %PYARG_0 = Py_None;
} else if (%1 == QGLBuffer::ReadOnly) { } else if (%1 == QGLBuffer::ReadOnly) {
%PYARG_0 = PyBuffer_FromMemory(data, dataSize); %PYARG_0 = Shiboken::Buffer::newObject(data, dataSize, Shiboken::Buffer::ReadOnly);
} else { } else {
%PYARG_0 = PyBuffer_FromReadWriteMemory(data, dataSize); %PYARG_0 = Shiboken::Buffer::newObject(data, dataSize, Shiboken::Buffer::ReadWrite);
} }
</inject-code> </inject-code>
</modify-function> </modify-function>