コード例 #1
0
ファイル: rs-loupe.c プロジェクト: dmuktro/rawstudio
static void
redraw(RSLoupe *loupe)
{
	if (!loupe->filter)
		return;

	if (!gtk_widget_is_drawable(loupe->canvas))
		return;

	cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(loupe->canvas));

	gint width;
	gint height;
	rs_filter_get_size_simple(loupe->filter, RS_FILTER_REQUEST_QUICK, &width, &height);

	/* Get window size */
	gint window_width, window_height;
	gtk_window_get_size(GTK_WINDOW(loupe), &window_width, &window_height);

	/* Create request ROI */
	RSFilterRequest *request = rs_filter_request_new();
	GdkRectangle roi;
	roi.x = CLAMP(loupe->center_x - window_width/2, 0, width-window_width-1);
	roi.y = CLAMP(loupe->center_y - window_height/2, 0, height-window_height-1);
	roi.width = window_width;
	roi.height = window_height;
	rs_filter_request_set_roi(request, &roi);
	rs_filter_param_set_object(RS_FILTER_PARAM(request), "colorspace", loupe->display_color_space);

	gdk_threads_leave();
	RSFilterResponse *response = rs_filter_get_image8(loupe->filter, request);
	gdk_threads_enter();
	GdkPixbuf *buffer = rs_filter_response_get_image8(response);
	g_object_unref(response);

	g_object_unref(request);

	gdk_cairo_set_source_pixbuf(cr, buffer, -roi.x, -roi.y);
	cairo_paint(cr);

	/* Draw border */
	cairo_rectangle(cr, 0.0, 0.0, roi.width, roi.height);
	cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
	cairo_stroke(cr);

	cairo_destroy(cr);

	g_object_unref(buffer);
}
コード例 #2
0
ファイル: rs-enfuse.c プロジェクト: bgromov/rawstudio
gint calculate_lightness(RSFilter *filter)
{
      RSFilterRequest *request = rs_filter_request_new();
      rs_filter_request_set_quick(RS_FILTER_REQUEST(request), TRUE);
      rs_filter_param_set_object(RS_FILTER_PARAM(request), "colorspace", rs_color_space_new_singleton("RSSrgb"));
      rs_filter_request_set_quick(RS_FILTER_REQUEST(request), TRUE);

      rs_filter_set_recursive(filter,
			      "bounding-box", TRUE,
			      "width", 256,
			      "height", 256,
			      NULL);

      RSFilterResponse *response = rs_filter_get_image8(filter, request);
      g_object_unref(request);

      if(!rs_filter_response_has_image8(response))
	return 127;

      GdkPixbuf *pixbuf = rs_filter_response_get_image8(response);
      g_object_unref(response);

      guchar *pixels = gdk_pixbuf_get_pixels(pixbuf);
      gint rowstride = gdk_pixbuf_get_rowstride(pixbuf);
      gint height = gdk_pixbuf_get_height(pixbuf);
      gint width = gdk_pixbuf_get_width(pixbuf);
      gint channels = gdk_pixbuf_get_n_channels(pixbuf);

      gint x,y,c;
      gulong sum = 0;
      gint num = 0;

      for (y = 0; y < height; y++)
        {
	  for (x = 0; x < width; x++)
	    {
	      for (c = 0; c < channels; c++)
		{
		  sum += pixels[x*c+y*rowstride];
		}
	    }
	}

      g_object_unref(pixbuf);

      num = width*height*channels;
      return (gint) (sum/num);
}