X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libdocument%2Fev-document-misc.c;h=01676b5306c2faca791858266e9cc6e379c4bb6f;hb=a0b6675d1a0b196e88de6afb64ac3e495a02d8d9;hp=de4040510a52d414c46c02129cdc25f797ac4271;hpb=c2ef0e90bc49e315f8241860419ef69320b7bd39;p=evince.git diff --git a/libdocument/ev-document-misc.c b/libdocument/ev-document-misc.c index de404051..01676b53 100644 --- a/libdocument/ev-document-misc.c +++ b/libdocument/ev-document-misc.c @@ -56,7 +56,7 @@ create_thumbnail_frame (int width, } /* make sure no one is passing us garbage */ - g_assert (width_r >= 0 && height_r >= 0); + g_return_val_if_fail (width_r >= 0 && height_r >= 0, NULL); retval = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, @@ -133,45 +133,57 @@ ev_document_misc_get_page_border_size (gint page_width, void -ev_document_misc_paint_one_page (GdkDrawable *drawable, +ev_document_misc_paint_one_page (cairo_t *cr, GtkWidget *widget, GdkRectangle *area, GtkBorder *border, gboolean highlight, gboolean inverted_colors) { - GtkStyle *style = gtk_widget_get_style (widget); - GtkStateType state = gtk_widget_get_state (widget); - - gdk_draw_rectangle (drawable, - highlight ? style->text_gc[state] : style->dark_gc[state], - TRUE, - area->x, - area->y, - area->width, - area->height); - gdk_draw_rectangle (drawable, - inverted_colors ? style->black_gc : style->white_gc, - TRUE, - area->x + border->left, - area->y + border->top, - area->width - (border->left + border->right), - area->height - (border->top + border->bottom)); - gdk_draw_rectangle (drawable, - style->mid_gc[state], - TRUE, - area->x, - area->y + area->height - (border->bottom - border->top), - border->bottom - border->top, - border->bottom - border->top); - gdk_draw_rectangle (drawable, - style->mid_gc[state], - TRUE, - area->x + area->width - (border->right - border->left), - area->y, - border->right - border->left, - border->right - border->left); - + GtkStyleContext *context = gtk_widget_get_style_context (widget); + GtkStateFlags state = gtk_widget_get_state_flags (widget); + GdkRGBA fg, bg, shade_bg; + GtkSymbolicColor *c1, *c2; + + gtk_style_context_get_background_color (context, state, &bg); + gtk_style_context_get_color (context, state, &fg); + + // FIXME: should we cache the shade_bg? + c1 = gtk_symbolic_color_new_literal (&bg); + c2 = gtk_symbolic_color_new_shade (c1, 0.7); + gtk_symbolic_color_resolve (c2, NULL, &shade_bg); + gtk_symbolic_color_unref (c1); + gtk_symbolic_color_unref (c2); + + gdk_cairo_set_source_rgba (cr, highlight ? &fg : &shade_bg); + gdk_cairo_rectangle (cr, area); + cairo_fill (cr); + + if (inverted_colors) + cairo_set_source_rgb (cr, 0, 0, 0); + else + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, + area->x + border->left, + area->y + border->top, + area->width - (border->left + border->right), + area->height - (border->top + border->bottom)); + cairo_fill (cr); + + gdk_cairo_set_source_rgba (cr, &bg); + cairo_rectangle (cr, + area->x, + area->y + area->height - (border->bottom - border->top), + border->bottom - border->top, + border->bottom - border->top); + cairo_fill (cr); + + cairo_rectangle (cr, + area->x + area->width - (border->right - border->left), + area->y, + border->right - border->left, + border->right - border->left); + cairo_fill (cr); } cairo_surface_t * @@ -180,6 +192,8 @@ ev_document_misc_surface_from_pixbuf (GdkPixbuf *pixbuf) cairo_surface_t *surface; cairo_t *cr; + g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, gdk_pixbuf_get_width (pixbuf), @@ -195,68 +209,12 @@ ev_document_misc_surface_from_pixbuf (GdkPixbuf *pixbuf) GdkPixbuf * ev_document_misc_pixbuf_from_surface (cairo_surface_t *surface) { - GdkPixbuf *pixbuf; - cairo_surface_t *image; - cairo_t *cr; - gboolean has_alpha; - gint width, height; - cairo_format_t surface_format; - gint pixbuf_n_channels; - gint pixbuf_rowstride; - guchar *pixbuf_pixels; - gint x, y; - - width = cairo_image_surface_get_width (surface); - height = cairo_image_surface_get_height (surface); - - surface_format = cairo_image_surface_get_format (surface); - has_alpha = (surface_format == CAIRO_FORMAT_ARGB32); + g_return_val_if_fail (surface, NULL); - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - TRUE, 8, - width, height); - pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf); - pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixbuf_pixels = gdk_pixbuf_get_pixels (pixbuf); - - image = cairo_image_surface_create_for_data (pixbuf_pixels, - surface_format, - width, height, - pixbuf_rowstride); - cr = cairo_create (image); - cairo_set_source_surface (cr, surface, 0, 0); - - if (has_alpha) - cairo_mask_surface (cr, surface, 0, 0); - else - cairo_paint (cr); - - cairo_destroy (cr); - cairo_surface_destroy (image); - - for (y = 0; y < height; y++) { - guchar *p = pixbuf_pixels + y * pixbuf_rowstride; - - for (x = 0; x < width; x++) { - guchar tmp; - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - tmp = p[0]; - p[0] = p[2]; - p[2] = tmp; - p[3] = (has_alpha) ? p[3] : 0xff; -#else - tmp = p[0]; - p[0] = p[1]; - p[1] = p[2]; - p[2] = p[3]; - p[3] = (has_alpha) ? tmp : 0xff; -#endif - p += pixbuf_n_channels; - } - } - - return pixbuf; + return gdk_pixbuf_get_from_surface (surface, + 0, 0, + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); } cairo_surface_t * @@ -321,7 +279,6 @@ ev_document_misc_surface_rotate_and_scale (cairo_surface_t *surface, void ev_document_misc_invert_surface (cairo_surface_t *surface) { -#if CAIRO_VERSION > CAIRO_VERSION_ENCODE(1, 9, 2) cairo_t *cr; cr = cairo_create (surface); @@ -331,30 +288,6 @@ ev_document_misc_invert_surface (cairo_surface_t *surface) { cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint(cr); cairo_destroy (cr); -#else - guchar *data; - gint rowstride; - gint width, height; - gint x, y; - - data = cairo_image_surface_get_data (surface); - rowstride = cairo_image_surface_get_stride (surface); - width = cairo_image_surface_get_width (surface); - height = cairo_image_surface_get_height (surface); - - for (y = 0; y < height; y++) { - guchar *p = data + y * rowstride; - - for (x = 0; x < width; x++) { - p[0] = 255 - p[0]; - p[1] = 255 - p[1]; - p[2] = 255 - p[2]; - p += 4; - } - } - - cairo_surface_mark_dirty (surface); -#endif } void