1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* CTK - The GIMP Toolkit
 * Copyright (C) 2011 Red Hat, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * 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, see <http://www.gnu.org/licenses/>.
 */

#include "config.h"

#include "ctkcssimagevalueprivate.h"

#include "ctkcssimagecrossfadeprivate.h"

struct _CtkCssValue {
  CTK_CSS_VALUE_BASE
  CtkCssImage *image;
};

static void
ctk_css_value_image_free (CtkCssValue *value)
{
  g_object_unref (value->image);
  g_slice_free (CtkCssValue, value);
}

static CtkCssValue *
ctk_css_value_image_compute (CtkCssValue             *value,
                             guint                    property_id,
                             CtkStyleProviderPrivate *provider,
                             CtkCssStyle             *style,
                             CtkCssStyle             *parent_style)
{
  CtkCssImage *image, *computed;
  
  image = _ctk_css_image_value_get_image (value);

  if (image == NULL)
    return _ctk_css_value_ref (value);

  computed = _ctk_css_image_compute (image, property_id, provider, style, parent_style);

  if (computed == image)
    {
      g_object_unref (computed);
      return _ctk_css_value_ref (value);
    }

  return _ctk_css_image_value_new (computed);
}

static gboolean
ctk_css_value_image_equal (const CtkCssValue *value1,
                           const CtkCssValue *value2)
{
  return _ctk_css_image_equal (value1->image, value2->image);
}

static CtkCssValue *
ctk_css_value_image_transition (CtkCssValue *start,<--- Parameter 'start' can be declared as pointer to const
                                CtkCssValue *end,<--- Parameter 'end' can be declared as pointer to const
                                guint        property_id,
                                double       progress)
{
  CtkCssImage *transition;

  transition = _ctk_css_image_transition (_ctk_css_image_value_get_image (start),
                                          _ctk_css_image_value_get_image (end),
                                          property_id,
                                          progress);
      
  return _ctk_css_image_value_new (transition);
}

static void
ctk_css_value_image_print (const CtkCssValue *value,
                           GString           *string)
{
  if (value->image)
    _ctk_css_image_print (value->image, string);
  else
    g_string_append (string, "none");
}

static const CtkCssValueClass CTK_CSS_VALUE_IMAGE = {
  ctk_css_value_image_free,
  ctk_css_value_image_compute,
  ctk_css_value_image_equal,
  ctk_css_value_image_transition,<--- You might need to cast the function pointer here<--- You might need to cast the function pointer here
  ctk_css_value_image_print
};

CtkCssValue *
_ctk_css_image_value_new (CtkCssImage *image)
{
  static CtkCssValue none_singleton = { &CTK_CSS_VALUE_IMAGE, 1, NULL };
  CtkCssValue *value;

  if (image == NULL)
    return _ctk_css_value_ref (&none_singleton);

  value = _ctk_css_value_new (CtkCssValue, &CTK_CSS_VALUE_IMAGE);
  value->image = image;

  return value;
}

CtkCssImage *
_ctk_css_image_value_get_image (const CtkCssValue *value)
{
  g_return_val_if_fail (value->class == &CTK_CSS_VALUE_IMAGE, NULL);

  return value->image;
}