Author: tack
Date: Fri Jan 4 15:07:20 2008
New Revision: 2938
Log:
Release the GIL when we might block.
Modified:
trunk/imlib2/src/image.c
trunk/imlib2/src/imlib2.c
Modified: trunk/imlib2/src/image.c
==============================================================================
--- trunk/imlib2/src/image.c (original)
+++ trunk/imlib2/src/image.c Fri Jan 4 15:07:20 2008
@@ -166,6 +166,7 @@
if (!PyArg_ParseTuple(args, "iiii", &x, &y, &w, &h))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
data = (unsigned char *)imlib_image_get_data();
max_w = imlib_image_get_width();
@@ -179,6 +180,7 @@
for (cur_y = y; cur_y < y + h; cur_y++)
memset(&data[cur_y*max_w*4+(x*4)], 0, 4*w);
imlib_image_put_back_data((DATA32 *)data);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -195,9 +197,12 @@
&dst_h))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
image = imlib_create_cropped_scaled_image(x, y, src_w, src_h,
dst_w, dst_h);
+ Py_END_ALLOW_THREADS
+
if (!image) {
PyErr_Format(PyExc_RuntimeError, "Failed scaling image (%d, %d)",
dst_w, dst_h);
@@ -218,9 +223,11 @@
if (!PyArg_ParseTuple(args, "d", &angle))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
-
image = imlib_create_rotated_image(angle);
+ Py_END_ALLOW_THREADS
+
if (!image) {
PyErr_Format(PyExc_RuntimeError, "Failed rotating image (%f) degrees",
angle);
@@ -239,8 +246,11 @@
if (!PyArg_ParseTuple(args, "i", &orientation))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_orientate(orientation);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
@@ -252,10 +262,12 @@
if (!PyArg_ParseTuple(args, "iii", &horiz, &vert, &diag))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
if (horiz) imlib_image_flip_horizontal();
if (vert) imlib_image_flip_vertical();
if (diag) imlib_image_flip_diagonal();
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -269,8 +281,11 @@
if (!PyArg_ParseTuple(args, "i", &radius))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_blur(radius);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
@@ -283,8 +298,11 @@
if (!PyArg_ParseTuple(args, "i", &radius))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_sharpen(radius);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
@@ -295,8 +313,11 @@
Imlib_Image *image;
Image_PyObject *o;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
image = imlib_clone_image();
+ Py_END_ALLOW_THREADS
+
if (!image) {
PyErr_Format(PyExc_RuntimeError, "Failed to clone image");
return NULL;
@@ -326,6 +347,7 @@
return Py_None;
}
+ Py_BEGIN_ALLOW_THREADS
src_img = ((Image_PyObject *)src)->image;
if (src_alpha < 255) {
@@ -349,6 +371,7 @@
dst_x, dst_y, dst_w, dst_h);
imlib_context_set_blend(1);
imlib_context_set_color_modifier(NULL);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -368,6 +391,7 @@
&dst_y))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)mask)->image);
mask_w = imlib_image_get_width();
mask_h = imlib_image_get_height();
@@ -395,19 +419,12 @@
// Blend average (grayscale) pixel from the mask with the
// alpha channel of the image
-#if 1
- // This is the code from Tack, but it doesn't work
- // like it should ... -- Dischi
- // (tack) Well, should work like this:
int temp = (dst_chunk[3] * avg) + 0x80;
dst_chunk[3] = ((temp + (temp >> 8)) >> 8);
-#else
- // ... so this is my guess -- Dischi
- dst_chunk[3] = (dst_chunk[3] * avg) / 255;
-#endif
}
}
imlib_image_put_back_data((DATA32 *)dst_data);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -424,12 +441,14 @@
&y, &text, &r, &g, &b, &a))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_context_set_font(((Font_PyObject *)font)->font);
imlib_context_set_color(r, g, b, a);
imlib_text_draw_with_return_metrics(x, y, text, &w, &h, &advance_w,
&advance_h);
+ Py_END_ALLOW_THREADS
return Py_BuildValue("(llll)", w, h, advance_w, advance_h);
}
@@ -464,6 +483,7 @@
&glow2.r, &glow2.g, &glow2.b, &glow2.a))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_context_set_font(((Font_PyObject *)font)->font);
@@ -546,6 +566,7 @@
COLOR_SET(color);
imlib_text_draw_with_return_metrics(x, y, text, &w, &h, &advance_w,
&advance_h);
+ Py_END_ALLOW_THREADS
/* FIXME: add effect to advance_w and advance_h */
return Py_BuildValue("(llll)", w, h, advance_w, advance_h);
@@ -561,6 +582,7 @@
&fill))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_set_has_alpha(1);
imlib_context_set_color(r, g, b, a);
@@ -568,6 +590,7 @@
imlib_image_draw_rectangle(x, y, w, h);
else
imlib_image_fill_rectangle(x, y, w, h);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -582,6 +605,7 @@
&a, &fill))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_context_set_color(r, g, b, a);
imlib_context_set_anti_alias(1);
@@ -589,6 +613,7 @@
imlib_image_draw_ellipse(xc, yc, ea, eb);
else
imlib_image_fill_ellipse(xc, yc, ea, eb);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -601,8 +626,12 @@
if (!PyArg_ParseTuple(args, "i", &alpha))
return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_set_has_alpha(alpha);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
@@ -615,8 +644,11 @@
&dst_y))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_copy_rect(src_x, src_y, w, h, dst_x, dst_y);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
@@ -629,8 +661,10 @@
if (!PyArg_ParseTuple(args, "(ii)", &x, &y))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
imlib_context_set_image(((Image_PyObject *)self)->image);
imlib_image_query_pixel(x, y, &col);
+ Py_END_ALLOW_THREADS
return Py_BuildValue("(iiii)", col.blue, col.green, col.red, col.alpha);
}
@@ -667,7 +701,9 @@
buffer = PyBuffer_New(get_raw_bytes_size(format));
PyObject_AsWriteBuffer(buffer, (void **)&data, &len);
+ Py_BEGIN_ALLOW_THREADS
get_raw_bytes(format, data);
+ Py_END_ALLOW_THREADS
return buffer;
}
}
@@ -708,8 +744,11 @@
/* set the image format to be the format of the extension of our last */
/* argument - i.e. .png = png, .tif = tiff etc. */
+ Py_BEGIN_ALLOW_THREADS
imlib_image_set_format(ext);
imlib_save_image(filename);
+ Py_END_ALLOW_THREADS
+
Py_INCREF(Py_None);
return Py_None;
}
Modified: trunk/imlib2/src/imlib2.c
==============================================================================
--- trunk/imlib2/src/imlib2.c (original)
+++ trunk/imlib2/src/imlib2.c Fri Jan 4 15:07:20 2008
@@ -91,10 +91,12 @@
}
if (!strcmp(from_format, "BGRA")) {
+ Py_BEGIN_ALLOW_THREADS
if (copy)
image = imlib_create_image_using_copied_data(w, h, bytes);
else
image = imlib_create_image_using_data(w, h, bytes);
+ Py_END_ALLOW_THREADS
} else {
bytes = (void *)convert_raw_rgba_bytes(from_format, "BGRA", bytes,
NULL, w, h);
image = imlib_create_image_using_copied_data(w, h, bytes);
@@ -138,10 +140,12 @@
Image_PyObject *o;
Imlib_Load_Error error_return = IMLIB_LOAD_ERROR_NONE;
+ Py_BEGIN_ALLOW_THREADS
if (use_cache)
image = imlib_load_image_with_error_return(filename, &error_return);
else
image = imlib_load_image_immediately_without_cache(filename);
+ Py_END_ALLOW_THREADS
if (!image) {
if (error_return == IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT)
@@ -295,4 +299,5 @@
api_ptrs[1] = (void *)&Image_PyObject_Type;
c_api = PyCObject_FromVoidPtr((void *)api_ptrs, NULL);
PyModule_AddObject(m, "_C_API", c_api);
+ PyEval_InitThreads();
}
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog