X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkborderimage.c;h=e43abc6ce39bdf039804446c092e30ebaa98cb13;hb=9d0febc9a64a5bfb0fcfc3a88de4757f6c1ff090;hp=f9c124673d6912cd90c64daa5ede120a45faf4a9;hpb=37b11b6c8a3dd9ad0694a052d4f19f76caca9dde;p=~andy%2Fgtk diff --git a/gtk/gtkborderimage.c b/gtk/gtkborderimage.c index f9c124673..e43abc6ce 100644 --- a/gtk/gtkborderimage.c +++ b/gtk/gtkborderimage.c @@ -16,9 +16,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include @@ -28,160 +26,37 @@ #include "gtkborderimageprivate.h" #include "gtkstylepropertiesprivate.h" +#include "gtkthemingengineprivate.h" /* this is in case round() is not provided by the compiler, * such as in the case of C89 compilers, like MSVC */ #include "fallback-c89.c" -G_DEFINE_BOXED_TYPE (GtkBorderImage, _gtk_border_image, - _gtk_border_image_ref, _gtk_border_image_unref) - -enum { - BORDER_LEFT, - BORDER_MIDDLE, - BORDER_RIGHT, - BORDER_LAST, - BORDER_TOP = BORDER_LEFT, - BORDER_BOTTOM = BORDER_RIGHT -}; - -enum { - SIDE_TOP, - SIDE_RIGHT, - SIDE_BOTTOM, - SIDE_LEFT -}; - -struct _GtkBorderImage { - GtkCssImage *source; - - GtkBorder slice; - GtkBorder *width; - GtkCssBorderImageRepeat repeat; - - gint ref_count; -}; - -GtkBorderImage * -_gtk_border_image_new (GtkCssImage *source, - GtkBorder *slice, - GtkBorder *width, - GtkCssBorderImageRepeat *repeat) +gboolean +_gtk_border_image_init (GtkBorderImage *image, + GtkThemingEngine *engine) { - GtkBorderImage *image; - - image = g_slice_new0 (GtkBorderImage); - image->ref_count = 1; - - image->source = g_object_ref (source); - - if (slice != NULL) - image->slice = *slice; - - if (width != NULL) - image->width = gtk_border_copy (width); - - if (repeat != NULL) - image->repeat = *repeat; - - return image; -} - -GtkBorderImage * -_gtk_border_image_ref (GtkBorderImage *image) -{ - g_return_val_if_fail (image != NULL, NULL); - - image->ref_count++; - - return image; -} - -void -_gtk_border_image_unref (GtkBorderImage *image) -{ - g_return_if_fail (image != NULL); - - image->ref_count--; - - if (image->ref_count == 0) - { - g_object_unref (image->source); - - if (image->width != NULL) - gtk_border_free (image->width); - - g_slice_free (GtkBorderImage, image); - } -} - -GParameter * -_gtk_border_image_unpack (const GValue *value, - guint *n_params) -{ - GParameter *parameter = g_new0 (GParameter, 4); - GtkBorderImage *image = g_value_get_boxed (value); - - parameter[0].name = "border-image-source"; - g_value_init (¶meter[0].value, GTK_TYPE_CSS_IMAGE); - - parameter[1].name = "border-image-slice"; - g_value_init (¶meter[1].value, GTK_TYPE_BORDER); - - parameter[2].name = "border-image-repeat"; - g_value_init (¶meter[2].value, GTK_TYPE_CSS_BORDER_IMAGE_REPEAT); + GtkBorder *width; - parameter[3].name = "border-image-width"; - g_value_init (¶meter[3].value, GTK_TYPE_BORDER); + image->source = g_value_get_object (_gtk_theming_engine_peek_property (engine, "border-image-source")); + if (image->source == NULL) + return FALSE; - if (image != NULL) + image->slice = *(GtkBorder *) g_value_get_boxed (_gtk_theming_engine_peek_property (engine, "border-image-slice")); + width = g_value_get_boxed (_gtk_theming_engine_peek_property (engine, "border-image-width")); + if (width) { - g_value_set_object (¶meter[0].value, image->source); - g_value_set_boxed (¶meter[1].value, &image->slice); - g_value_set_boxed (¶meter[2].value, &image->repeat); - g_value_set_boxed (¶meter[3].value, image->width); + image->width = *width; + image->has_width = TRUE; } + else + image->has_width = FALSE; - *n_params = 4; - return parameter; -} + image->repeat = *(GtkCssBorderImageRepeat *) g_value_get_boxed ( + _gtk_theming_engine_peek_property (engine, "border-image-repeat")); -void -_gtk_border_image_pack (GValue *value, - GtkStyleProperties *props, - GtkStateFlags state) -{ - GtkBorderImage *image; - GtkBorder *slice, *width; - GtkCssBorderImageRepeat *repeat; - GtkCssImage *source; - const GValue *val; - - val = _gtk_style_properties_peek_property (props, - GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("border-image-source")), - state); - source = g_value_get_object (val); - if (source == NULL) - return; - - gtk_style_properties_get (props, state, - "border-image-slice", &slice, - "border-image-repeat", &repeat, - "border-image-width", &width, - NULL); - - image = _gtk_border_image_new (source, slice, width, repeat); - g_value_take_boxed (value, image); - - if (slice != NULL) - gtk_border_free (slice); - - if (width != NULL) - gtk_border_free (width); - - if (repeat != NULL) - g_free (repeat); + return TRUE; } typedef struct _GtkBorderImageSliceSize GtkBorderImageSliceSize; @@ -362,8 +237,8 @@ _gtk_border_image_render (GtkBorderImage *image, double source_width, source_height; int h, v; - if (image->width != NULL) - border_width = image->width; + if (image->has_width) + border_width = &image->width; _gtk_css_image_get_concrete_size (image->source, 0, 0,