gtkcssnumbervalue.c 5.51 KB
Newer Older
1
/* GTK - The GIMP Toolkit
2
 * Copyright (C) 2016 Benjamin Otte <otte@gnome.org>
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * 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 "gtkcssnumbervalueprivate.h"

22
#include "gtkcsscalcvalueprivate.h"
23
#include "gtkcssdimensionvalueprivate.h"
24
#include "gtkcsswin32sizevalueprivate.h"
25

26 27 28 29
struct _GtkCssValue {
  GTK_CSS_VALUE_BASE
};

30 31
GtkCssDimension
gtk_css_number_value_get_dimension (const GtkCssValue *value)
32
{
33
  GtkCssNumberValueClass *number_value_class = (GtkCssNumberValueClass *) value->class;
34

35
  return number_value_class->get_dimension (value);
36 37
}

38 39
gboolean
gtk_css_number_value_has_percent (const GtkCssValue *value)
40
{
41
  GtkCssNumberValueClass *number_value_class = (GtkCssNumberValueClass *) value->class;
42

43
  return number_value_class->has_percent (value);
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
GtkCssValue *
gtk_css_number_value_multiply (const GtkCssValue *value,
                               double             factor)
{
  GtkCssNumberValueClass *number_value_class = (GtkCssNumberValueClass *) value->class;

  return number_value_class->multiply (value, factor);
}

GtkCssValue *
gtk_css_number_value_add (GtkCssValue *value1,
                          GtkCssValue *value2)
{
  GtkCssValue *sum;

  sum = gtk_css_number_value_try_add (value1, value2);
  if (sum == NULL)
    sum = gtk_css_calc_value_new_sum (value1, value2);

  return sum;
}

GtkCssValue *
gtk_css_number_value_try_add (const GtkCssValue *value1,
                              const GtkCssValue *value2)
{
  GtkCssNumberValueClass *number_value_class;
  
  if (value1->class != value2->class)
    return NULL;

  number_value_class = (GtkCssNumberValueClass *) value1->class;

  return number_value_class->try_add (value1, value2);
}

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
/*
 * gtk_css_number_value_get_calc_term_order:
 * @value: Value to compute order for
 *
 * Determines the position of @value when printed as part of a calc()
 * expression. Values with lower numbers are printed first. Note that
 * these numbers are arbitrary, so when adding new types of values to
 * print, feel free to change them in implementations so that they
 * match.
 *
 * Returns: Magic value determining placement when printing calc()
 *     expression.
 */
gint
gtk_css_number_value_get_calc_term_order (const GtkCssValue *value)
{
  GtkCssNumberValueClass *number_value_class = (GtkCssNumberValueClass *) value->class;

  return number_value_class->get_calc_term_order (value);
}

103 104 105 106
GtkCssValue *
_gtk_css_number_value_new (double     value,
                           GtkCssUnit unit)
{
107
  return gtk_css_dimension_value_new (value, unit);
108 109
}

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
GtkCssValue *
gtk_css_number_value_transition (GtkCssValue *start,
                                 GtkCssValue *end,
                                 guint        property_id,
                                 double       progress)
{
  GtkCssValue *result, *mul_start, *mul_end;

  mul_start = gtk_css_number_value_multiply (start, 1 - progress);
  mul_end = gtk_css_number_value_multiply (end, progress);

  result = gtk_css_number_value_add (mul_start, mul_end);

  _gtk_css_value_unref (mul_start);
  _gtk_css_value_unref (mul_end);

  return result;
}

129 130 131
gboolean
gtk_css_number_value_can_parse (GtkCssParser *parser)
{
132
  return _gtk_css_parser_has_number (parser)
133
      || _gtk_css_parser_has_prefix (parser, "calc")
134 135
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-size")
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-width")
136 137 138 139 140
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-height")
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-top")
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-left")
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-bottom")
      || _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-right");
141 142
}

143 144 145
GtkCssValue *
_gtk_css_number_value_parse (GtkCssParser           *parser,
                             GtkCssNumberParseFlags  flags)
146
{
147 148
  if (_gtk_css_parser_has_prefix (parser, "calc"))
    return gtk_css_calc_value_parse (parser, flags);
149 150
  if (_gtk_css_parser_has_prefix (parser, "-gtk-win32-size") ||
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-width") ||
151 152 153 154 155
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-height") ||
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-top") ||
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-left") ||
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-bottom") ||
      _gtk_css_parser_has_prefix (parser, "-gtk-win32-part-border-right"))
156
    return gtk_css_win32_size_value_parse (parser, flags);
157

158
  return gtk_css_dimension_value_parse (parser, flags);
159 160
}

161 162 163 164
double
_gtk_css_number_value_get (const GtkCssValue *number,
                           double             one_hundred_percent)
{
165 166
  GtkCssNumberValueClass *number_value_class;

167 168
  g_return_val_if_fail (number != NULL, 0.0);

169 170 171
  number_value_class = (GtkCssNumberValueClass *) number->class;

  return number_value_class->get (number, one_hundred_percent);
172 173
}