gtkcsslookup.c 4.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* GTK - The GIMP Toolkit
 * Copyright (C) 2011 Benjamin Otte <otte@gnome.org>
 *
 * 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
Javier Jardón's avatar
Javier Jardón committed
15
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 17 18 19 20 21
 */

#include "config.h"

#include "gtkcsslookupprivate.h"

22
#include "gtkcssstylepropertyprivate.h"
23 24
#include "gtkcsstypesprivate.h"
#include "gtkprivatetypebuiltins.h"
25
#include "gtkprivate.h"
26 27

GtkCssLookup *
28
_gtk_css_lookup_new (const GtkBitmask *relevant)
29 30 31
{
  GtkCssLookup *lookup;

32
  lookup = g_malloc0 (sizeof (GtkCssLookup));
33 34 35 36 37 38 39 40

  if (relevant)
    {
      lookup->missing = _gtk_bitmask_copy (relevant);
    }
  else
    {
      lookup->missing = _gtk_bitmask_new ();
41
      lookup->missing = _gtk_bitmask_invert_range (lookup->missing, 0, GTK_CSS_PROPERTY_N_PROPERTIES);
42
    }
43 44 45 46 47 48 49

  return lookup;
}

void
_gtk_css_lookup_free (GtkCssLookup *lookup)
{
50
  gtk_internal_return_if_fail (lookup != NULL);
51 52 53 54 55 56 57 58 59

  _gtk_bitmask_free (lookup->missing);
  g_free (lookup);
}

gboolean
_gtk_css_lookup_is_missing (const GtkCssLookup *lookup,
                            guint               id)
{
60
  gtk_internal_return_val_if_fail (lookup != NULL, FALSE);
61

62
  return _gtk_bitmask_get (lookup->missing, id);
63 64
}

65 66 67 68
/**
 * _gtk_css_lookup_set:
 * @lookup: the lookup
 * @id: id of the property to set, see _gtk_style_property_get_id()
69
 * @section: (allow-none): The @section the value was defined in or %NULL
70
 * @value: the “cascading value” to use
71 72 73
 *
 * Sets the @value for a given @id. No value may have been set for @id
 * before. See _gtk_css_lookup_is_missing(). This function is used to
74
 * set the “winning declaration” of a lookup. Note that for performance
75 76
 * reasons @value and @section are not copied. It is your responsibility
 * to ensure they are kept alive until _gtk_css_lookup_free() is called.
77
 **/
78
void
79 80 81
_gtk_css_lookup_set (GtkCssLookup  *lookup,
                     guint          id,
                     GtkCssSection *section,
82
                     GtkCssValue   *value)
83
{
84 85 86
  gtk_internal_return_if_fail (lookup != NULL);
  gtk_internal_return_if_fail (_gtk_bitmask_get (lookup->missing, id));
  gtk_internal_return_if_fail (value != NULL);
87

88
  lookup->missing = _gtk_bitmask_set (lookup->missing, id, FALSE);
89 90
  lookup->values[id].value = value;
  lookup->values[id].section = section;
91 92
}

93 94 95
/**
 * _gtk_css_lookup_resolve:
 * @lookup: the lookup
96
 * @context: the context the values are resolved for
97
 * @values: a new #GtkCssStyle to be filled with the new properties
98 99
 *
 * Resolves the current lookup into a styleproperties object. This is done
100
 * by converting from the “winning declaration” to the “computed value”.
101
 *
102
 * XXX: This bypasses the notion of “specified value”. If this ever becomes
103 104
 * an issue, go fix it.
 **/
105
void
106 107
_gtk_css_lookup_resolve (GtkCssLookup            *lookup,
                         GtkStyleProviderPrivate *provider,
108
                         GtkCssStaticStyle       *style,
109
                         GtkCssStyle             *parent_style)
110
{
111
  guint i;
112

113 114 115 116
  gtk_internal_return_if_fail (lookup != NULL);
  gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
  gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style));
  gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style));
117

118
  for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++)
119
    {
120 121
      if (lookup->values[i].value ||
          _gtk_bitmask_get (lookup->missing, i))
122
        gtk_css_static_style_compute_value (style,
123 124 125 126 127
                                            provider,
                                            parent_style,
                                            i,
                                            lookup->values[i].value,
                                            lookup->values[i].section);
128
      /* else not a relevant property */
129 130
    }
}