gimp r28049 - in trunk: . app/paint app/tools



Author: neo
Date: Wed Feb 18 20:19:47 2009
New Revision: 28049
URL: http://svn.gnome.org/viewvc/gimp?rev=28049&view=rev

Log:
2009-02-18  Sven Neumann  <sven gimp org>

	Bug 99457 â Support for dynamics on tilt

	* app/tools/gimppaintoptions-gui.c
	* app/paint/gimppaintoptions.[ch]: applied patch from Alexia 
Death
	that allows to map tilt to the dynamic brush parameters.



Modified:
   trunk/ChangeLog
   trunk/app/paint/gimppaintoptions.c
   trunk/app/paint/gimppaintoptions.h
   trunk/app/tools/gimppaintoptions-gui.c

Modified: trunk/app/paint/gimppaintoptions.c
==============================================================================
--- trunk/app/paint/gimppaintoptions.c	(original)
+++ trunk/app/paint/gimppaintoptions.c	Wed Feb 18 20:19:47 2009
@@ -68,6 +68,15 @@
 #define DEFAULT_DIRECTION_ANGLE        FALSE
 #define DEFAULT_DIRECTION_PRESCALE     1.0
 
+#define DEFAULT_TILT_OPACITY           FALSE
+#define DEFAULT_TILT_HARDNESS          FALSE
+#define DEFAULT_TILT_RATE              FALSE
+#define DEFAULT_TILT_SIZE              FALSE
+#define DEFAULT_TILT_INVERSE_SIZE      FALSE
+#define DEFAULT_TILT_COLOR             FALSE
+#define DEFAULT_TILT_ANGLE             FALSE
+#define DEFAULT_TILT_PRESCALE          1.0
+
 #define DEFAULT_RANDOM_OPACITY         FALSE
 #define DEFAULT_RANDOM_HARDNESS        FALSE
 #define DEFAULT_RANDOM_RATE            FALSE
@@ -132,6 +141,15 @@
   PROP_DIRECTION_ANGLE,
   PROP_DIRECTION_PRESCALE,
 
+  PROP_TILT_OPACITY,
+  PROP_TILT_HARDNESS,
+  PROP_TILT_RATE,
+  PROP_TILT_SIZE,
+  PROP_TILT_INVERSE_SIZE,
+  PROP_TILT_COLOR,
+  PROP_TILT_ANGLE,
+  PROP_TILT_PRESCALE,
+
   PROP_RANDOM_OPACITY,
   PROP_RANDOM_HARDNESS,
   PROP_RANDOM_RATE,
@@ -182,7 +200,9 @@
                                                     gdouble       mix3,
                                                     gdouble       mix3_scale,
                                                     gdouble       mix4,
-                                                    gdouble       mix4_scale);
+                                                    gdouble       mix4_scale,
+                                                    gdouble       mix5,
+                                                    gdouble       mix5_scale);
 
 
 G_DEFINE_TYPE (GimpPaintOptions, gimp_paint_options, GIMP_TYPE_TOOL_OPTIONS)
@@ -330,6 +350,39 @@
                                    0.0, 1.0, DEFAULT_DIRECTION_PRESCALE,
                                    GIMP_PARAM_STATIC_STRINGS);
 
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_OPACITY,
+                                    "tilt-opacity", NULL,
+                                    DEFAULT_TILT_OPACITY,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_HARDNESS,
+                                    "tilt-hardness", NULL,
+                                    DEFAULT_TILT_HARDNESS,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_RATE,
+                                    "tilt-rate", NULL,
+                                    DEFAULT_TILT_RATE,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_SIZE,
+                                    "tilt-size", NULL,
+                                    DEFAULT_TILT_SIZE,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_COLOR,
+                                    "tilt-color", NULL,
+                                    DEFAULT_TILT_COLOR,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_ANGLE,
+                                    "tilt-angle", NULL,
+                                    DEFAULT_TILT_ANGLE,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_TILT_INVERSE_SIZE,
+                                    "tilt-inverse-size", NULL,
+                                    DEFAULT_TILT_INVERSE_SIZE,
+                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_TILT_PRESCALE,
+                                   "tilt-prescale", NULL,
+                                   0.0, 1.0, DEFAULT_TILT_PRESCALE,
+                                   GIMP_PARAM_STATIC_STRINGS);
+
   GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_RANDOM_OPACITY,
                                     "random-opacity", NULL,
                                     DEFAULT_RANDOM_OPACITY,
@@ -452,6 +505,7 @@
   options->pressure_options  = g_slice_new0 (GimpDynamicOptions);
   options->velocity_options  = g_slice_new0 (GimpDynamicOptions);
   options->direction_options = g_slice_new0 (GimpDynamicOptions);
+  options->tilt_options      = g_slice_new0 (GimpDynamicOptions);
   options->random_options    = g_slice_new0 (GimpDynamicOptions);
   options->fade_options      = g_slice_new0 (GimpFadeOptions);
   options->jitter_options    = g_slice_new0 (GimpJitterOptions);
@@ -469,6 +523,7 @@
   g_slice_free (GimpDynamicOptions,  options->pressure_options);
   g_slice_free (GimpDynamicOptions,  options->velocity_options);
   g_slice_free (GimpDynamicOptions,  options->direction_options);
+  g_slice_free (GimpDynamicOptions,  options->tilt_options);
   g_slice_free (GimpDynamicOptions,  options->random_options);
   g_slice_free (GimpFadeOptions,     options->fade_options);
   g_slice_free (GimpJitterOptions,   options->jitter_options);
@@ -487,6 +542,7 @@
   GimpDynamicOptions  *pressure_options  = options->pressure_options;
   GimpDynamicOptions  *velocity_options  = options->velocity_options;
   GimpDynamicOptions  *direction_options = options->direction_options;
+  GimpDynamicOptions  *tilt_options      = options->tilt_options;
   GimpDynamicOptions  *random_options    = options->random_options;
   GimpFadeOptions     *fade_options      = options->fade_options;
   GimpJitterOptions   *jitter_options    = options->jitter_options;
@@ -614,6 +670,38 @@
       direction_options->prescale = g_value_get_double (value);
       break;
 
+    case PROP_TILT_OPACITY:
+      tilt_options->opacity = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_HARDNESS:
+      tilt_options->hardness = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_RATE:
+      tilt_options->rate = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_SIZE:
+      tilt_options->size = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_INVERSE_SIZE:
+      tilt_options->inverse_size = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_COLOR:
+      tilt_options->color = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_ANGLE:
+      tilt_options->angle = g_value_get_boolean (value);
+      break;
+
+    case PROP_TILT_PRESCALE:
+      tilt_options->prescale = g_value_get_double (value);
+      break;
+
     case PROP_RANDOM_OPACITY:
       random_options->opacity = g_value_get_boolean (value);
       break;
@@ -726,6 +814,7 @@
   GimpDynamicOptions  *pressure_options  = options->pressure_options;
   GimpDynamicOptions  *velocity_options  = options->velocity_options;
   GimpDynamicOptions  *direction_options = options->direction_options;
+  GimpDynamicOptions  *tilt_options      = options->tilt_options;
   GimpDynamicOptions  *random_options    = options->random_options;
   GimpFadeOptions     *fade_options      = options->fade_options;
   GimpJitterOptions   *jitter_options    = options->jitter_options;
@@ -853,6 +942,39 @@
       g_value_set_double (value, direction_options->prescale);
       break;
 
+
+    case PROP_TILT_OPACITY:
+      g_value_set_boolean (value, tilt_options->opacity);
+      break;
+
+    case PROP_TILT_HARDNESS:
+      g_value_set_boolean (value, tilt_options->hardness);
+      break;
+
+    case PROP_TILT_RATE:
+      g_value_set_boolean (value, tilt_options->rate);
+      break;
+
+    case PROP_TILT_SIZE:
+      g_value_set_boolean (value, tilt_options->size);
+      break;
+
+    case PROP_TILT_INVERSE_SIZE:
+      g_value_set_boolean (value, tilt_options->inverse_size);
+      break;
+
+    case PROP_TILT_COLOR:
+      g_value_set_boolean (value, tilt_options->color);
+      break;
+
+    case PROP_TILT_ANGLE:
+      g_value_set_boolean (value, tilt_options->angle);
+      break;
+
+    case PROP_TILT_PRESCALE:
+      g_value_set_double (value, tilt_options->prescale);
+      break;
+
     case PROP_RANDOM_OPACITY:
       g_value_set_boolean (value, random_options->opacity);
       break;
@@ -1092,6 +1214,7 @@
   if (paint_options->pressure_options->color  ||
       paint_options->velocity_options->color  ||
       paint_options->direction_options->color ||
+      paint_options->tilt_options->color      ||
       paint_options->random_options->color)
     {
       gimp_gradient_get_color_at (gradient, GIMP_CONTEXT (paint_options),
@@ -1175,7 +1298,7 @@
 
 
 /* Calculates dynamics mix to be used for same parameter
- * (velocity/pressure/random) mix Needed in may places and tools.
+ * (velocity/pressure/direction/tilt/random) mix Needed in may places and tools.
  */
 static gdouble
 gimp_paint_options_get_dynamics_mix (gdouble mix1,
@@ -1185,7 +1308,9 @@
                                      gdouble mix3,
                                      gdouble mix3_scale,
                                      gdouble mix4,
-                                     gdouble mix4_scale)
+                                     gdouble mix4_scale,
+                                     gdouble mix5,
+                                     gdouble mix5_scale)
 {
   gdouble scale_sum = 0.0;
   gdouble result    = 1.0;
@@ -1214,12 +1339,19 @@
     }
   else mix4 = 0.0;
 
+  if (mix5 > -1.0)
+    {
+      scale_sum += fabs (mix5_scale);
+    }
+  else mix5 = 0.0;
+
   if (scale_sum > 0.0)
     {
       result = (mix1 * mix1_scale) / scale_sum +
                (mix2 * mix2_scale) / scale_sum +
                (mix3 * mix3_scale) / scale_sum +
-               (mix4 * mix4_scale) / scale_sum;
+               (mix4 * mix4_scale) / scale_sum +
+               (mix5 * mix5_scale) / scale_sum;
     }
 
   if (result < 0.0)
@@ -1240,13 +1372,16 @@
   if (paint_options->pressure_options->opacity  ||
       paint_options->velocity_options->opacity  ||
       paint_options->direction_options->opacity ||
+      paint_options->tilt_options->opacity      ||
       paint_options->random_options->opacity)
     {
       gdouble pressure  = -1.0;
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
+      gdouble tilt      = -1.0;
       gdouble random    = -1.0;
 
+
       if (paint_options->pressure_options->opacity)
         pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
 
@@ -1256,6 +1391,9 @@
       if (paint_options->random_options->opacity)
         random = g_random_double_range (0.0, 1.0);
 
+     if (paint_options->tilt_options->opacity)
+        tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+
       if (paint_options->direction_options->opacity)
         direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1265,6 +1403,8 @@
                                                      paint_options->velocity_options->prescale,
                                                      random,
                                                      paint_options->random_options->prescale,
+                                                     tilt,
+                                                     paint_options->tilt_options->prescale,
                                                      direction,
                                                      paint_options->direction_options->prescale);
     }
@@ -1285,6 +1425,7 @@
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
       gdouble random    = -1.0;
+      gdouble tilt      = -1.0;
 
       if (paint_options->pressure_options->size)
         {
@@ -1313,6 +1454,15 @@
           random = g_random_double_range (0.0, 1.0);
         }
 
+      if (paint_options->tilt_options->size)
+        {
+          tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+        }
+      else if (paint_options->tilt_options->inverse_size)
+        {
+          tilt = sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+        }
+
       if (paint_options->direction_options->size)
          direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1322,6 +1472,8 @@
                                                    paint_options->velocity_options->prescale,
                                                    random,
                                                    paint_options->random_options->prescale,
+                                                   tilt,
+                                                   paint_options->tilt_options->prescale,
                                                    direction,
                                                    paint_options->direction_options->prescale);
 
@@ -1349,12 +1501,14 @@
   if (paint_options->pressure_options->rate  ||
       paint_options->velocity_options->rate  ||
       paint_options->direction_options->rate ||
+      paint_options->tilt_options->rate ||
       paint_options->random_options->rate)
     {
       gdouble pressure  = -1.0;
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
       gdouble random    = -1.0;
+      gdouble tilt      = -1.0;
 
       if (paint_options->pressure_options->rate)
         pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@@ -1365,6 +1519,9 @@
       if (paint_options->random_options->rate)
         random = g_random_double_range (0.0, 1.0);
 
+     if (paint_options->tilt_options->rate)
+        tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+
       if (paint_options->direction_options->rate)
         direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1374,6 +1531,8 @@
                                                   paint_options->velocity_options->prescale,
                                                   random,
                                                   paint_options->random_options->prescale,
+                                                  tilt,
+                                                  paint_options->tilt_options->prescale,
                                                   direction,
                                                   paint_options->direction_options->prescale);
     }
@@ -1394,12 +1553,14 @@
   if (paint_options->pressure_options->color  ||
       paint_options->velocity_options->color  ||
       paint_options->direction_options->color ||
+      paint_options->tilt_options->color      ||
       paint_options->random_options->color)
     {
       gdouble pressure  = -1.0;
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
       gdouble random    = -1.0;
+      gdouble tilt      = -1.0;
 
       if (paint_options->pressure_options->color)
         pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@@ -1410,6 +1571,9 @@
       if (paint_options->random_options->color)
         random = g_random_double_range (0.0, 1.0);
 
+     if (paint_options->tilt_options->color)
+        tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+
       if (paint_options->direction_options->color)
         direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1419,6 +1583,8 @@
                                                    paint_options->velocity_options->prescale,
                                                    random,
                                                    paint_options->random_options->prescale,
+                                                   tilt,
+                                                   paint_options->tilt_options->prescale,
                                                    direction,
                                                    paint_options->direction_options->prescale);
     }
@@ -1438,12 +1604,14 @@
   if (paint_options->pressure_options->hardness  ||
       paint_options->velocity_options->hardness  ||
       paint_options->direction_options->hardness ||
+      paint_options->tilt_options->hardness      ||
       paint_options->random_options->hardness)
     {
       gdouble pressure  = -1.0;
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
       gdouble random    = -1.0;
+      gdouble tilt      = -1.0;
 
       if (paint_options->pressure_options->hardness)
         pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@@ -1454,6 +1622,9 @@
       if (paint_options->random_options->hardness)
         random = g_random_double_range (0.0, 1.0);
 
+     if (paint_options->tilt_options->hardness)
+        tilt = 1.0 - sqrt (SQR (coords->xtilt) + SQR (coords->ytilt));
+
       if (paint_options->direction_options->hardness)
         direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1463,6 +1634,8 @@
                                                       paint_options->velocity_options->prescale,
                                                       random,
                                                       paint_options->random_options->prescale,
+                                                      tilt,
+                                                      paint_options->tilt_options->prescale,
                                                       direction,
                                                       paint_options->direction_options->prescale);
     }
@@ -1482,12 +1655,14 @@
   if (paint_options->pressure_options->angle  ||
       paint_options->velocity_options->angle  ||
       paint_options->direction_options->angle ||
+      paint_options->tilt_options->angle      ||
       paint_options->random_options->angle)
     {
       gdouble pressure  = -1.0;
       gdouble velocity  = -1.0;
       gdouble direction = -1.0;
       gdouble random    = -1.0;
+      gdouble tilt      = -1.0;
 
       if (paint_options->pressure_options->angle)
         pressure = GIMP_PAINT_PRESSURE_SCALE * coords->pressure;
@@ -1498,6 +1673,38 @@
       if (paint_options->random_options->angle)
         random = g_random_double_range (0.0, 1.0);
 
+     /* For tilt to make sense, it needs to be converted to an angle, not just vector */
+     if (paint_options->tilt_options->angle)
+       {
+         gdouble tilt_x = coords->xtilt;
+         gdouble tilt_y = coords->ytilt;
+
+         if (tilt_x == 0.0)
+         {
+           if (tilt_y >= 0.0)
+             tilt = 0.5;
+           else if (tilt_y < 0.0)
+             tilt = 0.0;
+           else tilt = -1.0;
+         }
+       else
+         {
+           tilt = atan ((- 1.0 * tilt_y) /
+                                 tilt_x) / (2 * G_PI);
+
+           if (tilt_x > 0.0)
+             tilt = tilt + 0.5;
+         }
+
+         tilt = tilt + 0.5; /* correct the angle, its wrong by 180 degrees */
+
+         while (tilt > 1.0)
+           tilt -= 1.0;
+
+         while (tilt < 0.0)
+           tilt += 1.0;
+       }
+
       if (paint_options->direction_options->angle)
         direction = coords->direction + 0.5; /* mixer does not mix negative angles right so we shift */
 
@@ -1508,6 +1715,8 @@
                                                    paint_options->velocity_options->prescale,
                                                    random,
                                                    paint_options->random_options->prescale,
+                                                   tilt,
+                                                   paint_options->tilt_options->prescale,
                                                    direction,
                                                    paint_options->direction_options->prescale);
       angle = angle - 0.5;

Modified: trunk/app/paint/gimppaintoptions.h
==============================================================================
--- trunk/app/paint/gimppaintoptions.h	(original)
+++ trunk/app/paint/gimppaintoptions.h	Wed Feb 18 20:19:47 2009
@@ -99,6 +99,7 @@
   GimpDynamicOptions       *pressure_options;
   GimpDynamicOptions       *velocity_options;
   GimpDynamicOptions       *direction_options;
+  GimpDynamicOptions       *tilt_options;
   GimpDynamicOptions       *random_options;
 
   GimpFadeOptions          *fade_options;

Modified: trunk/app/tools/gimppaintoptions-gui.c
==============================================================================
--- trunk/app/tools/gimppaintoptions-gui.c	(original)
+++ trunk/app/tools/gimppaintoptions-gui.c	Wed Feb 18 20:19:47 2009
@@ -67,6 +67,10 @@
                                           GType             tool_type,
                                           GtkTable         *table,
                                           gint              row);
+static void        tilt_options_gui      (GimpPaintOptions *paint_options,
+                                          GType             tool_type,
+                                          GtkTable         *table,
+                                          gint              row);
 static void        random_options_gui    (GimpPaintOptions *paint_options,
                                           GType             tool_type,
                                           GtkTable         *table,
@@ -235,12 +239,18 @@
                         GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_widget_show (label);
 
-      label = gtk_label_new (_("Random:"));
+      label = gtk_label_new (_("Tilt:"));
       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
       gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5,
                         GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
       gtk_widget_show (label);
 
+      label = gtk_label_new (_("Random:"));
+      gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+      gtk_table_attach (GTK_TABLE (table), label, 0, 1, 5, 6,
+                        GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+      gtk_widget_show (label);
+
       pressure_options_gui (options, tool_type,
                             GTK_TABLE (table), 1,
                             dynamics_labels);
@@ -251,8 +261,11 @@
       direction_options_gui (options, tool_type,
                              GTK_TABLE (table), 3);
 
+      tilt_options_gui (options, tool_type,
+                        GTK_TABLE (table), 4);
+
       random_options_gui (options, tool_type,
-                          GTK_TABLE (table), 4);
+                          GTK_TABLE (table), 5);
 
       /* EEK: pack the fixed *after* the buttons so the table calls
        * size-allocates on it *before* it places the toggles. Fixes
@@ -607,6 +620,59 @@
   gtk_widget_show (scalebutton);
 }
 
+
+static void
+tilt_options_gui (GimpPaintOptions *paint_options,
+                       GType             tool_type,
+                       GtkTable         *table,
+                       gint              row)
+{
+  GObject   *config = G_OBJECT (paint_options);
+  gint       column = 1;
+  GtkWidget *scalebutton;
+
+  if (tool_has_opacity_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-opacity",
+                                 table, column++, row);
+    }
+
+  if (tool_has_hardness_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-hardness",
+                                 table, column++, row);
+    }
+
+  if (tool_has_rate_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-rate",
+                                 table, column++, row);
+    }
+
+  if (tool_has_size_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-size",
+                                 table, column++, row);
+    }
+
+  if (tool_has_angle_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-angle",
+                                 table, column++, row);
+    }
+
+  if (tool_has_color_dynamics (tool_type))
+    {
+      dynamics_check_button_new (config, "tilt-color",
+                                 table, column++, row);
+    }
+
+  scalebutton = gimp_prop_scale_button_new (config, "tilt-prescale");
+  gtk_table_attach (table, scalebutton, column, column + 1, row, row + 1,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+  gtk_widget_show (scalebutton);
+}
+
 static void
 random_options_gui (GimpPaintOptions *paint_options,
                     GType             tool_type,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]