GdkPixbuf *ASImage2GdkPixbuf (ASImage * im) { GdkPixbuf *pb = NULL; if (im) { int k = 0, i; int size = im->width * im->height; guchar *data; ASImageDecoder *imdec; data = safemalloc (size * 4); if ((imdec = start_image_decoding (get_screen_visual (NULL), im, SCL_DO_ALL, 0, 0, im->width, im->height, NULL)) != NULL) { for (i = 0; i < (int)im->height; i++) { CARD32 *r, *g, *b, *a; int x; imdec->decode_image_scanline (imdec); r = imdec->buffer.red; g = imdec->buffer.green; b = imdec->buffer.blue; a = imdec->buffer.alpha; for (x = 0; x < im->width; ++x) { data[k] = r[x]; data[++k] = g[x]; data[++k] = b[x]; data[++k] = a[x]; ++k; } } stop_image_decoding (&imdec); } pb = gdk_pixbuf_new_from_data (data, GDK_COLORSPACE_RGB, True, 8, im->width, im->height, im->width * 4, free_buffer, NULL); if (pb == NULL) free (data); } return pb; }
static void refresh_gradient_preview(ASGtkGradient *ge) { int width = get_screen_width(NULL); int height = get_screen_height(NULL); struct ASGradient gradient ; struct ASImageListEntry *entry; ARGB32 *color ; double *offset ; if( ge->points->count <= 0 ) return ; if( GTK_WIDGET_STATE( ge->width_entry) != GTK_STATE_INSENSITIVE ) if( (width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ge->width_entry))) == 0 ) width = get_screen_width(NULL) ; if( GTK_WIDGET_STATE( ge->height_entry) != GTK_STATE_INSENSITIVE ) if( (height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ge->height_entry))) == 0 ) height = get_screen_height(NULL) ; entry = create_asimage_list_entry(); /* rendering gradient preview : */ gradient.npoints = 0 ; gradient.type = ge->type ; gradient.offset = offset = safemalloc((ge->points->count+2) * sizeof(double) ); gradient.color = color = safemalloc((ge->points->count+2) * sizeof(ARGB32) ); ++gradient.offset ; ++gradient.color ; iterate_asbidirlist( ge->points, add_point_to_gradient, &gradient, NULL, False ); if( gradient.offset[0] > 0. ) { --gradient.offset ; --gradient.color ; gradient.offset[0] = 0. ; gradient.color[0] = DEFAULT_COLOR ; /* black */ ++gradient.npoints; } if( gradient.offset[gradient.npoints-1] < 1. ) { gradient.offset[gradient.npoints] = 1. ; gradient.color[gradient.npoints] = DEFAULT_COLOR ; /* black */ ++gradient.npoints; } entry->preview = make_gradient(get_screen_visual(NULL), &gradient, width, height, SCL_DO_ALL, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT); free( offset ); free( color ); /* applying gradient preview : */ if( entry->preview ) asgtk_image_view_set_entry ( ge->image_view, entry); else asgtk_image_view_set_entry ( ge->image_view, NULL); unref_asimage_list_entry( entry ); }
static void display_image_view (ASGtkImageView * iv) { ASImage *im = iv->image_entry ? iv->image_entry->preview : NULL; GdkPixbuf *pb = NULL; ASImage *scaled = NULL, *tiled = NULL; int scaled_w, scaled_h; int tiled_h, tiled_w; ASVisual *asv = get_screen_visual (NULL); int view_w, view_h; if (im == NULL) { gtk_image_set_from_stock (GTK_IMAGE (iv->view), GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON); return; } #if 1 view_w = iv->view_width; view_h = iv->view_height; if (view_w <= 0 || view_h <= 0) return; scaled_w = im->width; scaled_h = im->height; if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_SCALE_TO_VIEW)) { if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_TILE_TO_ASPECT) && iv->aspect_x > 0 && iv->aspect_y > 0) { scaled_w = (im->width * view_w) / iv->aspect_x; scaled_h = (im->height * view_h) / iv->aspect_y; } else { scaled_w = view_w; scaled_h = view_h; } } else if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_SCALE_TO_ASPECT) && iv->aspect_x > 0 && iv->aspect_y > 0) { scaled_w = iv->aspect_x; scaled_h = iv->aspect_y; } tiled_w = scaled_w; tiled_h = scaled_h; if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_TILE_TO_ASPECT) && iv->aspect_x > 0 && iv->aspect_y > 0) { if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_SCALE_TO_VIEW)) { if (tiled_w < view_w) tiled_w = view_w; if (tiled_h < view_h) tiled_h = view_h; } else { if (tiled_w < iv->aspect_x) tiled_w = iv->aspect_x; if (tiled_h < iv->aspect_y) tiled_h = iv->aspect_y; } } if (get_flags (iv->flags, ASGTK_IMAGE_VIEW_TILE_TO_VIEW)) { if (tiled_w < view_w) tiled_w = view_w; if (tiled_h < view_h) tiled_h = view_h; } LOCAL_DEBUG_OUT ("scaled size is %dx%d, tiled size %dx%d", scaled_w, scaled_h, tiled_w, tiled_h); if (scaled_w != im->width || scaled_h != im->height) { scaled = scale_asimage (asv, im, scaled_w, scaled_h, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT); if (scaled) im = scaled; } if (tiled_w != im->width || tiled_h != im->height) { tiled = tile_asimage (asv, im, 0, 0, tiled_w, tiled_h, TINT_LEAVE_SAME, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT); if (tiled) im = tiled; } pb = ASImage2GdkPixbuf (im); if (tiled) destroy_asimage (&tiled); if (scaled) destroy_asimage (&scaled); if (pb) { gtk_image_set_from_pixbuf (GTK_IMAGE (iv->view), pb); g_object_unref (pb); } LOCAL_DEBUG_OUT ("####!!! recquisition is %dx%d", GTK_WIDGET (iv->view)->requisition.width, GTK_WIDGET (iv->view)->requisition.height); #endif }