xref: /haiku/src/add-ons/translators/gif/GIFView.cpp (revision e8cd7007416a323259791ac09c013dcce2956976)
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 //	File: GIFView.cpp
4 //
5 //	Date: December 1999
6 //
7 //	Author: Daniel Switkin
8 //
9 //	Copyright 2003 (c) by Daniel Switkin. This file is made publically available
10 //	under the BSD license, with the stipulations that this complete header must
11 //	remain at the top of the file indefinitely, and credit must be given to the
12 //	original author in any about box using this software.
13 //
14 ////////////////////////////////////////////////////////////////////////////////
15 
16 // Additional authors:	Stephan Aßmus, <superstippi@gmx.de>
17 //                      Maxime Simon, <maxime.simon@gmail.com>
18 
19 #include <stdio.h>
20 #include <stdlib.h>
21 
22 #include <Catalog.h>
23 #include <GridLayoutBuilder.h>
24 #include <GroupLayout.h>
25 #include <GroupLayoutBuilder.h>
26 #include <InterfaceKit.h>
27 #include <String.h>
28 
29 #include "Prefs.h"
30 #include "SavePalette.h"
31 
32 #include "GIFView.h"
33 
34 #undef B_TRANSLATE_CONTEXT
35 #define B_TRANSLATE_CONTEXT "GIFView"
36 
37 
38 extern int32 translatorVersion;
39 extern char translatorName[];
40 
41 // constructor
42 GIFView::GIFView(const char *name)
43 	: BView(name, B_WILL_DRAW)
44 {
45 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
46 
47 	BStringView *title = new BStringView("Title", translatorName);
48 	title->SetFont(be_bold_font);
49 
50 	char version_string[100];
51 	sprintf(version_string, "v%d.%d.%d %s", (int)(translatorVersion >> 8),
52 		(int)((translatorVersion >> 4) & 0xf), (int)(translatorVersion & 0xf),
53 		__DATE__);
54 	BStringView *version = new BStringView("Version", version_string);
55 
56 	const char *copyrightString = "©2003 Daniel Switkin, software@switkin.com";
57 	BStringView *copyright = new BStringView("Copyright", copyrightString);
58 
59 	// menu fields (Palette & Colors)
60 	fWebSafeMI = new BMenuItem(B_TRANSLATE("Websafe"),
61 		new BMessage(GV_WEB_SAFE), 0, 0);
62 	fBeOSSystemMI = new BMenuItem(B_TRANSLATE("BeOS system"),
63 		new BMessage(GV_BEOS_SYSTEM), 0, 0);
64 	fGreyScaleMI = new BMenuItem(B_TRANSLATE("Greyscale"),
65 		new BMessage(GV_GREYSCALE), 0, 0);
66 	fOptimalMI = new BMenuItem(B_TRANSLATE("Optimal"),
67 		new BMessage(GV_OPTIMAL), 0, 0);
68 	fPaletteM = new BPopUpMenu("PalettePopUpMenu", true, true, B_ITEMS_IN_COLUMN);
69 	fPaletteM->AddItem(fWebSafeMI);
70 	fPaletteM->AddItem(fBeOSSystemMI);
71 	fPaletteM->AddItem(fGreyScaleMI);
72 	fPaletteM->AddItem(fOptimalMI);
73 
74 	fColorCountM = new BPopUpMenu("ColorCountPopUpMenu", true, true,
75 		B_ITEMS_IN_COLUMN);
76 	int32 count = 2;
77 	for (int32 i = 0; i < 8; i++) {
78 		BMessage* message = new BMessage(GV_SET_COLOR_COUNT);
79 		message->AddInt32("size in bits", i + 1);
80 		BString label;
81 		label << count;
82 		fColorCountMI[i] = new BMenuItem(label.String(), message, 0, 0);
83 		fColorCountM->AddItem(fColorCountMI[i]);
84 		count *= 2;
85 	}
86 	fColorCount256MI = fColorCountMI[7];
87 
88  	fPaletteMF = new BMenuField(B_TRANSLATE("Palette"), fPaletteM, NULL);
89 
90  	fColorCountMF = new BMenuField(B_TRANSLATE("Colors"), fColorCountM, NULL);
91 
92  	// check boxes
93  	fUseDitheringCB = new BCheckBox(B_TRANSLATE("Use dithering"),
94  		new BMessage(GV_USE_DITHERING));
95 
96  	fInterlacedCB = new BCheckBox(B_TRANSLATE("Write interlaced images"),
97  		new BMessage(GV_INTERLACED));
98 
99  	fUseTransparentCB = new BCheckBox(B_TRANSLATE("Write transparent images"),
100  		new BMessage(GV_USE_TRANSPARENT));
101 
102  	// radio buttons
103  	fUseTransparentAutoRB = new BRadioButton(
104  		B_TRANSLATE("Automatic (from alpha channel)"),
105  		new BMessage(GV_USE_TRANSPARENT_AUTO));
106 
107  	fUseTransparentColorRB = new BRadioButton(B_TRANSLATE("Use RGB color"),
108  		new BMessage(GV_USE_TRANSPARENT_COLOR));
109 
110  	fTransparentRedTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_RED));
111 
112  	fTransparentGreenTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_GREEN));
113 
114  	fTransparentBlueTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_BLUE));
115 
116 	BTextView *tr = fTransparentRedTC->TextView();
117 	BTextView *tg = fTransparentGreenTC->TextView();
118 	BTextView *tb = fTransparentBlueTC->TextView();
119 
120 	for (uint32 x = 0; x < 256; x++) {
121 		if (x < '0' || x > '9') {
122 			tr->DisallowChar(x);
123 			tg->DisallowChar(x);
124 			tb->DisallowChar(x);
125 		}
126 	}
127 
128 	SetLayout(new BGroupLayout(B_HORIZONTAL));
129 
130 	AddChild(BGroupLayoutBuilder(B_VERTICAL, 7)
131 		.Add(BGridLayoutBuilder(10, 10)
132 			.Add(title, 0, 0)
133 			.Add(version, 1, 0)
134 		)
135 		.Add(copyright)
136 		.AddGlue()
137 
138 		.Add(BGridLayoutBuilder(10, 10)
139 			.Add(fPaletteMF->CreateLabelLayoutItem(), 0, 0)
140         	.Add(fPaletteMF->CreateMenuBarLayoutItem(), 1, 0)
141 
142 			.Add(fColorCountMF->CreateLabelLayoutItem(), 0, 1)
143         	.Add(fColorCountMF->CreateMenuBarLayoutItem(), 1, 1)
144 		)
145 		.AddGlue()
146 
147 		.Add(fUseDitheringCB)
148 		.Add(fInterlacedCB)
149 		.Add(fUseTransparentCB)
150 
151 		.Add(fUseTransparentAutoRB)
152 		.Add(BGridLayoutBuilder(10, 10)
153 			.Add(fUseTransparentColorRB, 0, 0)
154 			.Add(fTransparentRedTC, 1, 0)
155 			.Add(fTransparentGreenTC, 2, 0)
156 			.Add(fTransparentBlueTC, 3, 0)
157 		)
158 		.AddGlue()
159 		.SetInsets(5, 5, 5, 5)
160 	);
161 
162 	BFont font;
163 	GetFont(&font);
164 	SetExplicitPreferredSize(BSize((font.Size() * 400)/12, (font.Size() * 300)/12));
165 
166 	RestorePrefs();
167 }
168 
169 
170 GIFView::~GIFView()
171 {
172 	delete fPrefs;
173 }
174 
175 
176 void
177 GIFView::RestorePrefs()
178 {
179 	fPrefs = new Prefs();
180 
181 	fColorCountMF->SetEnabled(false);
182 	fUseDitheringCB->SetEnabled(true);
183 
184 	switch (fPrefs->palettemode) {
185 		case WEB_SAFE_PALETTE:
186 			fWebSafeMI->SetMarked(true);
187 			break;
188 		case BEOS_SYSTEM_PALETTE:
189 			fBeOSSystemMI->SetMarked(true);
190 			break;
191 		case GREYSCALE_PALETTE:
192 			fGreyScaleMI->SetMarked(true);
193 			fUseDitheringCB->SetEnabled(false);
194 			break;
195 		case OPTIMAL_PALETTE:
196 			fOptimalMI->SetMarked(true);
197 			fColorCountMF->SetEnabled(true);
198 			break;
199 		default:
200 			fPrefs->palettemode = WEB_SAFE_PALETTE;
201 			fWebSafeMI->SetMarked(true);
202 			break;
203 	}
204 
205 	if (fColorCountMF->IsEnabled() &&
206 		fPrefs->palette_size_in_bits > 0 &&
207 		fPrefs->palette_size_in_bits <= 8) {
208 		// display the stored color count
209 		fColorCountMI[fPrefs->palette_size_in_bits - 1]->SetMarked(true);
210 	} else {
211 		// display 256 colors
212 		fColorCount256MI->SetMarked(true);
213 		fPrefs->palette_size_in_bits = 8;
214 	}
215 
216 	fInterlacedCB->SetValue(fPrefs->interlaced);
217 
218 	if (fGreyScaleMI->IsMarked()) fUseDitheringCB->SetValue(false);
219 	else fUseDitheringCB->SetValue(fPrefs->usedithering);
220 	fUseTransparentCB->SetValue(fPrefs->usetransparent);
221 	fUseTransparentAutoRB->SetValue(fPrefs->usetransparentauto);
222 	fUseTransparentColorRB->SetValue(!fPrefs->usetransparentauto);
223 	if (fPrefs->usetransparent) {
224 		fUseTransparentAutoRB->SetEnabled(true);
225 		fUseTransparentColorRB->SetEnabled(true);
226 		fTransparentRedTC->SetEnabled(!fPrefs->usetransparentauto);
227 		fTransparentGreenTC->SetEnabled(!fPrefs->usetransparentauto);
228 		fTransparentBlueTC->SetEnabled(!fPrefs->usetransparentauto);
229 	} else {
230 		fUseTransparentAutoRB->SetEnabled(false);
231 		fUseTransparentColorRB->SetEnabled(false);
232 		fTransparentRedTC->SetEnabled(false);
233 		fTransparentGreenTC->SetEnabled(false);
234 		fTransparentBlueTC->SetEnabled(false);
235 	}
236 
237 	char temp[4];
238 	sprintf(temp, "%d", fPrefs->transparentred);
239 	fTransparentRedTC->SetText(temp);
240 	sprintf(temp, "%d", fPrefs->transparentgreen);
241 	fTransparentGreenTC->SetText(temp);
242 	sprintf(temp, "%d", fPrefs->transparentblue);
243 	fTransparentBlueTC->SetText(temp);
244 }
245 
246 // AllAttached
247 void
248 GIFView::AllAttached()
249 {
250 	BView::AllAttached();
251 	BMessenger msgr(this);
252 	fInterlacedCB->SetTarget(msgr);
253 	fUseDitheringCB->SetTarget(msgr);
254 	fUseTransparentCB->SetTarget(msgr);
255 	fUseTransparentAutoRB->SetTarget(msgr);
256 	fUseTransparentColorRB->SetTarget(msgr);
257 	fTransparentRedTC->SetTarget(msgr);
258 	fTransparentGreenTC->SetTarget(msgr);
259 	fTransparentBlueTC->SetTarget(msgr);
260 	fPaletteM->SetTargetForItems(msgr);
261 	fColorCountM->SetTargetForItems(msgr);
262 }
263 
264 // MessageReceived
265 void
266 GIFView::MessageReceived(BMessage *message)
267 {
268 	switch (message->what) {
269 		case GV_WEB_SAFE:
270 			fPrefs->palettemode = WEB_SAFE_PALETTE;
271 			fUseDitheringCB->SetEnabled(true);
272 			fColorCountMF->SetEnabled(false);
273 			fColorCount256MI->SetMarked(true);
274 			break;
275 		case GV_BEOS_SYSTEM:
276 			fPrefs->palettemode = BEOS_SYSTEM_PALETTE;
277 			fUseDitheringCB->SetEnabled(true);
278 			fColorCountMF->SetEnabled(false);
279 			fColorCount256MI->SetMarked(true);
280 			break;
281 		case GV_GREYSCALE:
282 			fPrefs->palettemode = GREYSCALE_PALETTE;
283 			fUseDitheringCB->SetEnabled(false);
284 			fUseDitheringCB->SetValue(false);
285 			fColorCountMF->SetEnabled(false);
286 			fColorCount256MI->SetMarked(true);
287 			fPrefs->usedithering = false;
288 			break;
289 		case GV_OPTIMAL:
290 			fPrefs->palettemode = OPTIMAL_PALETTE;
291 			fUseDitheringCB->SetEnabled(true);
292 			fColorCountMF->SetEnabled(true);
293 			fColorCountMI[fPrefs->palette_size_in_bits - 1]->SetMarked(true);
294 			break;
295 		case GV_SET_COLOR_COUNT:
296 			if (fColorCountMF->IsEnabled()) {
297 				int32 sizeInBits;
298 				if (message->FindInt32("size in bits", &sizeInBits) >= B_OK) {
299 					if (sizeInBits > 0 && sizeInBits <= 8)
300 						fPrefs->palette_size_in_bits = sizeInBits;
301 				}
302 			}
303 			break;
304 		case GV_INTERLACED:
305 			fPrefs->interlaced = fInterlacedCB->Value();
306 			break;
307 		case GV_USE_DITHERING:
308 			fPrefs->usedithering = fUseDitheringCB->Value();
309 			break;
310 		case GV_USE_TRANSPARENT:
311 			fPrefs->usetransparent = fUseTransparentCB->Value();
312 			if (fPrefs->usetransparent) {
313 				fUseTransparentAutoRB->SetEnabled(true);
314 				fUseTransparentColorRB->SetEnabled(true);
315 				fTransparentRedTC->SetEnabled(fUseTransparentColorRB->Value());
316 				fTransparentGreenTC->SetEnabled(fUseTransparentColorRB->Value());
317 				fTransparentBlueTC->SetEnabled(fUseTransparentColorRB->Value());
318 			} else {
319 				fUseTransparentAutoRB->SetEnabled(false);
320 				fUseTransparentColorRB->SetEnabled(false);
321 				fTransparentRedTC->SetEnabled(false);
322 				fTransparentGreenTC->SetEnabled(false);
323 				fTransparentBlueTC->SetEnabled(false);
324 			}
325 			break;
326 		case GV_USE_TRANSPARENT_AUTO:
327 			fPrefs->usetransparentauto = true;
328 			fTransparentRedTC->SetEnabled(false);
329 			fTransparentGreenTC->SetEnabled(false);
330 			fTransparentBlueTC->SetEnabled(false);
331 			break;
332 		case GV_USE_TRANSPARENT_COLOR:
333 			fPrefs->usetransparentauto = false;
334 			fTransparentRedTC->SetEnabled(true);
335 			fTransparentGreenTC->SetEnabled(true);
336 			fTransparentBlueTC->SetEnabled(true);
337 			break;
338 		case GV_TRANSPARENT_RED:
339 			fPrefs->transparentred = CheckInput(fTransparentRedTC);
340 			break;
341 		case GV_TRANSPARENT_GREEN:
342 			fPrefs->transparentgreen = CheckInput(fTransparentGreenTC);
343 			break;
344 		case GV_TRANSPARENT_BLUE:
345 			fPrefs->transparentblue = CheckInput(fTransparentBlueTC);
346 			break;
347 		default:
348 			BView::MessageReceived(message);
349 			break;
350 	}
351 	fPrefs->Save();
352 }
353 
354 int GIFView::CheckInput(BTextControl *control) {
355 	int value = atoi(control->Text());
356 	if (value < 0 || value > 255) {
357 		value = (value < 0) ? 0 : 255;
358 		char temp[4];
359 		sprintf(temp, "%d", value);
360 		control->SetText(temp);
361 	}
362 	return value;
363 }
364 
365