1
/***************************************************************************
2
ADM_guiContrast.cpp - description
4
begin : Mon Sep 23 2002
5
copyright : (C) 2002 by mean
6
email : fixounet@free.fr
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
36
#include "ADM_editor/ADM_edit.hxx"
37
#include "ADM_video/ADM_genvideo.hxx"
38
#include "ADM_video/ADM_vidContrast.h"
40
#include "ADM_colorspace/ADM_rgb.h"
41
#include "ADM_gui2/support.h"
42
#include "ADM_toolkit/toolkit_gtk.h"
43
#include "ADM_toolkit/toolkit_gtk_include.h"
44
#include <ADM_assert.h>
47
#include "prototype.h"
50
static int getContrastParams (void);
52
static GtkWidget *create_dialog1 (void);
53
static GtkWidget *dialog = NULL;
54
static GtkObject *adj_offset = NULL, *adj_coeff = NULL;
56
static gboolean gui_draw (GtkWidget * widget,
57
GdkEventExpose * event, gpointer user_data);
59
//static int croplock;
60
static ColYuvRgb *rgbConv=NULL;
61
static void gui_update (GtkButton * button, gpointer user_data);
65
static uint8_t *video2, *video3;
66
static ADMImage *aImage;
67
static uint32_t sw, sh;
68
static CONTRAST_PARAM par;
70
static uint8_t tableluma[256], tablechroma[256];
72
uint8_t ADMVideoContrast::configure (AVDMGenericVideoStream * instream)
83
video2 = video3 = NULL;
85
// Get info from previous filter
86
w = _in->getInfo ()->width;
87
h = _in->getInfo ()->height;
89
rgbConv=new ColYuvRgb(w,h);
93
aImage = new ADMImage (w, h);
95
video2 = (uint8_t *) ADM_alloc (w * h * 4);
98
video3 = (uint8_t *) ADM_alloc (w * h * 4);
102
// ask current frame from previous filter
103
ADM_assert (instream->getFrameNumberNoAlloc (curframe, &l, aImage, &f));
105
// From now we work in RGB !
106
memcpy (video2, aImage->data, (w * h * 3)>>1);
108
//COL_yv12rgb (w, h, video2, video3);
109
rgbConv->scale(video2,video3);
112
memcpy (&par, _param, sizeof (par));
116
switch (r = getContrastParams ())
119
printf ("cancelled\n");
122
memcpy (_param, &par, sizeof (par));
130
ADM_dealloc (video2);
131
ADM_dealloc (video3);
133
video2 = video3 = NULL;
136
buildContrastTable (_param->coef, _param->offset, _tableFlat, _tableNZ);
143
// Get crop parameters from GUI
144
// left, right, top, down , initial size
147
getContrastParams (void)
150
#define WID(x) lookup_widget(dialog,#x)
151
#define CHECKBOX(x,y) if(TRUE==gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,#x)))) \
153
#define SCHECKBOX(x,y) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,#x)),y)
157
dialog = create_dialog1 ();
158
gtk_register_dialog(dialog);
159
gtk_widget_set_usize (WID (drawingarea1), sw, sh);
162
SCHECKBOX (checkLuma, par.doLuma);
163
SCHECKBOX (checkbuttonU, par.doChromaU);
164
SCHECKBOX (checkbuttonV, par.doChromaV);
166
GTK_ADJUSTMENT (adj_offset)->value = par.offset;
167
GTK_ADJUSTMENT (adj_coeff)->value = par.coef;
169
// add display callback
170
gtk_signal_connect (GTK_OBJECT (WID (drawingarea1)), "expose_event",
171
GTK_SIGNAL_FUNC (gui_draw), NULL);
174
#define CNX(x,y) gtk_signal_connect(GTK_OBJECT(WID(x)), y, \
175
GTK_SIGNAL_FUNC(gui_update), (void *) (1));
177
CNX (hscaleContrast, "value_changed");
178
CNX (hscaleContrast, "drag_data_received");
180
CNX (hscaleBright, "value_changed");
181
CNX (hscaleBright, "drag_data_received");
183
//gtk_widget_show (dialog);
186
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
188
CHECKBOX (checkLuma, par.doLuma);
189
CHECKBOX (checkbuttonU, par.doChromaU);
190
CHECKBOX (checkbuttonV, par.doChromaV);
192
par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
193
par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
195
// printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
196
// printf("\n off : %d, coeff %f\n",par.offset,par.coef);
200
gtk_unregister_dialog(dialog);
201
gtk_widget_destroy (dialog);
203
adj_coeff = adj_coeff = NULL;
207
// Check entered values and green-out the selected portion on the screen
208
// Each value must be even
211
gui_update (GtkButton * button, gpointer user_data)
214
UNUSED_ARG (user_data);
219
CHECKBOX (checkLuma, par.doLuma);
220
CHECKBOX (checkbuttonU, par.doChromaU);
221
CHECKBOX (checkbuttonV, par.doChromaV);
223
par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
224
par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
226
// printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
227
// printf("\n off : %d, coeff %f\n",par.offset,par.coef);
229
buildContrastTable (par.coef, par.offset, tableluma, tablechroma);
231
memcpy (video2, aImage->data, (sh * sw * 3)>>1);
234
doContrast (aImage->data, video2, tableluma, sw, sh);
239
doContrast (aImage->data + sz, video2 + sz, tablechroma, sw >> 1,
245
doContrast (aImage->data + sz + (sz >> 2), video2 + sz + (sz >> 2),
246
tablechroma, sw >> 1, sh >> 1);
249
//COL_yv12rgb (sw, sh, video2, video3);
250
rgbConv->scale(video2,video3);
251
GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
257
gui_draw (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
261
UNUSED_ARG (user_data);
263
GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
269
create_dialog1 (void)
306
dialog1 = gtk_dialog_new ();
307
gtk_window_set_title (GTK_WINDOW (dialog1), _("Contrast"));
309
dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
310
gtk_widget_show (dialog_vbox1);
312
vbox1 = gtk_vbox_new (FALSE, 0);
313
gtk_widget_show (vbox1);
314
gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
316
hbox1 = gtk_hbox_new (FALSE, 0);
317
gtk_widget_show (hbox1);
318
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
320
vbox3 = gtk_vbox_new (FALSE, 0);
321
gtk_widget_show (vbox3);
322
gtk_box_pack_start (GTK_BOX (hbox1), vbox3, TRUE, TRUE, 0);
324
label1 = gtk_label_new (_("Contrast"));
325
gtk_widget_show (label1);
326
gtk_box_pack_start (GTK_BOX (vbox3), label1, FALSE, FALSE, 0);
327
gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
331
adj_coeff = gtk_adjustment_new (1, 0.5, 1.5, 0.1, 0.1, 0);
332
hscaleContrast = gtk_hscale_new (GTK_ADJUSTMENT (adj_coeff));
333
gtk_widget_show (hscaleContrast);
334
gtk_box_pack_start (GTK_BOX (vbox3), hscaleContrast, FALSE, TRUE, 0);
335
gtk_scale_set_value_pos (GTK_SCALE (hscaleContrast), GTK_POS_LEFT);
337
label2 = gtk_label_new (_("Brightness"));
338
gtk_widget_show (label2);
339
gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
340
gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
343
adj_offset = gtk_adjustment_new (0, -127, 127, 1, 1, 0);
344
hscaleBright = gtk_hscale_new (GTK_ADJUSTMENT (adj_offset));
345
gtk_widget_show (hscaleBright);
346
gtk_box_pack_start (GTK_BOX (vbox3), hscaleBright, FALSE, TRUE, 0);
347
gtk_scale_set_value_pos (GTK_SCALE (hscaleBright), GTK_POS_LEFT);
348
gtk_scale_set_digits (GTK_SCALE (hscaleBright), 0);
350
vbox2 = gtk_vbox_new (FALSE, 0);
351
gtk_widget_show (vbox2);
352
gtk_box_pack_start (GTK_BOX (hbox1), vbox2, TRUE, TRUE, 0);
354
checkLuma = gtk_check_button_new_with_mnemonic (_("Luma"));
355
gtk_widget_show (checkLuma);
356
gtk_box_pack_start (GTK_BOX (vbox2), checkLuma, FALSE, FALSE, 0);
358
checkbuttonU = gtk_check_button_new_with_mnemonic (_("Chroma U"));
359
gtk_widget_show (checkbuttonU);
360
gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonU, FALSE, FALSE, 0);
362
checkbuttonV = gtk_check_button_new_with_mnemonic (_("Chroma V"));
363
gtk_widget_show (checkbuttonV);
364
gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonV, FALSE, FALSE, 0);
366
drawingarea1 = gtk_drawing_area_new ();
367
gtk_widget_show (drawingarea1);
368
gtk_box_pack_start (GTK_BOX (vbox1), drawingarea1, TRUE, TRUE, 0);
369
gtk_widget_set_size_request (drawingarea1, -1, 300);
371
dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
372
gtk_widget_show (dialog_action_area1);
373
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1),
376
cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
377
gtk_widget_show (cancelbutton1);
378
gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancelbutton1,
379
GTK_RESPONSE_CANCEL);
380
GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
382
okbutton1 = gtk_button_new_from_stock ("gtk-ok");
383
gtk_widget_show (okbutton1);
384
gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1,
386
GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
388
/* Store pointers to all widgets, for use by lookup_widget(). */
389
GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog1, "dialog1");
390
GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_vbox1, "dialog_vbox1");
391
GLADE_HOOKUP_OBJECT (dialog1, vbox1, "vbox1");
392
GLADE_HOOKUP_OBJECT (dialog1, hbox1, "hbox1");
393
GLADE_HOOKUP_OBJECT (dialog1, vbox3, "vbox3");
394
GLADE_HOOKUP_OBJECT (dialog1, label1, "label1");
395
GLADE_HOOKUP_OBJECT (dialog1, hscaleContrast, "hscaleContrast");
396
GLADE_HOOKUP_OBJECT (dialog1, label2, "label2");
397
GLADE_HOOKUP_OBJECT (dialog1, hscaleBright, "hscaleBright");
398
GLADE_HOOKUP_OBJECT (dialog1, vbox2, "vbox2");
399
GLADE_HOOKUP_OBJECT (dialog1, checkLuma, "checkLuma");
400
GLADE_HOOKUP_OBJECT (dialog1, checkbuttonU, "checkbuttonU");
401
GLADE_HOOKUP_OBJECT (dialog1, checkbuttonV, "checkbuttonV");
402
GLADE_HOOKUP_OBJECT (dialog1, drawingarea1, "drawingarea1");
403
GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_action_area1,
404
"dialog_action_area1");
405
GLADE_HOOKUP_OBJECT (dialog1, cancelbutton1, "cancelbutton1");
406
GLADE_HOOKUP_OBJECT (dialog1, okbutton1, "okbutton1");