1 /* GIMP - The GNU Image Manipulation Program
2  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
16  */
17 
18 #include "config.h"
19 
20 #include <string.h>
21 
22 #include <gtk/gtk.h>
23 
24 #include <libgimp/gimp.h>
25 #include <libgimp/gimpui.h>
26 
27 #include "gimpressionist.h"
28 #include "ppmtool.h"
29 #include "paper.h"
30 
31 #include "libgimp/stdplugins-intl.h"
32 
33 
34 static GtkWidget *paper_preview       = NULL;
35 static GtkWidget *paper_invert        = NULL;
36 static GtkWidget *paper_list          = NULL;
37 static GtkObject *paper_relief_adjust = NULL;
38 static GtkObject *paper_scale_adjust  = NULL;
39 static GtkWidget *paper_overlay       = NULL;
40 
paper_update_preview(void)41 static void paper_update_preview (void)
42 {
43   gint     i, j;
44   guchar  *buf, *paper_preview_buffer;
45   gdouble  sc;
46   ppm_t    p = {0, 0, NULL};
47 
48   ppm_load (pcvals.selected_paper, &p);
49   sc = p.width > p.height ? p.width : p.height;
50   sc = 100.0 / sc;
51   resize (&p, p.width*sc,p.height*sc);
52 
53   paper_preview_buffer = g_new0 (guchar, 100*100);
54 
55   for (i = 0, buf = paper_preview_buffer; i < 100; i++, buf += 100)
56     {
57       gint k = i * p.width * 3;
58 
59       if (i < p.height)
60         {
61           for (j = 0; j < p.width; j++)
62             buf[j] = p.col[k + j * 3];
63           if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert)))
64             for (j = 0; j < p.width; j++)
65               buf[j] = 255 - buf[j];
66         }
67     }
68   gimp_preview_area_draw (GIMP_PREVIEW_AREA (paper_preview),
69                           0, 0, 100, 100,
70                           GIMP_GRAY_IMAGE,
71                           paper_preview_buffer,
72                           100);
73 
74   ppm_kill (&p);
75   g_free (paper_preview_buffer);
76 
77   gtk_widget_queue_draw (paper_preview);
78 }
79 
80 static void
paper_select(GtkTreeSelection * selection,gpointer data)81 paper_select (GtkTreeSelection *selection,
82               gpointer          data)
83 {
84   GtkTreeIter   iter;
85   GtkTreeModel *model;
86 
87   if (gtk_tree_selection_get_selected (selection, &model, &iter))
88     {
89       gchar *paper;
90 
91       gtk_tree_model_get (model, &iter, 0, &paper, -1);
92 
93       if (paper)
94         {
95           gchar *fname = g_build_filename ("Paper", paper, NULL);
96 
97           g_strlcpy (pcvals.selected_paper,
98                      fname, sizeof (pcvals.selected_paper));
99 
100           paper_update_preview ();
101 
102           g_free (fname);
103           g_free (paper);
104         }
105     }
106 }
107 
108 void
paper_restore(void)109 paper_restore (void)
110 {
111   reselect (paper_list, pcvals.selected_paper);
112   gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_relief_adjust), pcvals.paper_relief);
113   gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_scale_adjust), pcvals.paper_scale);
114   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_invert), pcvals.paper_invert);
115   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_overlay), pcvals.paper_overlay);
116 }
117 
118 void
paper_store(void)119 paper_store (void)
120 {
121   pcvals.paper_invert = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert));
122   pcvals.paper_overlay = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_overlay));
123 }
124 
125 void
create_paperpage(GtkNotebook * notebook)126 create_paperpage (GtkNotebook *notebook)
127 {
128   GtkWidget         *box1, *thispage, *box2;
129   GtkWidget        *label, *tmpw, *table;
130   GtkWidget        *view;
131   GtkWidget        *frame;
132   GtkTreeSelection *selection;
133   GtkTreeIter       iter;
134   GtkListStore     *paper_store_list;
135 
136   label = gtk_label_new_with_mnemonic (_("P_aper"));
137 
138   thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
139   gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
140   gtk_widget_show (thispage);
141 
142   box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
143   gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE, TRUE, 0);
144   gtk_widget_show (box1);
145 
146   paper_list = view = create_one_column_list (box1, paper_select);
147   paper_store_list =
148     GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
149   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
150 
151   box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
152   gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
153   gtk_widget_show (box2);
154 
155   frame = gtk_frame_new (NULL);
156   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
157   gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0);
158   gtk_widget_show (frame);
159 
160   paper_preview = tmpw = gimp_preview_area_new ();
161   gtk_widget_set_size_request (tmpw, 100, 100);
162   gtk_container_add (GTK_CONTAINER (frame), tmpw);
163   gtk_widget_show (tmpw);
164 
165   paper_invert = tmpw = gtk_check_button_new_with_mnemonic ( _("_Invert"));
166   gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
167   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE);
168   gtk_widget_show (tmpw);
169   g_signal_connect_swapped (tmpw, "clicked",
170                             G_CALLBACK (paper_select), selection);
171   gimp_help_set_help_data (tmpw, _("Inverts the Papers texture"), NULL);
172   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
173                                 pcvals.paper_invert);
174 
175   paper_overlay = tmpw = gtk_check_button_new_with_mnemonic ( _("O_verlay"));
176   gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
177   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE);
178   gtk_widget_show (tmpw);
179   gimp_help_set_help_data
180     (tmpw, _("Applies the paper as it is (without embossing it)"), NULL);
181   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
182                                 pcvals.paper_overlay);
183 
184   table = gtk_table_new (2, 3, FALSE);
185   gtk_table_set_col_spacings (GTK_TABLE (table), 6);
186   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
187   gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0);
188   gtk_widget_show (table);
189 
190   paper_scale_adjust =
191     gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
192                           _("Scale:"),
193                           150, -1, pcvals.paper_scale,
194                           3.0, 150.0, 1.0, 10.0, 1,
195                           TRUE, 0, 0,
196                           _("Specifies the scale of the texture (in percent of original file)"),
197                           NULL);
198   g_signal_connect (paper_scale_adjust, "value-changed",
199                     G_CALLBACK (gimp_double_adjustment_update),
200                     &pcvals.paper_scale);
201 
202   paper_relief_adjust =
203     gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
204                           _("Relief:"),
205                           150, -1, pcvals.paper_relief,
206                           0.0, 100.0, 1.0, 10.0, 1,
207                           TRUE, 0, 0,
208                           _("Specifies the amount of embossing to apply to the image (in percent)"),
209                           NULL);
210   g_signal_connect (paper_relief_adjust, "value-changed",
211                     G_CALLBACK (gimp_double_adjustment_update),
212                     &pcvals.paper_relief);
213 
214 
215   if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (paper_store_list), &iter))
216     gtk_tree_selection_select_iter (selection, &iter);
217 
218   paper_select (selection, NULL);
219   readdirintolist ("Paper", view, pcvals.selected_paper);
220   gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
221 }
222