diff options
| author | SND\edgbla_cp <SND\edgbla_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-02-26 20:12:57 +0000 |
|---|---|---|
| committer | SND\edgbla_cp <SND\edgbla_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-02-26 20:12:57 +0000 |
| commit | b96e8eb13a9eb9331b5ffb0f5653ad0215a6736c (patch) | |
| tree | d11da1a07e6aab84faa5e64c19e2324ab580a5b2 | |
| parent | 274576f0015b79aaeb9ebf41d9bf3ce91be62d82 (diff) | |
| download | pcsxr-b96e8eb13a9eb9331b5ffb0f5653ad0215a6736c.tar.gz | |
rm gdk-compat.h;
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@83177 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rwxr-xr-x | gui/DebugMemory.c | 6 | ||||
| -rwxr-xr-x | gui/MemcardDlg.c | 198 | ||||
| -rwxr-xr-x | gui/gdk-compat.h | 155 |
3 files changed, 72 insertions, 287 deletions
diff --git a/gui/DebugMemory.c b/gui/DebugMemory.c index 61739978..9aac8a98 100755 --- a/gui/DebugMemory.c +++ b/gui/DebugMemory.c @@ -310,11 +310,9 @@ void RunDebugMemoryDialog() { pfd = pango_font_description_from_string("Bitstream Vera Sans Mono, " "DejaVu Sans Mono, Liberation Mono, FreeMono, Sans Mono 9"); -#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_override_font(widget, pfd); -#else - gtk_widget_modify_font(widget, pfd); -#endif + pango_font_description_free(pfd); UpdateMemViewDlg(); diff --git a/gui/MemcardDlg.c b/gui/MemcardDlg.c index b7a2b533..90725d9d 100755 --- a/gui/MemcardDlg.c +++ b/gui/MemcardDlg.c @@ -28,10 +28,6 @@ #include "Linux.h" #include "../libpcsxcore/sio.h" -#if GTK_CHECK_VERSION(2, 20, 0) && !GTK_CHECK_VERSION(3, 0, 0) -#include "gdk-compat.h" -#endif - #define MAX_MEMCARD_BLOCKS 15 static gboolean quit; @@ -86,79 +82,26 @@ static void AddColumns(GtkTreeView *treeview) { gtk_tree_view_append_column(treeview, column); } -#if GTK_CHECK_VERSION(2, 20, 0) -static GdkPixbuf *SetIcon(GtkWidget *dialog, short *icon, int scale) { - GdkPixbuf *pixbuf; - cairo_surface_t *s; - cairo_t *cr; - int x, y, c, i, r, g, b; - int size = 16 * scale; - s = cairo_image_surface_create(CAIRO_FORMAT_RGB24, size, size); - cr = cairo_create(s); - cairo_scale(cr, scale, scale); - for (i=0; i< 256; i++) { - x = (i % 16); - y = (i / 16); - c = icon[i]; - r = (c & 0x001f) << 3; - g = ((c & 0x03e0) >> 5) << 3; - b = ((c & 0x7c00) >> 10) << 3; - cairo_rectangle(cr, x, y, 1, 1); - cairo_set_source_rgb(cr, r/255.0, g/255.0, b/255.0); - cairo_fill(cr); - } - cairo_destroy(cr); -#if GTK_CHECK_VERSION(3, 0, 0) - pixbuf = gdk_pixbuf_get_from_surface(s, 0, 0, size, size); -#else - pixbuf = compat_gdk_pixbuf_get_from_surface(s, 0, 0, size, size); -#endif - cairo_surface_destroy(s); - return pixbuf; -} - -#else static GdkPixbuf *SetIcon(GtkWidget *dialog, short *icon, int i) { - GdkPixmap *pixmap; - GdkImage *image; - GdkVisual *visual; - GdkPixbuf *pixbuf; - GdkGC *gc; - int x, y, c; - - visual = gdk_window_get_visual(gtk_widget_get_window(dialog)); - - if (visual->depth == 8) return NULL; - - image = gdk_image_new(GDK_IMAGE_NORMAL, visual, 32, 32); - + GdkPixbuf *result; + guchar *dest_pixels; + u32 x, y, c; + + result = gdk_pixbuf_new(GDK_COLORSPACE_RGB, 0, 8, 32, 32); + dest_pixels = gdk_pixbuf_get_pixels(result); + for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { - c = icon[(y>>1) * 16 + (x>>1)]; - c = ((c & 0x001f) << 10) | ((c & 0x7c00) >> 10) | (c & 0x03e0); - if (visual->depth == 16) - c = (c & 0x001f) | ((c & 0x7c00) << 1) | ((c & 0x03e0) << 1); - else if (visual->depth == 24 || visual->depth == 32) - c = ((c & 0x001f) << 3) | ((c & 0x03e0) << 6) | ((c & 0x7c00) << 9); - - gdk_image_put_pixel(image, x, y, c); + c = icon[(y >> 1) * 16 + (x >> 1)]; + dest_pixels[0] = (c & 0x001f) << 3; + dest_pixels[1] = (c & 0x03e0) >> 2; + dest_pixels[2] = (c & 0x7c00) >> 7; + dest_pixels += 3; } } - - pixmap = gdk_pixmap_new(gtk_widget_get_window(dialog), 32, 32, visual->depth); - - gc = gdk_gc_new(pixmap); - gdk_draw_image(pixmap, gc, image, 0, 0, 0, 0, 32, 32); - gdk_gc_destroy(gc); - gdk_image_destroy(image); - - pixbuf = gdk_pixbuf_get_from_drawable(NULL, GDK_PIXMAP (pixmap), NULL, - 0, 0, 0, 0, -1, -1); - g_object_unref(pixmap); - return pixbuf; + return result; } -#endif static gchar* MCDStatusToChar(McdBlock *Info) { gchar *state; @@ -191,10 +134,10 @@ static void LoadListItems(int mcd, GtkWidget *widget) { store = gtk_list_store_new(NUM_CL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - dialog = GTK_WIDGET(gtk_builder_get_object(builder, "McdsDlg")); + dialog = gtk_builder_get_object(builder, "McdsDlg"); - if (mcd == 1) List = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList1")); - else List = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList2")); + if (mcd == 1) List = gtk_builder_get_object(builder, "GtkCList_McdList1"); + else List = gtk_builder_get_object(builder, "GtkCList_McdList2"); for (i = 0; i < MAX_MEMCARD_BLOCKS; i++) { McdBlock *Info; @@ -236,14 +179,14 @@ static void UpdateFilenameButtons(GtkWidget *widget) { const char *filename; gchar *p; - dialog = GTK_WIDGET(gtk_builder_get_object(builder, "McdsDlg")); + dialog = gtk_builder_get_object(builder, "McdsDlg"); for (i = 0; i < 2; i++) { if (i == 0) { - widget = GTK_WIDGET(gtk_builder_get_object(builder, "Mcd1Label")); + widget = gtk_builder_get_object(builder, "Mcd1Label"); filename = Config.Mcd1; } else { - widget = GTK_WIDGET(gtk_builder_get_object(builder, "Mcd2Label")); + widget = gtk_builder_get_object(builder, "Mcd2Label"); filename = Config.Mcd2; } @@ -279,10 +222,10 @@ static void UpdateListItems(int mcd, GtkWidget *widget) { int i; gchar *title; - dialog = GTK_WIDGET(gtk_builder_get_object(builder, "McdsDlg")); + dialog = gtk_builder_get_object(builder, "McdsDlg"); - if (mcd == 1) List = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList1")); - else List = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList2")); + if (mcd == 1) List = gtk_builder_get_object(builder, "GtkCList_McdList1"); + else List = gtk_builder_get_object(builder, "GtkCList_McdList2"); store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(List))); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); @@ -322,7 +265,7 @@ static void UpdateListItems(int mcd, GtkWidget *widget) { gtk_widget_show(List); - OnTreeSelectionChanged(gtk_tree_view_get_selection(GTK_TREE_VIEW(List)), GINT_TO_POINTER(mcd)); + OnTreeSelectionChanged(gtk_tree_view_get_selection(GTK_TREE_VIEW(List)), (gpointer)mcd); } static void UpdateMcdDlg(GtkWidget *widget) { @@ -346,7 +289,7 @@ static void OnMcd_Close(GtkDialog *dialog, gint arg1, gpointer user_data) { } static void OnMcd_FileChange(GtkWidget *widget, gpointer user_data) { - gint memcard = GPOINTER_TO_INT(user_data); + gint memcard = (int)user_data; gchar *filename; GtkWidget *chooser; @@ -387,7 +330,7 @@ static void OnMcd_Format(GtkWidget *widget, gpointer user_data) { gint result; char *str; - gint memcard = GPOINTER_TO_INT(user_data); + gint memcard = (int)user_data; message_dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, @@ -416,7 +359,6 @@ static void OnMcd_Format(GtkWidget *widget, gpointer user_data) { static void OnMcd_New(GtkWidget *widget, gpointer user_data) { GtkWidget *chooser; gchar *path; - gint memcard = GPOINTER_TO_INT(user_data); // Ask for name of new memory card chooser = gtk_file_chooser_dialog_new(_("Create a new Memory Card"), @@ -439,10 +381,10 @@ static void OnMcd_New(GtkWidget *widget, gpointer user_data) { CreateMcd(name); - if (memcard == 1) strncpy(Config.Mcd1, name, MAXPATHLEN); + if ((int)user_data == 1) strncpy(Config.Mcd1, name, MAXPATHLEN); else strncpy(Config.Mcd2, name, MAXPATHLEN); - LoadMcd(memcard, name); + LoadMcd((int)user_data, name); LoadMcdDlg(widget); g_free(name); @@ -523,7 +465,7 @@ gint GetMcdBlockCount(gint mcd, gint startblock) { } static void OnMcd_CopyTo(GtkWidget *widget, gpointer user_data) { - gint dstmcd = GPOINTER_TO_INT(user_data); + gint dstmcd = (gint)user_data; gint srcmcd; GtkTreeIter iter; @@ -575,7 +517,7 @@ static void OnMcd_CopyTo(GtkWidget *widget, gpointer user_data) { for (j=0; j < count; j++) { CopyMemcardData(source, destination, (srci+j), (first_free_slot+j), str); - //printf("count = %i, firstfree=%i, i=%i\n", count, first_free_slot, j); + printf("count = %i, firstfree=%i, i=%i\n", count, first_free_slot, j); } UpdateMcdDlg(widget); @@ -593,16 +535,16 @@ static void OnMemcardDelete(GtkWidget *widget, gpointer user_data) { GtkWidget *tree; GtkTreeSelection *sel; - gint memcard = GPOINTER_TO_INT(user_data); + gint memcard = (int)user_data; if (memcard == 1) { - tree = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList1")); + tree = gtk_builder_get_object(builder, "GtkCList_McdList1"); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW (tree)); selected = gtk_tree_selection_get_selected (sel, &model, &iter); data = Mcd1Data; filename = Config.Mcd1; } else { - tree = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList2")); + tree = gtk_builder_get_object(builder, "GtkCList_McdList2"); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW (tree)); selected = gtk_tree_selection_get_selected(sel, &model, &iter); data = Mcd2Data; @@ -643,7 +585,7 @@ static void OnTreeSelectionChanged(GtkTreeSelection *selection, gpointer user_da int i; McdBlock b; - gint memcard = GPOINTER_TO_INT(user_data); + gint memcard = (int)user_data; selected = gtk_tree_selection_get_selected(selection, &model, &iter); @@ -658,38 +600,38 @@ static void OnTreeSelectionChanged(GtkTreeSelection *selection, gpointer user_da GetMcdBlockInfo(1, i + 1, &b); if ((b.Flags >= 0xA1 && b.Flags <= 0xA3) || ((b.Flags & 0xF0) == 0x50)) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete1")), TRUE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete1"), TRUE); } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete1")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete1"), FALSE); } if ((b.Flags & 0xF3) == 0x51) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo2")), TRUE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo2"), TRUE); } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo2")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo2"), FALSE); } } else { GetMcdBlockInfo(2, i + 1, &b); if ((b.Flags >= 0xA1 && b.Flags <= 0xA3) || ((b.Flags & 0xF0) == 0x50)) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete2")), TRUE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete2"), TRUE); } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete2")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete2"), FALSE); } if ((b.Flags & 0xF3) == 0x51) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo1")), TRUE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo1"), TRUE); } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo1")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo1"), FALSE); } } } else { if (memcard == 1) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo2")), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete1")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo2"), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete1"), FALSE); } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo1")), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete2")), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_CopyTo1"), FALSE); + gtk_widget_set_sensitive(gtk_builder_get_object(builder, "GtkButton_Delete2"), FALSE); } } } @@ -716,7 +658,7 @@ void OnConf_Mcds() { return; } - dialog = GTK_WIDGET(gtk_builder_get_object(builder, "McdsDlg")); + dialog = gtk_builder_get_object(builder, "McdsDlg"); gtk_window_set_title(GTK_WINDOW(dialog), _("Memory Card Manager")); gtk_widget_show (dialog); @@ -734,22 +676,22 @@ void OnConf_Mcds() { g_free(str); } - GtkCList_McdList1 = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList1")); + GtkCList_McdList1 = gtk_builder_get_object(builder, "GtkCList_McdList1"); AddColumns(GTK_TREE_VIEW(GtkCList_McdList1)); - GtkCList_McdList2 = GTK_WIDGET(gtk_builder_get_object(builder, "GtkCList_McdList2")); + GtkCList_McdList2 = gtk_builder_get_object(builder, "GtkCList_McdList2"); AddColumns(GTK_TREE_VIEW(GtkCList_McdList2)); treesel1 = gtk_tree_view_get_selection(GTK_TREE_VIEW (GtkCList_McdList1)); gtk_tree_selection_set_mode(treesel1, GTK_SELECTION_SINGLE); g_signal_connect_data(G_OBJECT(treesel1), "changed", G_CALLBACK(OnTreeSelectionChanged), - GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + (gpointer)1, NULL, G_CONNECT_AFTER); treesel2 = gtk_tree_view_get_selection(GTK_TREE_VIEW (GtkCList_McdList2)); gtk_tree_selection_set_mode(treesel2, GTK_SELECTION_SINGLE); g_signal_connect_data(G_OBJECT(treesel2), "changed", G_CALLBACK(OnTreeSelectionChanged), - GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + (gpointer)2, NULL, G_CONNECT_AFTER); LoadMcdDlg(dialog); @@ -757,48 +699,48 @@ void OnConf_Mcds() { g_signal_connect_data(G_OBJECT(dialog), "response", G_CALLBACK(OnMcd_Close), builder, (GClosureNotify)g_object_unref, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Format1")); + widget = gtk_builder_get_object(builder, "GtkButton_Format1"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_Format), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_Format), (gpointer)1, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Format2")); + widget = gtk_builder_get_object(builder, "GtkButton_Format2"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_Format), GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_Format), (gpointer)2, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "Mcd1Button")); + widget = gtk_builder_get_object(builder, "Mcd1Button"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_FileChange), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_FileChange), (gpointer)1, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "Mcd2Button")); + widget = gtk_builder_get_object(builder, "Mcd2Button"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_FileChange), GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_FileChange), (gpointer)2, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_New1")); + widget = gtk_builder_get_object(builder, "GtkButton_New1"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_New), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_New), (gpointer)1, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_New2")); + widget = gtk_builder_get_object(builder, "GtkButton_New2"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_New), GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_New), (gpointer)2, NULL, G_CONNECT_AFTER); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo1")); + widget = gtk_builder_get_object(builder, "GtkButton_CopyTo1"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_CopyTo), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_CopyTo), (gpointer)1, NULL, G_CONNECT_AFTER); gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_CopyTo2")); + widget = gtk_builder_get_object(builder, "GtkButton_CopyTo2"); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnMcd_CopyTo), GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMcd_CopyTo), (gpointer)2, NULL, G_CONNECT_AFTER); gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete1")); + widget = gtk_builder_get_object(builder, "GtkButton_Delete1"); g_signal_connect_data (G_OBJECT (widget), "clicked", - G_CALLBACK(OnMemcardDelete), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMemcardDelete), (gpointer)1, NULL, G_CONNECT_AFTER); gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE); - widget = GTK_WIDGET(gtk_builder_get_object(builder, "GtkButton_Delete2")); + widget = gtk_builder_get_object(builder, "GtkButton_Delete2"); g_signal_connect_data (G_OBJECT (widget), "clicked", - G_CALLBACK(OnMemcardDelete), GINT_TO_POINTER(2), NULL, G_CONNECT_AFTER); + G_CALLBACK(OnMemcardDelete), (gpointer)2, NULL, G_CONNECT_AFTER); gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE); quit = FALSE; diff --git a/gui/gdk-compat.h b/gui/gdk-compat.h deleted file mode 100755 index d19b311c..00000000 --- a/gui/gdk-compat.h +++ /dev/null @@ -1,155 +0,0 @@ -static cairo_format_t -compat_gdk_cairo_format_for_content (cairo_content_t content) -{ - switch (content) - { - case CAIRO_CONTENT_COLOR: - return CAIRO_FORMAT_RGB24; - case CAIRO_CONTENT_ALPHA: - return CAIRO_FORMAT_A8; - case CAIRO_CONTENT_COLOR_ALPHA: - default: - return CAIRO_FORMAT_ARGB32; - } -} - -static cairo_surface_t * -compat_gdk_cairo_surface_coerce_to_image (cairo_surface_t *surface, - cairo_content_t content, - int src_x, - int src_y, - int width, - int height) -{ - cairo_surface_t *copy; - cairo_t *cr; - - copy = cairo_image_surface_create (compat_gdk_cairo_format_for_content (content), - width, - height); - - cr = cairo_create (copy); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_surface (cr, surface, -src_x, -src_y); - cairo_paint (cr); - cairo_destroy (cr); - - return copy; -} - -static void -compat_convert_alpha (guchar *dest_data, - int dest_stride, - guchar *src_data, - int src_stride, - int src_x, - int src_y, - int width, - int height) -{ - int x, y; - - src_data += src_stride * src_y + src_x * 4; - - for (y = 0; y < height; y++) { - guint32 *src = (guint32 *) src_data; - - for (x = 0; x < width; x++) { - guint alpha = src[x] >> 24; - - if (alpha == 0) - { - dest_data[x * 4 + 0] = 0; - dest_data[x * 4 + 1] = 0; - dest_data[x * 4 + 2] = 0; - } - else - { - dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; - dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; - dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; - } - dest_data[x * 4 + 3] = alpha; - } - - src_data += src_stride; - dest_data += dest_stride; - } -} - -static void -compat_convert_no_alpha (guchar *dest_data, - int dest_stride, - guchar *src_data, - int src_stride, - int src_x, - int src_y, - int width, - int height) -{ - int x, y; - - src_data += src_stride * src_y + src_x * 4; - - for (y = 0; y < height; y++) { - guint32 *src = (guint32 *) src_data; - - for (x = 0; x < width; x++) { - dest_data[x * 3 + 0] = src[x] >> 16; - dest_data[x * 3 + 1] = src[x] >> 8; - dest_data[x * 3 + 2] = src[x]; - } - - src_data += src_stride; - dest_data += dest_stride; - } -} - -GdkPixbuf * -compat_gdk_pixbuf_get_from_surface (cairo_surface_t *surface, - gint src_x, - gint src_y, - gint width, - gint height) -{ - cairo_content_t content; - GdkPixbuf *dest; - - /* General sanity checks */ - g_return_val_if_fail (surface != NULL, NULL); - g_return_val_if_fail (width > 0 && height > 0, NULL); - - content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR; - dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - !!(content & CAIRO_CONTENT_ALPHA), - 8, - width, height); - - surface = compat_gdk_cairo_surface_coerce_to_image (surface, content, - src_x, src_y, - width, height); - cairo_surface_flush (surface); - if (cairo_surface_status (surface) || dest == NULL) - { - cairo_surface_destroy (surface); - return NULL; - } - - if (gdk_pixbuf_get_has_alpha (dest)) - compat_convert_alpha (gdk_pixbuf_get_pixels (dest), - gdk_pixbuf_get_rowstride (dest), - cairo_image_surface_get_data (surface), - cairo_image_surface_get_stride (surface), - 0, 0, - width, height); - else - compat_convert_no_alpha (gdk_pixbuf_get_pixels (dest), - gdk_pixbuf_get_rowstride (dest), - cairo_image_surface_get_data (surface), - cairo_image_surface_get_stride (surface), - 0, 0, - width, height); - - cairo_surface_destroy (surface); - return dest; -} |
