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