]> Pileus Git - ~andy/gtk/commitdiff
Fix for #314004, reported by Michael Reinsch:
authorOwen Taylor <otaylor@redhat.com>
Wed, 24 Aug 2005 03:29:06 +0000 (03:29 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 24 Aug 2005 03:29:06 +0000 (03:29 +0000)
2005-08-23  Owen Taylor  <otaylor@redhat.com>

        Fix for #314004, reported by Michael Reinsch:

        * gdk/gdk.symbols:
        * gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
        Add gdk_screen_get/set_resolution_libgtk_only()

        * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
        the options for the screen on the newly created context.

        * gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c:
        Move font options and dpi code from gtkwidget.c to gtksettings.c, set
        the font options on the screen.

        * gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
        the font options from the screen and set them on the context.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gdk/gdk.symbols
gdk/gdkpango.c
gdk/gdkscreen.c
gdk/gdkscreen.h
gtk/gtksettings.c
gtk/gtkwidget.c

index 2581077c91a9cc35572e85ee658283dc078f4fad..16ccd72278ff29674c865a17e6b683a7efc0a8e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2005-08-23  Owen Taylor  <otaylor@redhat.com>
+
+       Fix for #314004, reported by Michael Reinsch:
+
+       * gdk/gdk.symbols:
+       * gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
+       Add gdk_screen_get/set_resolution_libgtk_only()
+
+       * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
+       the options for the screen on the newly created context.
+
+       * gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c: 
+       Move font options and dpi code from gtkwidget.c to gtksettings.c, set
+       the font options on the screen.
+
+       * gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
+       the font options from the screen and set them on the context.
+
 2005-08-23  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't
index 2581077c91a9cc35572e85ee658283dc078f4fad..16ccd72278ff29674c865a17e6b683a7efc0a8e5 100644 (file)
@@ -1,3 +1,21 @@
+2005-08-23  Owen Taylor  <otaylor@redhat.com>
+
+       Fix for #314004, reported by Michael Reinsch:
+
+       * gdk/gdk.symbols:
+       * gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
+       Add gdk_screen_get/set_resolution_libgtk_only()
+
+       * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
+       the options for the screen on the newly created context.
+
+       * gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c: 
+       Move font options and dpi code from gtkwidget.c to gtksettings.c, set
+       the font options on the screen.
+
+       * gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
+       the font options from the screen and set them on the context.
+
 2005-08-23  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't
index 2581077c91a9cc35572e85ee658283dc078f4fad..16ccd72278ff29674c865a17e6b683a7efc0a8e5 100644 (file)
@@ -1,3 +1,21 @@
+2005-08-23  Owen Taylor  <otaylor@redhat.com>
+
+       Fix for #314004, reported by Michael Reinsch:
+
+       * gdk/gdk.symbols:
+       * gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
+       Add gdk_screen_get/set_resolution_libgtk_only()
+
+       * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
+       the options for the screen on the newly created context.
+
+       * gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c: 
+       Move font options and dpi code from gtkwidget.c to gtksettings.c, set
+       the font options on the screen.
+
+       * gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
+       the font options from the screen and set them on the context.
+
 2005-08-23  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't
index 06bb4256e57ce347611244a169a94c95f794ec6f..c8c25e88c9f598d5efa49aca1aa8bc712696ec11 100644 (file)
@@ -962,6 +962,10 @@ gdk_draw_rgb_image_dithalign
 gdk_screen_get_type G_GNUC_CONST
 gdk_screen_get_monitor_at_point
 gdk_screen_get_monitor_at_window
+gdk_screen_set_font_options_libgtk_only
+gdk_screen_get_font_options_libgtk_only
+gdk_screen_set_resolution_libgtk_only
+gdk_screen_get_resolution_libgtk_only
 #endif
 #endif
 
index 52dcfebd4166c798204ab4ddd4e7a6a0544d4677..d1649e1ef9adf8694c4ae84288aeb6d66e7c2592 100644 (file)
@@ -1333,6 +1333,12 @@ gdk_pango_layout_get_clip_region (PangoLayout *layout,
  * instead of this function, to get the appropriate context for
  * the widget you intend to render text onto.
  * 
+ * The newly created context will have the default font options (see
+ * #cairo_font_options_t) for the default screen; if these options
+ * change it will not be updated. Using gtk_widget_get_pango_context()
+ * is more convenient if you want to keep a context around and track
+ * changes to the screen's font rendering settings.
+ *
  * Return value: a new #PangoContext for the default display
  **/
 PangoContext *
@@ -1353,6 +1359,12 @@ gdk_pango_context_get (void)
  * instead of this function, to get the appropriate context for
  * the widget you intend to render text onto.
  * 
+ * The newly created context will have the default font options
+ * (see #cairo_font_options_t) for the screen; if these options
+ * change it will not be updated. Using gtk_widget_get_pango_context()
+ * is more convenient if you want to keep a context around and track
+ * changes to the screen's font rendering settings.
+ * 
  * Return value: a new #PangoContext for @screen
  *
  * Since: 2.2
@@ -1361,12 +1373,23 @@ PangoContext *
 gdk_pango_context_get_for_screen (GdkScreen *screen)
 {
   PangoFontMap *fontmap;
+  PangoContext *context;
+  const cairo_font_options_t *options;
+  double dpi;
   
   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
 
   fontmap = pango_cairo_font_map_get_default ();
   
-  return pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
+  context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
+
+  options = gdk_screen_get_font_options_libgtk_only (screen);
+  pango_cairo_context_set_font_options (context, options);
+
+  dpi = gdk_screen_get_resolution_libgtk_only (screen);
+  pango_cairo_context_set_resolution (context, dpi);
+
+  return context;
 }
 
 #define __GDK_PANGO_C__
index 8e08e5363bf8027c4d26d5621d39f1f18790b9bf..b08cf725a6cef78604d2db9df90d15dd236f11e1 100644 (file)
@@ -29,7 +29,9 @@
 #include "gdkalias.h"
 
 static void gdk_screen_class_init  (GdkScreenClass *klass);
+static void gdk_screen_init        (GdkScreen      *screen);
 static void gdk_screen_dispose     (GObject        *object);
+static void gdk_screen_finalize    (GObject        *object);
 
 enum
 {
@@ -51,7 +53,7 @@ gdk_screen_get_type (void)
       static const GTypeInfo object_info =
        {
          sizeof (GdkScreenClass),
-         (GBaseInitFunc) NULL,
+         (GBaseInitFunc) gdk_screen_init,
          (GBaseFinalizeFunc) NULL,
          (GClassInitFunc) gdk_screen_class_init,
          NULL,                 /* class_finalize */
@@ -76,6 +78,7 @@ gdk_screen_class_init (GdkScreenClass *klass)
   parent_class = g_type_class_peek_parent (klass);
   
   object_class->dispose = gdk_screen_dispose;
+  object_class->finalize = gdk_screen_finalize;
   
   /**
    * GdkScreen::size-changed:
@@ -97,6 +100,12 @@ gdk_screen_class_init (GdkScreenClass *klass)
                   0);
 }
 
+static void
+gdk_screen_init (GdkScreen *screen)
+{
+    screen->resolution = -1;
+}
+
 static void
 gdk_screen_dispose (GObject *object)
 {
@@ -115,6 +124,17 @@ gdk_screen_dispose (GObject *object)
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
+static void
+gdk_screen_finalize (GObject *object)
+{
+  GdkScreen *screen = GDK_SCREEN (object);
+
+  if (screen->font_options)
+      cairo_font_options_destroy (screen->font_options);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
 void 
 _gdk_screen_close (GdkScreen *screen)
 {
@@ -317,5 +337,96 @@ gdk_screen_height_mm (void)
   return gdk_screen_get_height_mm (gdk_screen_get_default ());
 }
 
+/**
+ * gdk_screen_set_font_options_libgtk_only:
+ * @screen: a #GdkScreen
+ * @options: a #cairo_font_options_t, or %NULL to unset any
+ *   previously set default font options.
+ *
+ * Sets the default font options for the screen. These
+ * options will be set on any #PangoContext's newly created
+ * with gdk_pango_context_get_for_screen(). Changing the
+ * default set of font options does not affect contexts that
+ * have already been created.
+ * 
+ * This function is not part of the GDK public API and is only
+ * for use by GTK+.
+ **/
+void
+gdk_screen_set_font_options_libgtk_only (GdkScreen                  *screen,
+                                        const cairo_font_options_t *options)
+{
+    g_return_if_fail (GDK_IS_SCREEN (screen));
+
+    if (screen->font_options)
+       cairo_font_options_destroy (screen->font_options);
+
+    if (options)
+       screen->font_options = cairo_font_options_copy (options);
+    else
+       screen->font_options = NULL;
+}
+
+/**
+ * gdk_screen_get_font_options_libgtk_only:
+ * @screen: a #GdkScreen
+ * 
+ * Gets any options previously set with gdk_screen_set_font_options_libgtk_only().
+ * 
+ * Return value: the current font options, or %NULL if no default
+ *  font options have been set.
+ **/
+const cairo_font_options_t *
+gdk_screen_get_font_options_libgtk_only (GdkScreen *screen)
+{
+    g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+    return screen->font_options;
+}
+
+/**
+ * gdk_screen_set_resolution_libgtk_only:
+ * @screen: a #GdkScreen
+ * @dpi: the resolution in "dots per inch". (Physical inches aren't actually
+ *   involved; the terminology is conventional.)
+ * Sets the resolution for font handling on the screen. This is a
+ * scale factor between points specified in a #PangoFontDescription
+ * and cairo units. The default value is 96, meaning that a 10 point
+ * font will be 13 units high. (10 * 96. / 72. = 13.3).
+ *
+ * This function is not part of the GDK public API and is only
+ * for use by GTK+.
+ **/
+void
+gdk_screen_set_resolution_libgtk_only (GdkScreen *screen,
+                                      gdouble    dpi)
+{
+    g_return_if_fail (GDK_IS_SCREEN (screen));
+
+    if (dpi >= 0)
+       screen->resolution = dpi;
+    else
+       screen->resolution = -1;
+}
+
+/**
+ * gdk_screen_get_resolution_libgtk_only:
+ * @screen: a #GdkScreen
+ * 
+ * Gets the resolution for font handling on the screen; see
+ * gdk_screen_set_resolution_libgtk_only() for full details.
+ * 
+ * Return value: the current resolution, or -1 if no resolution
+ * has been set.
+ **/
+gdouble
+gdk_screen_get_resolution_libgtk_only (GdkScreen *screen)
+{
+    g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+    return screen->resolution;
+}
+
 #define __GDK_SCREEN_C__
 #include "gdkaliasdef.c"
index 5a27cbe232ba34ee99189d65d69b4f88b2a55e10..2d93a41944d36ed53165b1e4e88fb78321f8d6f3 100644 (file)
@@ -24,6 +24,7 @@
 #ifndef __GDK_SCREEN_H__
 #define __GDK_SCREEN_H__
 
+#include <cairo.h>
 #include "gdk/gdktypes.h"
 #include "gdk/gdkdisplay.h"
 
@@ -46,6 +47,9 @@ struct _GdkScreen
 
   GdkGC *normal_gcs[32];
   GdkGC *exposure_gcs[32];
+
+  cairo_font_options_t *font_options;
+  double resolution;           /* pixels/points scale factor for fonts */
 };
 
 struct _GdkScreenClass
@@ -98,6 +102,14 @@ gboolean   gdk_screen_get_setting (GdkScreen   *screen,
                                   const gchar *name,
                                   GValue      *value);
 
+void                        gdk_screen_set_font_options_libgtk_only (GdkScreen                  *screen,
+                                                                    const cairo_font_options_t *options);
+const cairo_font_options_t *gdk_screen_get_font_options_libgtk_only (GdkScreen                  *screen);
+
+void    gdk_screen_set_resolution_libgtk_only (GdkScreen *screen,
+                                              gdouble    dpi);
+gdouble gdk_screen_get_resolution_libgtk_only (GdkScreen *screen);
+
 G_END_DECLS
 
 #endif                         /* __GDK_SCREEN_H__ */
index d4474c078a2d01b2c699055187a157db2ec6932b..0099161093e106560ffa771f93cbfe75448ce275 100644 (file)
@@ -17,6 +17,9 @@
  */
 
 #include <config.h>
+
+#include <string.h>
+
 #include "gtkmodules.h"
 #include "gtksettings.h"
 #include "gtkrc.h"
@@ -100,6 +103,8 @@ static void    settings_update_modules           (GtkSettings           *setting
 
 #ifdef GDK_WINDOWING_X11
 static void    settings_update_cursor_theme      (GtkSettings           *settings);
+static void    settings_update_resolution        (GtkSettings           *settings);
+static void    settings_update_font_options      (GtkSettings           *settings);
 #endif
 
 
@@ -553,16 +558,20 @@ gtk_settings_notify (GObject    *object,
       break;
 #ifdef GDK_WINDOWING_X11
     case PROP_XFT_DPI:
-    case PROP_XFT_ANTIALIAS:
-    case PROP_XFT_HINTING:
-    case PROP_XFT_HINTSTYLE:
-    case PROP_XFT_RGBA:
+      settings_update_resolution (settings);
       /* This is a hack because with gtk_rc_reset_styles() doesn't get
        * widgets with gtk_widget_style_set(), and also causes more
        * recomputation than necessary.
        */
       gtk_rc_reset_styles (GTK_SETTINGS (object));
       break;
+    case PROP_XFT_ANTIALIAS:
+    case PROP_XFT_HINTING:
+    case PROP_XFT_HINTSTYLE:
+    case PROP_XFT_RGBA:
+      settings_update_font_options (settings);
+      gtk_rc_reset_styles (GTK_SETTINGS (object));
+      break;
     case PROP_CURSOR_THEME_NAME:
     case PROP_CURSOR_THEME_SIZE:
       settings_update_cursor_theme (settings);
@@ -1358,6 +1367,104 @@ settings_update_cursor_theme (GtkSettings *settings)
   
   gdk_x11_display_set_cursor_theme (display, theme, size);
 }
+
+static void
+settings_update_font_options (GtkSettings *settings)
+{
+  gint hinting;
+  gchar *hint_style_str;
+  cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_DEFAULT;
+  gint antialias;
+  cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_DEFAULT;
+  gchar *rgba_str;
+  cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+  gint dpi_int;
+  double dpi;
+  cairo_font_options_t *options;
+  
+  g_object_get (settings,
+               "gtk-xft-antialias", &antialias,
+               "gtk-xft-hinting", &hinting,
+               "gtk-xft-hintstyle", &hint_style_str,
+               "gtk-xft-rgba", &rgba_str,
+               "gtk-xft-dpi", &dpi_int,
+               NULL);
+
+  if (dpi_int > 0)
+    dpi = dpi_int / 1024.;
+  else
+    dpi = -1.;
+
+  options = cairo_font_options_create ();
+  
+  if (hinting >= 0 && !hinting)
+    {
+      hint_style = CAIRO_HINT_STYLE_NONE;
+    }
+  else if (hint_style_str)
+    {
+      if (strcmp (hint_style_str, "hintnone") == 0)
+       hint_style = CAIRO_HINT_STYLE_NONE;
+      else if (strcmp (hint_style_str, "hintslight") == 0)
+       hint_style = CAIRO_HINT_STYLE_SLIGHT;
+      else if (strcmp (hint_style_str, "hintmedium") == 0)
+       hint_style = CAIRO_HINT_STYLE_MEDIUM;
+      else if (strcmp (hint_style_str, "hintfull") == 0)
+       hint_style = CAIRO_HINT_STYLE_FULL;
+    }
+
+  if (hint_style_str)
+    g_free (hint_style_str);
+
+  cairo_font_options_set_hint_style (options, hint_style);
+
+  if (rgba_str)
+    {
+      if (strcmp (rgba_str, "rgb") == 0)
+       subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
+      else if (strcmp (rgba_str, "bgr") == 0)
+       subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
+      else if (strcmp (rgba_str, "vrgb") == 0)
+       subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
+      else if (strcmp (rgba_str, "vbgr") == 0)
+       subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
+
+      g_free (rgba_str);
+    }
+
+  cairo_font_options_set_subpixel_order (options, subpixel_order);
+  
+  if (antialias >= 0 && !antialias)
+    antialias_mode = CAIRO_ANTIALIAS_NONE;
+  else if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT)
+    antialias_mode = CAIRO_ANTIALIAS_SUBPIXEL;
+  else if (antialias >= 0)
+    antialias_mode = CAIRO_ANTIALIAS_GRAY;
+  
+  cairo_font_options_set_antialias (options, antialias_mode);
+
+  gdk_screen_set_font_options_libgtk_only (settings->screen, options);
+  
+  cairo_font_options_destroy (options);
+}
+
+static void
+settings_update_resolution (GtkSettings *settings)
+{
+  gint dpi_int;
+  double dpi;
+  
+  g_object_get (settings,
+               "gtk-xft-dpi", &dpi_int,
+               NULL);
+
+  if (dpi_int > 0)
+    dpi = dpi_int / 1024.;
+  else
+    dpi = -1.;
+
+  gdk_screen_set_resolution_libgtk_only (settings->screen, dpi);
+}
 #endif
 
 #define __GTK_SETTINGS_C__
index cb763b8509d8ed3a5c8dbb575236e38bb83a882e..4125db08898c432decd1ea2c2bc8654cb56f0c13 100644 (file)
@@ -5197,91 +5197,10 @@ static void
 update_pango_context (GtkWidget    *widget,
                      PangoContext *context)
 {
-#ifdef GDK_WINDOWING_X11
-  GtkSettings *settings;
-  gint hinting;
-  gchar *hint_style_str;
-  cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_DEFAULT;
-  gint antialias;
-  cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_DEFAULT;
-  gchar *rgba_str;
-  cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
-  gint dpi;
-  cairo_font_options_t *options;
-#endif
-      
   pango_context_set_font_description (context, widget->style->font_desc);
   pango_context_set_base_dir (context,
                              gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
                              PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
-  
-#ifdef GDK_WINDOWING_X11
-  settings = gtk_widget_get_settings (widget);
-  g_object_get (settings,
-               "gtk-xft-antialias", &antialias,
-               "gtk-xft-hinting", &hinting,
-               "gtk-xft-hintstyle", &hint_style_str,
-               "gtk-xft-rgba", &rgba_str,
-               "gtk-xft-dpi", &dpi,
-               NULL);
-
-  if (dpi > 0)
-    pango_cairo_context_set_resolution (context, dpi / 1024.);
-  else
-    pango_cairo_context_set_resolution (context, -1.);
-
-  options = cairo_font_options_create ();
-  
-  if (hinting >= 0 && !hinting)
-    {
-      hint_style = CAIRO_HINT_STYLE_NONE;
-    }
-  else if (hint_style_str)
-    {
-      if (strcmp (hint_style_str, "hintnone") == 0)
-       hint_style = CAIRO_HINT_STYLE_NONE;
-      else if (strcmp (hint_style_str, "hintslight") == 0)
-       hint_style = CAIRO_HINT_STYLE_SLIGHT;
-      else if (strcmp (hint_style_str, "hintmedium") == 0)
-       hint_style = CAIRO_HINT_STYLE_MEDIUM;
-      else if (strcmp (hint_style_str, "hintfull") == 0)
-       hint_style = CAIRO_HINT_STYLE_FULL;
-    }
-
-  if (hint_style_str)
-    g_free (hint_style_str);
-
-  cairo_font_options_set_hint_style (options, hint_style);
-
-  if (rgba_str)
-    {
-      if (strcmp (rgba_str, "rgb") == 0)
-       subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
-      else if (strcmp (rgba_str, "bgr") == 0)
-       subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
-      else if (strcmp (rgba_str, "vrgb") == 0)
-       subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
-      else if (strcmp (rgba_str, "vbgr") == 0)
-       subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
-
-      g_free (rgba_str);
-    }
-
-  cairo_font_options_set_subpixel_order (options, subpixel_order);
-  
-  if (antialias >= 0 && !antialias)
-    antialias_mode = CAIRO_ANTIALIAS_NONE;
-  else if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT)
-    antialias_mode = CAIRO_ANTIALIAS_SUBPIXEL;
-  else if (antialias >= 0)
-    antialias_mode = CAIRO_ANTIALIAS_GRAY;
-  
-  cairo_font_options_set_antialias (options, antialias_mode);
-
-  pango_cairo_context_set_font_options (context, options);
-  
-  cairo_font_options_destroy (options);
-#endif  
 }
 
 static void
@@ -5290,7 +5209,20 @@ gtk_widget_update_pango_context (GtkWidget *widget)
   PangoContext *context = gtk_widget_peek_pango_context (widget);
   
   if (context)
-    update_pango_context (widget, context);
+    {
+      GdkScreen *screen;
+
+      update_pango_context (widget, context);
+
+      screen = gtk_widget_get_screen_unchecked (widget);
+      if (screen)
+       {
+         pango_cairo_context_set_resolution (context,
+                                             gdk_screen_get_resolution_libgtk_only (screen));
+         pango_cairo_context_set_font_options (context,
+                                               gdk_screen_get_font_options_libgtk_only (screen));
+       }
+    }
 }
 
 /**