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); }
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); }