static void set_property (GObject * instance, guint prop_id, GValue const *value, GParamSpec * pspec) { RsvgHandle *self = RSVG_HANDLE (instance); switch (prop_id) { case PROP_DPI_X: rsvg_handle_set_dpi_x_y (self, g_value_get_double (value), self->priv->dpi_y); break; case PROP_DPI_Y: rsvg_handle_set_dpi_x_y (self, self->priv->dpi_x, g_value_get_double (value)); break; case PROP_BASE_URI: rsvg_handle_set_base_uri (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (instance, prop_id, pspec); } }
static void ar_card_theme_kde_paint_card (ArCardTheme *card_theme, cairo_t *cr, int card_id) { ArCardThemePreimage *preimage_card_theme = (ArCardThemePreimage *) card_theme; ArCardThemeKDE *theme = (ArCardThemeKDE *) card_theme; ArSvg *svg = preimage_card_theme->cards_svg; char node[32]; cairo_rectangle_t *card_extents; cairo_matrix_t matrix; cairo_font_options_t *font_options; if (G_UNLIKELY (card_id == AR_CARD_SLOT)) { ar_svg_render_cairo (preimage_card_theme->slot_preimage, cr, preimage_card_theme->card_size.width, preimage_card_theme->card_size.height); return; } if (theme->legacy) ar_card_get_legacy_node_by_id_snprintf (node, sizeof (node), card_id); else ar_card_get_node_by_id_snprintf (node, sizeof (node), card_id); card_extents = ar_card_theme_kde_get_card_extents (theme, card_id, node); if (!card_extents) return; cairo_save (cr); font_options = ar_svg_get_font_options (svg); if (font_options) { cairo_set_antialias (cr, cairo_font_options_get_antialias (font_options)); cairo_set_font_options (cr, font_options); } cairo_matrix_init_identity (&matrix); cairo_matrix_scale (&matrix, preimage_card_theme->card_size.width / card_extents->width, preimage_card_theme->card_size.height / card_extents->height); cairo_matrix_translate (&matrix, -card_extents->x, -card_extents->y); cairo_set_matrix (cr, &matrix); rsvg_handle_render_cairo_sub (RSVG_HANDLE (svg), cr, node); cairo_restore (cr); }
static void get_property (GObject * instance, guint prop_id, GValue * value, GParamSpec * pspec) { RsvgHandle *self = RSVG_HANDLE (instance); RsvgDimensionData dim; switch (prop_id) { case PROP_DPI_X: g_value_set_double (value, self->priv->dpi_x); break; case PROP_DPI_Y: g_value_set_double (value, self->priv->dpi_y); break; case PROP_BASE_URI: g_value_set_string (value, rsvg_handle_get_base_uri (self)); break; case PROP_WIDTH: rsvg_handle_get_dimensions (self, &dim); g_value_set_int (value, dim.width); break; case PROP_HEIGHT: rsvg_handle_get_dimensions (self, &dim); g_value_set_int (value, dim.height); break; case PROP_EM: rsvg_handle_get_dimensions (self, &dim); g_value_set_double (value, dim.em); break; case PROP_EX: rsvg_handle_get_dimensions (self, &dim); g_value_set_double (value, dim.ex); break; case PROP_TITLE: g_value_set_string (value, rsvg_handle_get_title (self)); break; case PROP_DESC: g_value_set_string (value, rsvg_handle_get_desc (self)); break; case PROP_METADATA: g_value_set_string (value, rsvg_handle_get_metadata (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (instance, prop_id, pspec); } }
static cairo_rectangle_t * ar_card_theme_kde_get_card_extents (ArCardThemeKDE *theme, int card_id, const char *node) { ArSvg *svg; cairo_rectangle_t *card_extents; cairo_rectangle_t rect; cairo_surface_t *surface; cairo_t *cr; card_extents = &theme->card_extents[card_id]; /* Is it initalised yet? */ if (card_extents->width != 0. && card_extents->height != 0.) return card_extents; svg = ((ArCardThemePreimage *) theme)->cards_svg; surface = cairo_recording_surface_create (CAIRO_CONTENT_ALPHA, NULL); cr = cairo_create (surface); cairo_set_tolerance (cr, 1.); ar_profilestart ("getting ink extents for node %s", node); rsvg_handle_render_cairo_sub (RSVG_HANDLE (svg), cr, node); ar_profileend ("getting ink extents for node %s", node); cairo_destroy (cr); cairo_recording_surface_ink_extents (surface, &rect.x, &rect.y, &rect.width, &rect.height); cairo_surface_destroy (surface); ar_debug_print (AR_DEBUG_CARD_THEME, "card %s %.3f x%.3f at (%.3f | %.3f)\n", node, card_extents->width, card_extents->height, card_extents->x, card_extents->y); *card_extents = rect; /* Sanity check; necessary? */ if (rect.width == 0. || rect.height == 0.) return NULL; return card_extents; }
/** * rsvg_handle_new: * * Returns a new rsvg handle. Must be freed with @g_object_unref. This * handle can be used for dynamically loading an image. You need to feed it * data using @rsvg_handle_write, then call @rsvg_handle_close when done. * Afterwords, you can render it using Cairo or get a GdkPixbuf from it. When * finished, free with g_object_unref(). No more than one image can be loaded * with one handle. * * Returns: A new #RsvgHandle **/ RsvgHandle * rsvg_handle_new (void) { return RSVG_HANDLE (g_object_new (RSVG_TYPE_HANDLE, NULL)); }
static gboolean ar_card_theme_kde_load (ArCardTheme *card_theme, GError **error) { static const char extra_backs[][11] = { "#blue_back", "#red_back", "#green_back" }; ArCardThemeKDE *theme = (ArCardThemeKDE *) card_theme; ArSvg *svg; RsvgHandle *rsvg_handle; char node[32]; guint i; gboolean has_red_joker, has_black_joker, has_joker; if (!AR_CARD_THEME_CLASS (ar_card_theme_kde_parent_class)->load (card_theme, error)) return FALSE; svg = ((ArCardThemePreimage *) theme)->cards_svg; rsvg_handle = RSVG_HANDLE (svg); /* Check available backs */ g_assert (theme->n_backs == 0); ar_card_get_node_by_id_snprintf (node, sizeof (node), AR_CARD_BACK); if (rsvg_handle_has_sub (rsvg_handle, node)) { theme->backs[theme->n_backs++] = g_strdup (node); } for (i = 0; i < G_N_ELEMENTS (extra_backs); ++i) { if (rsvg_handle_has_sub (rsvg_handle, extra_backs[i])) { theme->backs[theme->n_backs++] = g_strdup (extra_backs[i]); } } for (i = 1; i < 10; ++i) { g_snprintf (node, sizeof (node), "#back_c%d", i); if (rsvg_handle_has_sub (rsvg_handle, node)) { theme->backs[theme->n_backs++] = g_strdup (node); } } /* No backs at all? Fail! */ if (theme->n_backs == 0) { g_set_error (error, AR_CARD_THEME_ERROR, AR_CARD_THEME_ERROR_MISSING_ELEMENT, "Missing element for card back"); return FALSE; } /* Look for the jokers */ ar_card_get_node_by_id_snprintf (node, sizeof (node), AR_CARD_BLACK_JOKER); has_black_joker = rsvg_handle_has_sub (rsvg_handle, node); ar_card_get_node_by_id_snprintf (node, sizeof (node), AR_CARD_RED_JOKER); has_red_joker = rsvg_handle_has_sub (rsvg_handle, node); has_joker = rsvg_handle_has_sub (rsvg_handle, "#joker"); theme->has_2_jokers = has_red_joker && has_black_joker; theme->has_joker = has_joker; ar_card_get_legacy_node_by_suit_and_rank_snprintf (node, sizeof (node), AR_CARDS_CLUBS, AR_CARD_ACE); theme->legacy = rsvg_handle_has_sub (rsvg_handle, node); /* Get the card_extents of the card back, which we use to compute the theme's aspect ratio */ if (!ar_card_theme_kde_get_card_extents (theme, AR_CARD_BACK, theme->backs[theme->back_index])) { g_set_error (error, AR_CARD_THEME_ERROR, AR_CARD_THEME_ERROR_GENERIC, "Failed to get the theme's aspect ratio"); return FALSE; } return TRUE; }