Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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 );
	
}
Exemplo n.º 3
0
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
}