gtkgamma.c 12.5 KB
Newer Older
Elliot Lee's avatar
Elliot Lee committed
1 2 3 4
/* GTK - The GIMP Toolkit
 * Copyright (C) 1997 David Mosberger
 *
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
Elliot Lee's avatar
Elliot Lee committed
6 7 8 9 10 11
 * 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
12
 * Lesser General Public License for more details.
Elliot Lee's avatar
Elliot Lee committed
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15 16 17
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
Elliot Lee's avatar
Elliot Lee committed
18
 */
19 20

/*
21
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22 23 24 25 26
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 */

Elliot Lee's avatar
Elliot Lee committed
27 28 29 30 31 32 33 34 35 36
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "gtkgamma.h"
#include "gtkcurve.h"
#include "gtkdialog.h"
#include "gtkdrawingarea.h"
#include "gtkentry.h"
#include "gtkhbox.h"
Manish Singh's avatar
Manish Singh committed
37
#include "gtkimage.h"
Elliot Lee's avatar
Elliot Lee committed
38 39 40
#include "gtklabel.h"
#include "gtkmain.h"
#include "gtkradiobutton.h"
41
#include "gtkstock.h"
Elliot Lee's avatar
Elliot Lee committed
42 43 44
#include "gtktable.h"
#include "gtkvbox.h"
#include "gtkwindow.h"
45
#include "gtkintl.h"
Elliot Lee's avatar
Elliot Lee committed
46 47 48 49 50 51 52 53 54

static GtkVBoxClass *parent_class = NULL;


/* forward declarations: */
static void gtk_gamma_curve_class_init (GtkGammaCurveClass *class);
static void gtk_gamma_curve_init (GtkGammaCurve *curve);
static void gtk_gamma_curve_destroy (GtkObject *object);

55 56 57 58 59
static void curve_type_changed_callback (GtkWidget *w, gpointer data);
static void button_realize_callback     (GtkWidget *w);
static void button_toggled_callback     (GtkWidget *w, gpointer data);
static void button_clicked_callback     (GtkWidget *w, gpointer data);

Elliot Lee's avatar
Elliot Lee committed
60 61 62 63 64 65 66 67 68 69
enum
  {
    LINEAR = 0,
    SPLINE,
    FREE,
    GAMMA,
    RESET,
    NUM_XPMS
  };

70
static const char *xpm[][27] =
Elliot Lee's avatar
Elliot Lee committed
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
  {
    /* spline: */
    {
      /* width height ncolors chars_per_pixel */
      "16 16 4 1",
      /* colors */
      ". c None",
      "B c #000000",
      "+ c #BC2D2D",
      "r c #FF0000",
      /* pixels */
      "..............BB",
      ".........rrrrrrB",
      ".......rr.......",
      ".....B+.........",
      "....BBB.........",
      "....+B..........",
      "....r...........",
      "...r............",
      "...r............",
      "..r.............",
      "..r.............",
      ".r..............",
      ".r..............",
      ".r..............",
      "B+..............",
      "BB.............."
    },
    /* linear: */
    {
      /* width height ncolors chars_per_pixel */
      "16 16 5 1",
      /* colors */
      ". c None", /* transparent */
      "B c #000000",
      "' c #7F7F7F",
      "+ c #824141",
      "r c #FF0000",
      /* pixels */
      "..............BB",
      "..............+B",
      "..............r.",
      ".............r..",
      ".............r..",
      "....'B'.....r...",
      "....BBB.....r...",
      "....+B+....r....",
      "....r.r....r....",
      "...r...r..r.....",
      "...r...r..r.....",
      "..r.....rB+.....",
      "..r.....BBB.....",
      ".r......'B'.....",
      "B+..............",
      "BB.............."
    },
    /* free: */
    {
      /* width height ncolors chars_per_pixel */
      "16 16 2 1",
      /* colors */
      ". c None",
      "r c #FF0000",
      /* pixels */
      "................",
      "................",
      "......r.........",
      "......r.........",
      ".......r........",
      ".......r........",
      ".......r........",
      "........r.......",
      "........r.......",
      "........r.......",
      ".....r...r.rrrrr",
      "....r....r......",
      "...r.....r......",
      "..r.......r.....",
      ".r........r.....",
      "r..............."
    },
    /* gamma: */
    {
      /* width height ncolors chars_per_pixel */
      "16 16 10 1",
      /* colors */
      ". c None",
      "B c #000000",
      "& c #171717",
      "# c #2F2F2F",
      "X c #464646",
      "= c #5E5E5E",
      "/ c #757575",
      "+ c #8C8C8C",
      "- c #A4A4A4",
      "` c #BBBBBB",
      /* pixels */
      "................",
      "................",
      "................",
      "....B=..+B+.....",
      "....X&`./&-.....",
      "...../+.XX......",
      "......B.B+......",
      "......X.X.......",
      "......X&+.......",
      "......-B........",
      "....../=........",
      "......#B........",
      "......BB........",
      "......B#........",
      "................",
      "................"
    },
    /* reset: */
    {
      /* width height ncolors chars_per_pixel */
      "16 16 4 1",
      /* colors */
      ". c None",
      "B c #000000",
      "+ c #824141",
      "r c #FF0000",
      /* pixels */
      "..............BB",
      "..............+B",
      ".............r..",
      "............r...",
      "...........r....",
      "..........r.....",
      ".........r......",
      "........r.......",
      ".......r........",
      "......r.........",
      ".....r..........",
      "....r...........",
      "...r............",
      "..r.............",
      "B+..............",
      "BB.............."
    }
  };

Manish Singh's avatar
Manish Singh committed
214
GType
Elliot Lee's avatar
Elliot Lee committed
215 216
gtk_gamma_curve_get_type (void)
{
Manish Singh's avatar
Manish Singh committed
217
  static GType gamma_curve_type = 0;
Tim Janik's avatar
Tim Janik committed
218
  
Elliot Lee's avatar
Elliot Lee committed
219 220
  if (!gamma_curve_type)
    {
Manish Singh's avatar
Manish Singh committed
221
      static const GTypeInfo gamma_curve_info =
Elliot Lee's avatar
Elliot Lee committed
222 223
      {
	sizeof (GtkGammaCurveClass),
Manish Singh's avatar
Manish Singh committed
224 225 226 227 228 229 230 231
	NULL,		/* base_init */
	NULL,		/* base_finalize */
	(GClassInitFunc) gtk_gamma_curve_class_init,
	NULL,		/* class_finalize */
	NULL,		/* class_data */
	sizeof (GtkGammaCurve),
	0,		/* n_preallocs */
	(GInstanceInitFunc) gtk_gamma_curve_init,
Elliot Lee's avatar
Elliot Lee committed
232
      };
Tim Janik's avatar
Tim Janik committed
233
      
Manish Singh's avatar
Manish Singh committed
234 235
      gamma_curve_type = g_type_register_static (GTK_TYPE_VBOX, "GtkGammaCurve",
						 &gamma_curve_info, 0);
Elliot Lee's avatar
Elliot Lee committed
236 237 238 239 240 241 242 243 244
    }
  return gamma_curve_type;
}

static void
gtk_gamma_curve_class_init (GtkGammaCurveClass *class)
{
  GtkObjectClass *object_class;

Manish Singh's avatar
Manish Singh committed
245
  parent_class = g_type_class_peek_parent (class);
Elliot Lee's avatar
Elliot Lee committed
246 247 248 249 250 251 252 253

  object_class = (GtkObjectClass *) class;
  object_class->destroy = gtk_gamma_curve_destroy;
}

static void
gtk_gamma_curve_init (GtkGammaCurve *curve)
{
254 255 256
  GtkWidget *vbox;
  int i;

Elliot Lee's avatar
Elliot Lee committed
257
  curve->gamma = 1.0;
258 259 260 261 262 263

  curve->table = gtk_table_new (1, 2, FALSE);
  gtk_table_set_col_spacings (GTK_TABLE (curve->table), 3);
  gtk_container_add (GTK_CONTAINER (curve), curve->table);

  curve->curve = gtk_curve_new ();
Manish Singh's avatar
Manish Singh committed
264 265
  g_signal_connect (curve->curve, "curve_type_changed",
		    G_CALLBACK (curve_type_changed_callback), curve);
266 267 268 269 270 271 272 273 274
  gtk_table_attach_defaults (GTK_TABLE (curve->table), curve->curve, 0, 1, 0, 1);

  vbox = gtk_vbox_new (/* homogeneous */ FALSE, /* spacing */ 3);
  gtk_table_attach (GTK_TABLE (curve->table), vbox, 1, 2, 0, 1, 0, 0, 0, 0);

  /* toggle buttons: */
  for (i = 0; i < 3; ++i)
    {
      curve->button[i] = gtk_toggle_button_new ();
Manish Singh's avatar
Manish Singh committed
275 276
      g_object_set_data (G_OBJECT (curve->button[i]), "_GtkGammaCurveIndex",
			 GINT_TO_POINTER (i));
277
      gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
Manish Singh's avatar
Manish Singh committed
278 279 280 281
      g_signal_connect (curve->button[i], "realize",
			G_CALLBACK (button_realize_callback), NULL);
      g_signal_connect (curve->button[i], "toggled",
			G_CALLBACK (button_toggled_callback), curve);
282 283 284 285 286 287 288
      gtk_widget_show (curve->button[i]);
    }

  /* push buttons: */
  for (i = 3; i < 5; ++i)
    {
      curve->button[i] = gtk_button_new ();
Manish Singh's avatar
Manish Singh committed
289 290
      g_object_set_data (G_OBJECT (curve->button[i]), "_GtkGammaCurveIndex",
			 GINT_TO_POINTER (i));
291
      gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
Manish Singh's avatar
Manish Singh committed
292 293 294 295
      g_signal_connect (curve->button[i], "realize",
			G_CALLBACK (button_realize_callback), NULL);
      g_signal_connect (curve->button[i], "clicked",
			G_CALLBACK (button_clicked_callback), curve);
296 297 298 299 300 301
      gtk_widget_show (curve->button[i]);
    }

  gtk_widget_show (vbox);
  gtk_widget_show (curve->table);
  gtk_widget_show (curve->curve);
Elliot Lee's avatar
Elliot Lee committed
302 303 304 305 306 307 308 309 310 311
}

static void
button_realize_callback (GtkWidget *w)
{
  GtkWidget *pixmap;
  GdkBitmap *mask;
  GdkPixmap *pm;
  int i;

Manish Singh's avatar
Manish Singh committed
312
  i = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
Elliot Lee's avatar
Elliot Lee committed
313
  pm = gdk_pixmap_create_from_xpm_d (w->window, &mask,
314
				     &w->style->bg[GTK_STATE_NORMAL], (gchar **)xpm[i]);
Elliot Lee's avatar
Elliot Lee committed
315

Manish Singh's avatar
Manish Singh committed
316
  pixmap = gtk_image_new_from_pixmap (pm, mask);
Elliot Lee's avatar
Elliot Lee committed
317 318 319
  gtk_container_add (GTK_CONTAINER (w), pixmap);
  gtk_widget_show (pixmap);

Manish Singh's avatar
Manish Singh committed
320 321
  g_object_unref (pm);
  g_object_unref (mask);
Elliot Lee's avatar
Elliot Lee committed
322 323 324 325 326 327 328 329 330 331 332 333
}

static void
button_toggled_callback (GtkWidget *w, gpointer data)
{
  GtkGammaCurve *c = data;
  GtkCurveType type;
  int active, i;

  if (!GTK_TOGGLE_BUTTON (w)->active)
    return;

Manish Singh's avatar
Manish Singh committed
334
  active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
Elliot Lee's avatar
Elliot Lee committed
335 336 337 338 339 340

  for (i = 0; i < 3; ++i)
    if ((i != active) && GTK_TOGGLE_BUTTON (c->button[i])->active)
      break;

  if (i < 3)
341
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[i]), FALSE);
Elliot Lee's avatar
Elliot Lee committed
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363

  switch (active)
    {
    case 0:  type = GTK_CURVE_TYPE_SPLINE; break;
    case 1:  type = GTK_CURVE_TYPE_LINEAR; break;
    default: type = GTK_CURVE_TYPE_FREE; break;
    }
  gtk_curve_set_curve_type (GTK_CURVE (c->curve), type);
}

static void
gamma_cancel_callback (GtkWidget *w, gpointer data)
{
  GtkGammaCurve *c = data;

  gtk_widget_destroy (c->gamma_dialog);
}

static void
gamma_ok_callback (GtkWidget *w, gpointer data)
{
  GtkGammaCurve *c = data;
364 365
  const gchar *start;
  gchar *end;
Elliot Lee's avatar
Elliot Lee committed
366 367 368 369 370
  gfloat v;

  start = gtk_entry_get_text (GTK_ENTRY (c->gamma_text));
  if (start)
    {
371
      v = g_strtod (start, &end);
Elliot Lee's avatar
Elliot Lee committed
372 373 374 375 376 377 378 379 380 381 382 383 384
      if (end > start && v > 0.0)
	c->gamma = v;
    }
  gtk_curve_set_gamma (GTK_CURVE (c->curve), c->gamma);
  gamma_cancel_callback (w, data);
}

static void
button_clicked_callback (GtkWidget *w, gpointer data)
{
  GtkGammaCurve *c = data;
  int active;

Manish Singh's avatar
Manish Singh committed
385
  active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex"));
Elliot Lee's avatar
Elliot Lee committed
386
  if (active == 3)
387 388 389 390 391 392 393 394 395 396
    {
      /* set gamma */
      if (c->gamma_dialog)
	return;
      else
	{
	  GtkWidget *vbox, *hbox, *label, *button;
	  gchar buf[64];
	  
	  c->gamma_dialog = gtk_dialog_new ();
397 398
	  gtk_window_set_screen (GTK_WINDOW (c->gamma_dialog),
				 gtk_widget_get_screen (w));
399
	  gtk_window_set_title (GTK_WINDOW (c->gamma_dialog), _("Gamma"));
400 401 402
	  g_object_add_weak_pointer (G_OBJECT (c->gamma_dialog),
				     (gpointer *)&c->gamma_dialog);
	  
403 404 405 406 407 408
	  vbox = GTK_DIALOG (c->gamma_dialog)->vbox;
	  
	  hbox = gtk_hbox_new (/* homogeneous */ FALSE, 0);
	  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
	  gtk_widget_show (hbox);
	  
409
	  label = gtk_label_new_with_mnemonic (_("_Gamma value"));
410 411 412 413 414
	  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
	  gtk_widget_show (label);
	  
	  sprintf (buf, "%g", c->gamma);
	  c->gamma_text = gtk_entry_new ();
415
          gtk_label_set_mnemonic_widget (GTK_LABEL (label), c->gamma_text);
416 417 418 419 420 421
	  gtk_entry_set_text (GTK_ENTRY (c->gamma_text), buf);
	  gtk_box_pack_start (GTK_BOX (hbox), c->gamma_text, TRUE, TRUE, 2);
	  gtk_widget_show (c->gamma_text);
	  
	  /* fill in action area: */
	  hbox = GTK_DIALOG (c->gamma_dialog)->action_area;
422

423
          button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
Manish Singh's avatar
Manish Singh committed
424 425
	  g_signal_connect (button, "clicked",
			    G_CALLBACK (gamma_cancel_callback), c);
426 427
	  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
	  gtk_widget_show (button);
428
	  
429
          button = gtk_button_new_from_stock (GTK_STOCK_OK);
430
	  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
Manish Singh's avatar
Manish Singh committed
431 432
	  g_signal_connect (button, "clicked",
			    G_CALLBACK (gamma_ok_callback), c);
433 434 435 436 437 438 439
	  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
	  gtk_widget_grab_default (button);
	  gtk_widget_show (button);
	  
	  gtk_widget_show (c->gamma_dialog);
	}
    }
Elliot Lee's avatar
Elliot Lee committed
440
  else
441 442 443 444
    {
      /* reset */
      gtk_curve_reset (GTK_CURVE (c->curve));
    }
Elliot Lee's avatar
Elliot Lee committed
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
}

static void
curve_type_changed_callback (GtkWidget *w, gpointer data)
{
  GtkGammaCurve *c = data;
  GtkCurveType new_type;
  int active;

  new_type = GTK_CURVE (w)->curve_type;
  switch (new_type)
    {
    case GTK_CURVE_TYPE_SPLINE: active = 0; break;
    case GTK_CURVE_TYPE_LINEAR: active = 1; break;
    default:		        active = 2; break;
    }
  if (!GTK_TOGGLE_BUTTON (c->button[active])->active)
462
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[active]), TRUE);
Elliot Lee's avatar
Elliot Lee committed
463 464 465 466 467
}

GtkWidget*
gtk_gamma_curve_new (void)
{
Manish Singh's avatar
Manish Singh committed
468
  return g_object_new (GTK_TYPE_GAMMA_CURVE, NULL);
Elliot Lee's avatar
Elliot Lee committed
469 470 471 472 473 474 475 476 477 478 479 480
}

static void
gtk_gamma_curve_destroy (GtkObject *object)
{
  GtkGammaCurve *c;

  g_return_if_fail (GTK_IS_GAMMA_CURVE (object));

  c = GTK_GAMMA_CURVE (object);

  if (c->gamma_dialog)
481
    gtk_widget_destroy (c->gamma_dialog);
Elliot Lee's avatar
Elliot Lee committed
482 483 484 485

  if (GTK_OBJECT_CLASS (parent_class)->destroy)
    (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
Elliot Lee's avatar
Elliot Lee committed
486