It now also uses the shared TranslatorSettings class, and localise its name
to be used in DataTranslations preflet.
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
// Philippe Saint-Pierre, <[email protected]>
|
||||
|
||||
#include "GIFSave.h"
|
||||
#include <stdio.h>
|
||||
@@ -35,21 +36,26 @@ class ColorCache : public HashItem {
|
||||
};
|
||||
|
||||
// constructor
|
||||
GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
GIFSave::GIFSave(BBitmap* bitmap, BPositionIO* output,
|
||||
TranslatorSettings* settings)
|
||||
{
|
||||
fSettings = settings;
|
||||
color_space cs = bitmap->ColorSpace();
|
||||
if (cs != B_RGB32 && cs != B_RGBA32 && cs != B_RGB32_BIG && cs != B_RGBA32_BIG) {
|
||||
if (debug) syslog(LOG_ERR, "GIFSave::GIFSave() - Unknown color space\n");
|
||||
fatalerror = true;
|
||||
return;
|
||||
}
|
||||
if (cs != B_RGB32 && cs != B_RGBA32 && cs != B_RGB32_BIG
|
||||
&& cs != B_RGBA32_BIG) {
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Unknown color space\n");
|
||||
fatalerror = true;
|
||||
return;
|
||||
}
|
||||
|
||||
fatalerror = false;
|
||||
prefs = new Prefs();
|
||||
if (prefs->palettemode == OPTIMAL_PALETTE)
|
||||
palette = new SavePalette(bitmap, prefs->palette_size_in_bits);
|
||||
if (fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE) == OPTIMAL_PALETTE)
|
||||
palette = new SavePalette(bitmap,
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE));
|
||||
else
|
||||
palette = new SavePalette(prefs->palettemode);
|
||||
palette = new SavePalette(
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE));
|
||||
if (!palette->IsValid()) {
|
||||
fatalerror = true;
|
||||
return;
|
||||
@@ -58,12 +64,12 @@ GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
width = bitmap->Bounds().IntegerWidth() + 1;
|
||||
height = bitmap->Bounds().IntegerHeight() + 1;
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Image dimensions are %d by %d\n",
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Image dimensions are %d by %d\n",
|
||||
width, height);
|
||||
|
||||
if (prefs->usedithering) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_DITHERING)) {
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Using dithering\n");
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Using dithering\n");
|
||||
red_error = new int32[width + 2];
|
||||
red_error = &red_error[1]; // Allow index of -1 too
|
||||
green_error = new int32[width + 2];
|
||||
@@ -77,16 +83,15 @@ GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
green_error[x] = 0;
|
||||
blue_error[x] = 0;
|
||||
}
|
||||
} else {
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Not using dithering\n");
|
||||
}
|
||||
} else if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Not using dithering\n");
|
||||
|
||||
if (debug) {
|
||||
if (prefs->interlaced)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Interlaced, ");
|
||||
else syslog(LOG_ERR, "GIFSave::GIFSave() - Not interlaced, ");
|
||||
switch (prefs->palettemode) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_INTERLACED))
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Interlaced, ");
|
||||
else
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Not interlaced, ");
|
||||
switch (fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE)) {
|
||||
case WEB_SAFE_PALETTE:
|
||||
syslog(LOG_ERR, "web safe palette\n");
|
||||
break;
|
||||
@@ -103,20 +108,23 @@ GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs->usetransparent) {
|
||||
if (prefs->usetransparentauto) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT)) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO)) {
|
||||
palette->PrepareForAutoTransparency();
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Using transparent index %d\n",
|
||||
palette->TransparentIndex());
|
||||
} else {
|
||||
palette->SetTransparentColor((uint8)prefs->transparentred,
|
||||
(uint8)prefs->transparentgreen,
|
||||
(uint8)prefs->transparentblue);
|
||||
palette->SetTransparentColor(
|
||||
(uint8)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_RED),
|
||||
(uint8)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_GREEN),
|
||||
(uint8)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_BLUE));
|
||||
if (debug) {
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Found transparent color %d,%d,%d "
|
||||
"at index %d\n", prefs->transparentred,
|
||||
prefs->transparentgreen, prefs->transparentblue,
|
||||
"at index %d\n",
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_RED),
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_GREEN),
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_BLUE),
|
||||
palette->TransparentIndex());
|
||||
}
|
||||
}
|
||||
@@ -128,17 +136,21 @@ GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
this->output = output;
|
||||
this->bitmap = bitmap;
|
||||
WriteGIFHeader();
|
||||
if (debug) syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif header\n");
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif header\n");
|
||||
|
||||
hash = new SFHash(1 << 16);
|
||||
WriteGIFControlBlock();
|
||||
if (debug) syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif control block\n");
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif control block\n");
|
||||
WriteGIFImageHeader();
|
||||
if (debug) syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif image header\n");
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif image header\n");
|
||||
WriteGIFImageData();
|
||||
if (debug) syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif image data\n");
|
||||
if (debug)
|
||||
syslog(LOG_ERR, "GIFSave::GIFSave() - Wrote gif image data\n");
|
||||
|
||||
if (prefs->usedithering) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_DITHERING)) {
|
||||
delete [] &red_error[-1];
|
||||
delete [] &green_error[-1];
|
||||
delete [] &blue_error[-1];
|
||||
@@ -154,7 +166,7 @@ GIFSave::GIFSave(BBitmap *bitmap, BPositionIO *output)
|
||||
GIFSave::~GIFSave()
|
||||
{
|
||||
delete palette;
|
||||
delete prefs;
|
||||
fSettings->Release();
|
||||
}
|
||||
|
||||
// WriteGIFHeader
|
||||
@@ -204,8 +216,10 @@ void GIFSave::WriteGIFImageHeader()
|
||||
header[7] = height & 0xff;
|
||||
header[8] = (height & 0xff00) >> 8;
|
||||
|
||||
if (prefs->interlaced) header[9] = 0x40;
|
||||
else header[9] = 0x00;
|
||||
if (fSettings->SetGetBool(GIF_SETTING_INTERLACED))
|
||||
header[9] = 0x40;
|
||||
else
|
||||
header[9] = 0x00;
|
||||
output->Write(header, 10);
|
||||
}
|
||||
|
||||
@@ -336,7 +350,9 @@ GIFSave::NextPixel(int pixel)
|
||||
{
|
||||
int bpr = bitmap->BytesPerRow();
|
||||
color_space cs = bitmap->ColorSpace();
|
||||
bool useAlphaForTransparency = (prefs->usetransparentauto && cs == B_RGBA32) || cs == B_RGBA32_BIG;
|
||||
bool useAlphaForTransparency =
|
||||
(fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO)
|
||||
&& cs == B_RGBA32) || cs == B_RGBA32_BIG;
|
||||
unsigned char r, g, b, a;
|
||||
|
||||
if (cs == B_RGB32 || cs == B_RGBA32) {
|
||||
@@ -353,22 +369,23 @@ GIFSave::NextPixel(int pixel)
|
||||
gifbits += 4;
|
||||
pos += 4;
|
||||
|
||||
if (!prefs->usetransparent || prefs->usetransparentauto ||
|
||||
r != prefs->transparentred ||
|
||||
g != prefs->transparentgreen ||
|
||||
b != prefs->transparentblue) {
|
||||
if (!fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT)
|
||||
|| fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO)
|
||||
|| r != fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_RED)
|
||||
|| g != fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_GREEN)
|
||||
|| b != fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_BLUE)) {
|
||||
|
||||
if (prefs->usedithering) {
|
||||
if (pixel % width == 0) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_DITHERING)) {
|
||||
if (pixel % width == 0)
|
||||
red_side_error = green_side_error = blue_side_error = 0;
|
||||
}
|
||||
|
||||
b = min_c(255, max_c(0, b - blue_side_error));
|
||||
g = min_c(255, max_c(0, g - green_side_error));
|
||||
r = min_c(255, max_c(0, r - red_side_error));
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs->interlaced) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_INTERLACED)) {
|
||||
if (pos >= bpr) {
|
||||
pos = 0;
|
||||
row += gs_increment_pass_by[pass];
|
||||
@@ -426,11 +443,12 @@ GIFSave::NextPixel(int pixel)
|
||||
|
||||
int index = palette->IndexForColor(r, g, b, useAlphaForTransparency ? a : 255);
|
||||
|
||||
if (index != palette->TransparentIndex() && prefs->usedithering) {
|
||||
if (index != palette->TransparentIndex()
|
||||
&& fSettings->SetGetBool(GIF_SETTING_USE_DITHERING)) {
|
||||
int x = pixel % width;
|
||||
// Don't carry error on to next line when interlaced because
|
||||
// that line won't be adjacent, hence error is meaningless
|
||||
if (prefs->interlaced && x == width - 1) {
|
||||
if (fSettings->SetGetBool(GIF_SETTING_INTERLACED) && x == width - 1) {
|
||||
for (int32 y = -1; y < width + 1; y++) {
|
||||
red_error[y] = 0;
|
||||
green_error[y] = 0;
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
#include <Bitmap.h>
|
||||
#include "SavePalette.h"
|
||||
#include "SFHash.h"
|
||||
#include "Prefs.h"
|
||||
|
||||
#include "GIFTranslator.h"
|
||||
|
||||
#define HASHSIZE 9973
|
||||
#define HASHSTEP 2039
|
||||
@@ -29,7 +30,7 @@
|
||||
|
||||
class GIFSave {
|
||||
public:
|
||||
GIFSave(BBitmap *bitmap, BPositionIO *output);
|
||||
GIFSave(BBitmap* bitmap, BPositionIO* output, TranslatorSettings* settings);
|
||||
~GIFSave();
|
||||
|
||||
bool fatalerror;
|
||||
@@ -51,7 +52,7 @@ class GIFSave {
|
||||
BBitmap *bitmap;
|
||||
SavePalette *palette;
|
||||
SFHash *hash;
|
||||
Prefs *prefs;
|
||||
TranslatorSettings *fSettings;
|
||||
|
||||
short *code_value, *prefix_code;
|
||||
unsigned char *append_char;
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
// original author in any about box using this software.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
|
||||
#include "GIFTranslator.h"
|
||||
#include "GIFWindow.h"
|
||||
#include "GIFView.h"
|
||||
#include "GIFSave.h"
|
||||
#include "GIFLoad.h"
|
||||
|
||||
|
||||
#include <Application.h>
|
||||
#include <ByteOrder.h>
|
||||
#include <Catalog.h>
|
||||
#include <DataIO.h>
|
||||
@@ -33,6 +33,8 @@
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
|
||||
#include "TranslatorWindow.h"
|
||||
|
||||
#ifndef GIF_TYPE
|
||||
#define GIF_TYPE 'GIF '
|
||||
#endif
|
||||
@@ -48,38 +50,38 @@ bool debug = false;
|
||||
bool DetermineType(BPositionIO *source, bool *is_gif);
|
||||
status_t GetBitmap(BPositionIO *in, BBitmap **out);
|
||||
|
||||
/* Required data */
|
||||
char translatorName[] = "GIF images";
|
||||
char translatorInfo[] = "GIF image translator v1.4";
|
||||
int32 translatorVersion = 0x140;
|
||||
|
||||
translation_format inputFormats[] = {
|
||||
{ GIF_TYPE, B_TRANSLATOR_BITMAP, 0.8, 0.8, "image/gif",
|
||||
"GIF image" },
|
||||
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.3, 0.3, "image/x-be-bitmap",
|
||||
"Be Bitmap Format (GIFTranslator)" },
|
||||
{ 0 }
|
||||
static const translation_format sInputFormats[] = {
|
||||
{ GIF_TYPE, B_TRANSLATOR_BITMAP, GIF_IN_QUALITY, GIF_IN_CAPABILITY,
|
||||
"image/gif", "GIF image" },
|
||||
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, BBM_IN_QUALITY, BBM_IN_CAPABILITY,
|
||||
"image/x-be-bitmap", "Be Bitmap Format (GIFTranslator)" }
|
||||
};
|
||||
|
||||
translation_format outputFormats[] = {
|
||||
{ GIF_TYPE, B_TRANSLATOR_BITMAP, 0.8, 0.8, "image/gif",
|
||||
static const translation_format sOutputFormats[] = {
|
||||
{ GIF_TYPE, B_TRANSLATOR_BITMAP, GIF_OUT_QUALITY, GIF_OUT_CAPABILITY, "image/gif",
|
||||
"GIF image" },
|
||||
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.3, 0.3, "image/x-be-bitmap",
|
||||
"Be Bitmap Format (GIFTranslator)" },
|
||||
{ 0 }
|
||||
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, BBM_OUT_QUALITY, BBM_OUT_CAPABILITY,
|
||||
"image/x-be-bitmap", "Be Bitmap Format (GIFTranslator)" }
|
||||
};
|
||||
|
||||
// Default settings for the Translator
|
||||
static const TranSetting sDefaultSettings[] = {
|
||||
{B_TRANSLATOR_EXT_HEADER_ONLY, TRAN_SETTING_BOOL, false},
|
||||
{B_TRANSLATOR_EXT_DATA_ONLY, TRAN_SETTING_BOOL, false},
|
||||
{GIF_SETTING_INTERLACED, TRAN_SETTING_BOOL, false},
|
||||
{GIF_SETTING_USE_TRANSPARENT, TRAN_SETTING_BOOL, false},
|
||||
{GIF_SETTING_USE_TRANSPARENT_AUTO, TRAN_SETTING_BOOL, false},
|
||||
{GIF_SETTING_USE_DITHERING, TRAN_SETTING_BOOL, false},
|
||||
{GIF_SETTING_PALETTE_MODE, TRAN_SETTING_INT32, 0},
|
||||
{GIF_SETTING_PALETTE_SIZE, TRAN_SETTING_INT32, 8},
|
||||
{GIF_SETTING_TRANSPARENT_RED, TRAN_SETTING_INT32, 0},
|
||||
{GIF_SETTING_TRANSPARENT_GREEN, TRAN_SETTING_INT32, 0},
|
||||
{GIF_SETTING_TRANSPARENT_BLUE, TRAN_SETTING_INT32, 0}
|
||||
};
|
||||
|
||||
/* Build a pretty view for DataTranslations */
|
||||
status_t
|
||||
MakeConfig(BMessage *ioExtension, BView **outView, BRect *outExtent)
|
||||
{
|
||||
GIFView *gifview = new GIFView("TranslatorView");
|
||||
*outView = gifview;
|
||||
gifview->ResizeTo(gifview->ExplicitPreferredSize());
|
||||
*outExtent = gifview->Bounds();
|
||||
return B_OK;
|
||||
}
|
||||
const uint32 kNumInputFormats = sizeof(sInputFormats) / sizeof(translation_format);
|
||||
const uint32 kNumOutputFormats = sizeof(sOutputFormats) / sizeof(translation_format);
|
||||
const uint32 kNumDefaultSettings = sizeof(sDefaultSettings) / sizeof(TranSetting);
|
||||
|
||||
|
||||
/* Look at first few bytes in stream to determine type - throw it back
|
||||
@@ -89,7 +91,8 @@ DetermineType(BPositionIO *source, bool *is_gif)
|
||||
{
|
||||
unsigned char header[7];
|
||||
*is_gif = true;
|
||||
if (source->Read(header, 6) != 6) return false;
|
||||
if (source->Read(header, 6) != 6)
|
||||
return false;
|
||||
header[6] = 0x00;
|
||||
|
||||
if (strcmp((char *)header, "GIF87a") != 0 && strcmp((char *)header,
|
||||
@@ -97,13 +100,16 @@ DetermineType(BPositionIO *source, bool *is_gif)
|
||||
*is_gif = false;
|
||||
int32 magic = (header[0] << 24) + (header[1] << 16) + (header[2] << 8)
|
||||
+ header[3];
|
||||
if (magic != B_TRANSLATOR_BITMAP) return false;
|
||||
if (magic != B_TRANSLATOR_BITMAP)
|
||||
return false;
|
||||
source->Seek(5 * 4 - 2, SEEK_CUR);
|
||||
color_space cs;
|
||||
if (source->Read(&cs, 4) != 4) return false;
|
||||
if (source->Read(&cs, 4) != 4)
|
||||
return false;
|
||||
cs = (color_space)B_BENDIAN_TO_HOST_INT32(cs);
|
||||
if (cs != B_RGB32 && cs != B_RGBA32 && cs != B_RGB32_BIG && cs
|
||||
!= B_RGBA32_BIG) return false;
|
||||
if (cs != B_RGB32 && cs != B_RGBA32 && cs != B_RGB32_BIG
|
||||
&& cs != B_RGBA32_BIG)
|
||||
return false;
|
||||
}
|
||||
|
||||
source->Seek(0, SEEK_SET);
|
||||
@@ -130,16 +136,18 @@ GetBitmap(BPositionIO *in, BBitmap **out)
|
||||
header.colors = (color_space)B_BENDIAN_TO_HOST_INT32(header.colors);
|
||||
header.dataSize = B_BENDIAN_TO_HOST_INT32(header.dataSize);
|
||||
|
||||
BBitmap *bitmap = new BBitmap(header.bounds, header.colors);
|
||||
BBitmap* bitmap = new(std::nothrow) BBitmap(header.bounds, header.colors);
|
||||
*out = bitmap;
|
||||
if (bitmap == NULL) return B_NO_MEMORY;
|
||||
if (bitmap == NULL)
|
||||
return B_NO_MEMORY;
|
||||
unsigned char *bits = (unsigned char *)bitmap->Bits();
|
||||
if (bits == NULL) {
|
||||
delete bitmap;
|
||||
return B_NO_MEMORY;
|
||||
}
|
||||
err = in->Read(bits, header.dataSize);
|
||||
if (err == (status_t)header.dataSize) return B_OK;
|
||||
if (err == (status_t)header.dataSize)
|
||||
return B_OK;
|
||||
else {
|
||||
delete bitmap;
|
||||
return B_IO_ERROR;
|
||||
@@ -149,34 +157,36 @@ GetBitmap(BPositionIO *in, BBitmap **out)
|
||||
|
||||
/* Required Identify function - may need to read entire header, not sure */
|
||||
status_t
|
||||
Identify(BPositionIO *inSource, const translation_format *inFormat,
|
||||
BMessage *ioExtension, translator_info *outInfo, uint32 outType)
|
||||
GIFTranslator::DerivedIdentify(BPositionIO* inSource,
|
||||
const translation_format* inFormat, BMessage* ioExtension,
|
||||
translator_info* outInfo, uint32 outType)
|
||||
{
|
||||
|
||||
const char *debug_text = getenv("GIF_TRANSLATOR_DEBUG");
|
||||
if ((debug_text != NULL) && (atoi(debug_text) != 0)) debug = true;
|
||||
if (debug_text != NULL && atoi(debug_text) != 0)
|
||||
debug = true;
|
||||
|
||||
if (outType == 0) outType = B_TRANSLATOR_BITMAP;
|
||||
if (outType == 0)
|
||||
outType = B_TRANSLATOR_BITMAP;
|
||||
if (outType != GIF_TYPE && outType != B_TRANSLATOR_BITMAP)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
bool is_gif;
|
||||
if (!DetermineType(inSource, &is_gif)) return B_NO_TRANSLATOR;
|
||||
if (!DetermineType(inSource, &is_gif))
|
||||
return B_NO_TRANSLATOR;
|
||||
if (!is_gif && inFormat != NULL && inFormat->type != B_TRANSLATOR_BITMAP)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
outInfo->group = B_TRANSLATOR_BITMAP;
|
||||
if (is_gif) {
|
||||
outInfo->type = GIF_TYPE;
|
||||
outInfo->quality = 0.8;
|
||||
outInfo->capability = 0.8;
|
||||
outInfo->quality = GIF_IN_QUALITY;
|
||||
outInfo->capability = GIF_IN_CAPABILITY;
|
||||
strlcpy(outInfo->name, B_TRANSLATE("GIF image"), sizeof(outInfo->name));
|
||||
strcpy(outInfo->MIME, "image/gif");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
outInfo->type = B_TRANSLATOR_BITMAP;
|
||||
outInfo->quality = 0.3;
|
||||
outInfo->capability = 0.3;
|
||||
outInfo->quality = BBM_IN_QUALITY;
|
||||
outInfo->capability = BBM_IN_CAPABILITY;
|
||||
strlcpy(outInfo->name, B_TRANSLATE("Be Bitmap Format (GIFTranslator)"),
|
||||
sizeof(outInfo->name));
|
||||
strcpy(outInfo->MIME, "image/x-be-bitmap");
|
||||
@@ -188,11 +198,11 @@ Identify(BPositionIO *inSource, const translation_format *inFormat,
|
||||
/* Main required function - assumes that an incoming GIF must be translated
|
||||
to a BBitmap, and vice versa - this could be improved */
|
||||
status_t
|
||||
Translate(BPositionIO *inSource, const translator_info *inInfo,
|
||||
BMessage *ioExtension, uint32 outType, BPositionIO *outDestination)
|
||||
GIFTranslator::DerivedTranslate(BPositionIO* inSource,
|
||||
const translator_info* inInfo, BMessage* ioExtension, uint32 outType,
|
||||
BPositionIO* outDestination, int32 baseType)
|
||||
{
|
||||
|
||||
const char *debug_text = getenv("GIF_TRANSLATOR_DEBUG");
|
||||
const char* debug_text = getenv("GIF_TRANSLATOR_DEBUG");
|
||||
if ((debug_text != NULL) && (atoi(debug_text) != 0)) debug = true;
|
||||
|
||||
if (outType == 0) outType = B_TRANSLATOR_BITMAP;
|
||||
@@ -212,7 +222,7 @@ Translate(BPositionIO *inSource, const translator_info *inInfo,
|
||||
err = GetBitmap(inSource, &bitmap);
|
||||
if (err != B_OK)
|
||||
return err;
|
||||
GIFSave *gs = new GIFSave(bitmap, outDestination);
|
||||
GIFSave* gs = new GIFSave(bitmap, outDestination, fSettings);
|
||||
if (gs->fatalerror) {
|
||||
delete gs;
|
||||
delete bitmap;
|
||||
@@ -237,20 +247,51 @@ Translate(BPositionIO *inSource, const translator_info *inInfo,
|
||||
}
|
||||
|
||||
|
||||
GIFTranslator::GIFTranslator()
|
||||
: BApplication("application/x-vnd.Haiku-GIFTranslator")
|
||||
BTranslator*
|
||||
make_nth_translator(int32 n, image_id you, uint32 flags, ...)
|
||||
{
|
||||
BRect rect(100, 100, 339, 339);
|
||||
gifwindow = new GIFWindow(rect, B_TRANSLATE("GIF Settings"));
|
||||
gifwindow->Show();
|
||||
if (n == 0)
|
||||
return new GIFTranslator();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
GIFTranslator::GIFTranslator()
|
||||
: BaseTranslator(B_TRANSLATE("GIF images"),
|
||||
B_TRANSLATE("GIF image translator"),
|
||||
GIF_TRANSLATOR_VERSION,
|
||||
sInputFormats, kNumInputFormats,
|
||||
sOutputFormats, kNumOutputFormats,
|
||||
"GIFTranslator_Settings",
|
||||
sDefaultSettings, kNumDefaultSettings,
|
||||
B_TRANSLATOR_BITMAP, B_GIF_FORMAT)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
GIFTranslator::~GIFTranslator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BView*
|
||||
GIFTranslator::NewConfigView(TranslatorSettings *settings)
|
||||
{
|
||||
return new GIFView(settings);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
GIFTranslator myapp;
|
||||
myapp.Run();
|
||||
return 0;
|
||||
BApplication app("application/x-vnd.Haiku-GIFTranslator");
|
||||
status_t result;
|
||||
result = LaunchTranslatorWindow(new GIFTranslator,
|
||||
B_TRANSLATE("GIF Settings"), kRectView);
|
||||
if (result == B_OK) {
|
||||
app.Run();
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,13 +16,48 @@
|
||||
#ifndef GIFTRANSLATOR_H
|
||||
#define GIFTRANSLATOR_H
|
||||
|
||||
#include <Application.h>
|
||||
class GIFWindow;
|
||||
#include "BaseTranslator.h"
|
||||
|
||||
class GIFTranslator : public BApplication {
|
||||
#define GIF_IN_QUALITY 0.8
|
||||
#define GIF_IN_CAPABILITY 0.8
|
||||
#define BBM_IN_QUALITY 0.3
|
||||
#define BBM_IN_CAPABILITY 0.3
|
||||
|
||||
#define GIF_OUT_QUALITY 0.8
|
||||
#define GIF_OUT_CAPABILITY 0.8
|
||||
#define BBM_OUT_QUALITY 0.3
|
||||
#define BBM_OUT_CAPABILITY 0.3
|
||||
|
||||
// settings
|
||||
|
||||
#define GIF_SETTING_INTERLACED "interlaced"
|
||||
#define GIF_SETTING_USE_TRANSPARENT "use transparent"
|
||||
#define GIF_SETTING_USE_TRANSPARENT_AUTO "use transparent auto"
|
||||
#define GIF_SETTING_USE_DITHERING "use dithering"
|
||||
#define GIF_SETTING_PALETTE_MODE "palette mode"
|
||||
#define GIF_SETTING_PALETTE_SIZE "palette size"
|
||||
#define GIF_SETTING_TRANSPARENT_RED "transparent red"
|
||||
#define GIF_SETTING_TRANSPARENT_GREEN "transparent green"
|
||||
#define GIF_SETTING_TRANSPARENT_BLUE "transparent blue"
|
||||
|
||||
|
||||
#define GIF_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(1,5,0)
|
||||
|
||||
class GIFTranslator : public BaseTranslator {
|
||||
public:
|
||||
GIFTranslator();
|
||||
GIFWindow *gifwindow;
|
||||
virtual status_t DerivedIdentify(BPositionIO* inSource,
|
||||
const translation_format* inFormat, BMessage* ioExtension,
|
||||
translator_info* outInfo, uint32 outType);
|
||||
|
||||
virtual status_t DerivedTranslate(BPositionIO* inSource,
|
||||
const translator_info* inInfo, BMessage* ioExtension,
|
||||
uint32 outType, BPositionIO* outDestination, int32 baseType);
|
||||
|
||||
virtual BView* NewConfigView(TranslatorSettings* settings);
|
||||
|
||||
protected:
|
||||
virtual ~GIFTranslator();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,10 +6,10 @@ resource app_signature "application/x-vnd.Haiku-GIFTranslator";
|
||||
|
||||
resource app_version {
|
||||
major = 1,
|
||||
middle = 4,
|
||||
middle = 5,
|
||||
minor = 0,
|
||||
variety = 0,
|
||||
internal = 0,
|
||||
short_info = "1.4.0",
|
||||
short_info = "1.5.0",
|
||||
long_info = "Haiku GIFTranslator Add-Ons."
|
||||
};
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
// Maxime Simon, <[email protected]>
|
||||
// Philippe Saint-Pierre, <[email protected]>
|
||||
|
||||
#include "GIFView.h"
|
||||
#include "GIFTranslator.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -24,31 +28,30 @@
|
||||
#include <LayoutBuilder.h>
|
||||
#include <String.h>
|
||||
|
||||
#include "Prefs.h"
|
||||
#include "SavePalette.h"
|
||||
|
||||
#include "GIFView.h"
|
||||
|
||||
#undef B_TRANSLATION_CONTEXT
|
||||
#define B_TRANSLATION_CONTEXT "GIFView"
|
||||
|
||||
|
||||
extern int32 translatorVersion;
|
||||
extern char translatorName[];
|
||||
|
||||
// constructor
|
||||
GIFView::GIFView(const char *name)
|
||||
: BView(name, B_WILL_DRAW)
|
||||
GIFView::GIFView(TranslatorSettings* settings)
|
||||
:
|
||||
BView("GIFView", B_WILL_DRAW),
|
||||
fSettings(settings)
|
||||
{
|
||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
|
||||
BStringView *title = new BStringView("Title", B_TRANSLATE("GIF image translator"));
|
||||
title->SetFont(be_bold_font);
|
||||
|
||||
char version_string[100];
|
||||
sprintf(version_string, "v%d.%d.%d %s", (int)(translatorVersion >> 8),
|
||||
(int)((translatorVersion >> 4) & 0xf), (int)(translatorVersion & 0xf),
|
||||
__DATE__);
|
||||
char version_string[100];
|
||||
snprintf(version_string, sizeof(version_string), B_TRANSLATE("v%d.%d.%d %s"),
|
||||
int(B_TRANSLATION_MAJOR_VERSION(GIF_TRANSLATOR_VERSION)),
|
||||
int(B_TRANSLATION_MINOR_VERSION(GIF_TRANSLATOR_VERSION)),
|
||||
int(B_TRANSLATION_REVISION_VERSION(GIF_TRANSLATOR_VERSION)),
|
||||
__DATE__);
|
||||
|
||||
BStringView *version = new BStringView("Version", version_string);
|
||||
|
||||
const char *copyrightString = "©2003 Daniel Switkin, [email protected]";
|
||||
@@ -74,7 +77,7 @@ GIFView::GIFView(const char *name)
|
||||
int32 count = 2;
|
||||
for (int32 i = 0; i < 8; i++) {
|
||||
BMessage* message = new BMessage(GV_SET_COLOR_COUNT);
|
||||
message->AddInt32("size in bits", i + 1);
|
||||
message->AddInt32(GIF_SETTING_PALETTE_SIZE, i + 1);
|
||||
BString label;
|
||||
label << count;
|
||||
fColorCountMI[i] = new BMenuItem(label.String(), message, 0, 0);
|
||||
@@ -105,9 +108,7 @@ GIFView::GIFView(const char *name)
|
||||
new BMessage(GV_USE_TRANSPARENT_COLOR));
|
||||
|
||||
fTransparentRedTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_RED));
|
||||
|
||||
fTransparentGreenTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_GREEN));
|
||||
|
||||
fTransparentBlueTC = new BTextControl("", "0", new BMessage(GV_TRANSPARENT_BLUE));
|
||||
|
||||
BTextView *tr = fTransparentRedTC->TextView();
|
||||
@@ -163,19 +164,17 @@ GIFView::GIFView(const char *name)
|
||||
|
||||
GIFView::~GIFView()
|
||||
{
|
||||
delete fPrefs;
|
||||
fSettings->Release();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
GIFView::RestorePrefs()
|
||||
{
|
||||
fPrefs = new Prefs();
|
||||
|
||||
fColorCountMF->SetEnabled(false);
|
||||
fUseDitheringCB->SetEnabled(true);
|
||||
|
||||
switch (fPrefs->palettemode) {
|
||||
switch (fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE)) {
|
||||
case WEB_SAFE_PALETTE:
|
||||
fWebSafeMI->SetMarked(true);
|
||||
break;
|
||||
@@ -191,35 +190,49 @@ GIFView::RestorePrefs()
|
||||
fColorCountMF->SetEnabled(true);
|
||||
break;
|
||||
default:
|
||||
fPrefs->palettemode = WEB_SAFE_PALETTE;
|
||||
int32 value = WEB_SAFE_PALETTE;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE, &value);
|
||||
fSettings->SaveSettings();
|
||||
fWebSafeMI->SetMarked(true);
|
||||
break;
|
||||
}
|
||||
|
||||
if (fColorCountMF->IsEnabled() &&
|
||||
fPrefs->palette_size_in_bits > 0 &&
|
||||
fPrefs->palette_size_in_bits <= 8) {
|
||||
if (fColorCountMF->IsEnabled()
|
||||
&& fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE) > 0
|
||||
&& fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE) <= 8) {
|
||||
// display the stored color count
|
||||
fColorCountMI[fPrefs->palette_size_in_bits - 1]->SetMarked(true);
|
||||
fColorCountMI[fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE) - 1]
|
||||
->SetMarked(true);
|
||||
} else {
|
||||
// display 256 colors
|
||||
fColorCount256MI->SetMarked(true);
|
||||
fPrefs->palette_size_in_bits = 8;
|
||||
int32 value = 8;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE, &value);
|
||||
fSettings->SaveSettings();
|
||||
}
|
||||
|
||||
fInterlacedCB->SetValue(fPrefs->interlaced);
|
||||
fInterlacedCB->SetValue(fSettings->SetGetBool(GIF_SETTING_INTERLACED));
|
||||
|
||||
if (fGreyScaleMI->IsMarked()) fUseDitheringCB->SetValue(false);
|
||||
else fUseDitheringCB->SetValue(fPrefs->usedithering);
|
||||
fUseTransparentCB->SetValue(fPrefs->usetransparent);
|
||||
fUseTransparentAutoRB->SetValue(fPrefs->usetransparentauto);
|
||||
fUseTransparentColorRB->SetValue(!fPrefs->usetransparentauto);
|
||||
if (fPrefs->usetransparent) {
|
||||
if (fGreyScaleMI->IsMarked())
|
||||
fUseDitheringCB->SetValue(false);
|
||||
else
|
||||
fUseDitheringCB->SetValue(
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_DITHERING));
|
||||
fUseTransparentCB->SetValue(
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT));
|
||||
fUseTransparentAutoRB->SetValue(
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO));
|
||||
fUseTransparentColorRB->SetValue(
|
||||
!fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO));
|
||||
if (fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT)) {
|
||||
fUseTransparentAutoRB->SetEnabled(true);
|
||||
fUseTransparentColorRB->SetEnabled(true);
|
||||
fTransparentRedTC->SetEnabled(!fPrefs->usetransparentauto);
|
||||
fTransparentGreenTC->SetEnabled(!fPrefs->usetransparentauto);
|
||||
fTransparentBlueTC->SetEnabled(!fPrefs->usetransparentauto);
|
||||
fTransparentRedTC->SetEnabled(
|
||||
!fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO));
|
||||
fTransparentGreenTC->SetEnabled(
|
||||
!fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO));
|
||||
fTransparentBlueTC->SetEnabled(
|
||||
!fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO));
|
||||
} else {
|
||||
fUseTransparentAutoRB->SetEnabled(false);
|
||||
fUseTransparentColorRB->SetEnabled(false);
|
||||
@@ -229,14 +242,18 @@ GIFView::RestorePrefs()
|
||||
}
|
||||
|
||||
char temp[4];
|
||||
sprintf(temp, "%d", fPrefs->transparentred);
|
||||
sprintf(temp, "%d",
|
||||
(int)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_RED));
|
||||
fTransparentRedTC->SetText(temp);
|
||||
sprintf(temp, "%d", fPrefs->transparentgreen);
|
||||
sprintf(temp, "%d",
|
||||
(int)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_GREEN));
|
||||
fTransparentGreenTC->SetText(temp);
|
||||
sprintf(temp, "%d", fPrefs->transparentblue);
|
||||
sprintf(temp, "%d",
|
||||
(int)fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_BLUE));
|
||||
fTransparentBlueTC->SetText(temp);
|
||||
}
|
||||
|
||||
|
||||
// AllAttached
|
||||
void
|
||||
GIFView::AllAttached()
|
||||
@@ -255,55 +272,80 @@ GIFView::AllAttached()
|
||||
fColorCountM->SetTargetForItems(msgr);
|
||||
}
|
||||
|
||||
|
||||
// MessageReceived
|
||||
void
|
||||
GIFView::MessageReceived(BMessage *message)
|
||||
{
|
||||
switch (message->what) {
|
||||
case GV_WEB_SAFE:
|
||||
fPrefs->palettemode = WEB_SAFE_PALETTE;
|
||||
{
|
||||
int32 value = WEB_SAFE_PALETTE;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE, &value);
|
||||
fUseDitheringCB->SetEnabled(true);
|
||||
fColorCountMF->SetEnabled(false);
|
||||
fColorCount256MI->SetMarked(true);
|
||||
break;
|
||||
}
|
||||
case GV_BEOS_SYSTEM:
|
||||
fPrefs->palettemode = BEOS_SYSTEM_PALETTE;
|
||||
{
|
||||
int32 value = BEOS_SYSTEM_PALETTE;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE, &value);
|
||||
fUseDitheringCB->SetEnabled(true);
|
||||
fColorCountMF->SetEnabled(false);
|
||||
fColorCount256MI->SetMarked(true);
|
||||
break;
|
||||
}
|
||||
case GV_GREYSCALE:
|
||||
fPrefs->palettemode = GREYSCALE_PALETTE;
|
||||
{
|
||||
int32 value = GREYSCALE_PALETTE;
|
||||
bool usedithering = false;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE, &value);
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_DITHERING, &usedithering);
|
||||
fUseDitheringCB->SetEnabled(false);
|
||||
fUseDitheringCB->SetValue(false);
|
||||
fColorCountMF->SetEnabled(false);
|
||||
fColorCount256MI->SetMarked(true);
|
||||
fPrefs->usedithering = false;
|
||||
break;
|
||||
}
|
||||
case GV_OPTIMAL:
|
||||
fPrefs->palettemode = OPTIMAL_PALETTE;
|
||||
{
|
||||
int32 value = OPTIMAL_PALETTE;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_MODE, &value);
|
||||
fUseDitheringCB->SetEnabled(true);
|
||||
fColorCountMF->SetEnabled(true);
|
||||
fColorCountMI[fPrefs->palette_size_in_bits - 1]->SetMarked(true);
|
||||
fColorCountMI[fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE) - 1]
|
||||
->SetMarked(true);
|
||||
break;
|
||||
}
|
||||
case GV_SET_COLOR_COUNT:
|
||||
if (fColorCountMF->IsEnabled()) {
|
||||
int32 sizeInBits;
|
||||
if (message->FindInt32("size in bits", &sizeInBits) >= B_OK) {
|
||||
if (message->FindInt32(GIF_SETTING_PALETTE_SIZE, &sizeInBits)
|
||||
>= B_OK) {
|
||||
if (sizeInBits > 0 && sizeInBits <= 8)
|
||||
fPrefs->palette_size_in_bits = sizeInBits;
|
||||
fSettings->SetGetInt32(GIF_SETTING_PALETTE_SIZE,
|
||||
&sizeInBits);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GV_INTERLACED:
|
||||
fPrefs->interlaced = fInterlacedCB->Value();
|
||||
{
|
||||
bool value = fInterlacedCB->Value();
|
||||
fSettings->SetGetBool(GIF_SETTING_INTERLACED, &value);
|
||||
break;
|
||||
}
|
||||
case GV_USE_DITHERING:
|
||||
fPrefs->usedithering = fUseDitheringCB->Value();
|
||||
{
|
||||
bool value = fUseDitheringCB->Value();
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_DITHERING, &value);
|
||||
break;
|
||||
}
|
||||
case GV_USE_TRANSPARENT:
|
||||
fPrefs->usetransparent = fUseTransparentCB->Value();
|
||||
if (fPrefs->usetransparent) {
|
||||
{
|
||||
bool value = fUseTransparentCB->Value();
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT, &value);
|
||||
if (value) {
|
||||
fUseTransparentAutoRB->SetEnabled(true);
|
||||
fUseTransparentColorRB->SetEnabled(true);
|
||||
fTransparentRedTC->SetEnabled(fUseTransparentColorRB->Value());
|
||||
@@ -317,34 +359,51 @@ GIFView::MessageReceived(BMessage *message)
|
||||
fTransparentBlueTC->SetEnabled(false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GV_USE_TRANSPARENT_AUTO:
|
||||
fPrefs->usetransparentauto = true;
|
||||
{
|
||||
bool value = true;
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO, &value);
|
||||
fTransparentRedTC->SetEnabled(false);
|
||||
fTransparentGreenTC->SetEnabled(false);
|
||||
fTransparentBlueTC->SetEnabled(false);
|
||||
break;
|
||||
}
|
||||
case GV_USE_TRANSPARENT_COLOR:
|
||||
fPrefs->usetransparentauto = false;
|
||||
{
|
||||
bool value = false;
|
||||
fSettings->SetGetBool(GIF_SETTING_USE_TRANSPARENT_AUTO, &value);
|
||||
fTransparentRedTC->SetEnabled(true);
|
||||
fTransparentGreenTC->SetEnabled(true);
|
||||
fTransparentBlueTC->SetEnabled(true);
|
||||
break;
|
||||
}
|
||||
case GV_TRANSPARENT_RED:
|
||||
fPrefs->transparentred = CheckInput(fTransparentRedTC);
|
||||
{
|
||||
int32 value = CheckInput(fTransparentRedTC);
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_RED, &value);
|
||||
break;
|
||||
}
|
||||
case GV_TRANSPARENT_GREEN:
|
||||
fPrefs->transparentgreen = CheckInput(fTransparentGreenTC);
|
||||
{
|
||||
int32 value = CheckInput(fTransparentGreenTC);
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_GREEN, &value);
|
||||
break;
|
||||
}
|
||||
case GV_TRANSPARENT_BLUE:
|
||||
fPrefs->transparentblue = CheckInput(fTransparentBlueTC);
|
||||
{
|
||||
int32 value = CheckInput(fTransparentBlueTC);
|
||||
fSettings->SetGetInt32(GIF_SETTING_TRANSPARENT_BLUE, &value);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BView::MessageReceived(message);
|
||||
break;
|
||||
}
|
||||
fPrefs->Save();
|
||||
fSettings->SaveSettings();
|
||||
}
|
||||
|
||||
|
||||
int GIFView::CheckInput(BTextControl *control) {
|
||||
int value = atoi(control->Text());
|
||||
if (value < 0 || value > 255) {
|
||||
|
||||
@@ -14,11 +14,13 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
// Philippe Saint-Pierre, 2013, <[email protected]>
|
||||
|
||||
#ifndef GIFVIEW_H
|
||||
#define GIFVIEW_H
|
||||
|
||||
#include <View.h>
|
||||
#include "TranslatorSettings.h"
|
||||
|
||||
class BMenuField;
|
||||
class BPopUpMenu;
|
||||
@@ -26,7 +28,6 @@ class BMenuItem;
|
||||
class BCheckBox;
|
||||
class BRadioButton;
|
||||
class BTextControl;
|
||||
class Prefs;
|
||||
|
||||
#define GV_WEB_SAFE 'gvws'
|
||||
#define GV_BEOS_SYSTEM 'gvbe'
|
||||
@@ -42,9 +43,12 @@ class Prefs;
|
||||
#define GV_TRANSPARENT_BLUE 'gvtb'
|
||||
#define GV_SET_COLOR_COUNT 'gvcc'
|
||||
|
||||
|
||||
const BRect kRectView(110, 110, 339, 339);
|
||||
|
||||
class GIFView : public BView {
|
||||
public:
|
||||
GIFView(const char* name);
|
||||
GIFView(TranslatorSettings* settings);
|
||||
virtual ~GIFView();
|
||||
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
@@ -54,7 +58,7 @@ class GIFView : public BView {
|
||||
void RestorePrefs();
|
||||
int CheckInput(BTextControl* control);
|
||||
|
||||
Prefs* fPrefs;
|
||||
TranslatorSettings* fSettings;
|
||||
|
||||
BMenuField* fPaletteMF;
|
||||
BPopUpMenu* fPaletteM;
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// File: GIFWindow.cpp
|
||||
//
|
||||
// Date: December 1999
|
||||
//
|
||||
// Author: Daniel Switkin
|
||||
//
|
||||
// Copyright 2003 (c) by Daniel Switkin. This file is made publically available
|
||||
// under the BSD license, with the stipulations that this complete header must
|
||||
// remain at the top of the file indefinitely, and credit must be given to the
|
||||
// original author in any about box using this software.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "GIFWindow.h"
|
||||
#include "GIFView.h"
|
||||
#include <Application.h>
|
||||
#include <LayoutBuilder.h>
|
||||
|
||||
GIFWindow::GIFWindow(BRect rect, const char *name) :
|
||||
BWindow(rect, name, B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE
|
||||
| B_AUTO_UPDATE_SIZE_LIMITS, B_CURRENT_WORKSPACE) {
|
||||
|
||||
gifview = new GIFView("GIFView");
|
||||
BLayoutBuilder::Group<>(this, B_HORIZONTAL)
|
||||
.Add(gifview);
|
||||
}
|
||||
|
||||
bool GIFWindow::QuitRequested() {
|
||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// File: GIFWindow.h
|
||||
//
|
||||
// Date: December 1999
|
||||
//
|
||||
// Author: Daniel Switkin
|
||||
//
|
||||
// Copyright 2003 (c) by Daniel Switkin. This file is made publically available
|
||||
// under the BSD license, with the stipulations that this complete header must
|
||||
// remain at the top of the file indefinitely, and credit must be given to the
|
||||
// original author in any about box using this software.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef GIFWINDOW_H
|
||||
#define GIFWINDOW_H
|
||||
|
||||
#include <Window.h>
|
||||
class GIFView;
|
||||
|
||||
class GIFWindow : public BWindow {
|
||||
public:
|
||||
GIFWindow(BRect rect, const char *name);
|
||||
bool QuitRequested();
|
||||
GIFView *gifview;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,14 +2,14 @@ SubDir HAIKU_TOP src add-ons translators gif ;
|
||||
|
||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||
|
||||
SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) shared ] ;
|
||||
|
||||
AddResources GIFTranslator : GIFTranslator.rdef ;
|
||||
|
||||
Translator GIFTranslator :
|
||||
# Main Source
|
||||
GIFTranslator.cpp
|
||||
GIFView.cpp
|
||||
GIFWindow.cpp
|
||||
Prefs.cpp
|
||||
|
||||
# Real Work
|
||||
GIFLoad.cpp
|
||||
@@ -19,6 +19,7 @@ Translator GIFTranslator :
|
||||
SFHash.cpp
|
||||
:
|
||||
be translation $(TARGET_LIBSUPC++) localestub
|
||||
libtranslatorsutils.a
|
||||
: true
|
||||
;
|
||||
|
||||
|
||||
@@ -1,149 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// File: Prefs.cpp
|
||||
//
|
||||
// Date: December 1999
|
||||
//
|
||||
// Author: Daniel Switkin
|
||||
//
|
||||
// Copyright 2003 (c) by Daniel Switkin. This file is made publically available
|
||||
// under the BSD license, with the stipulations that this complete header must
|
||||
// remain at the top of the file indefinitely, and credit must be given to the
|
||||
// original author in any about box using this software.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
|
||||
#include "Prefs.h"
|
||||
#include <File.h>
|
||||
#include <Path.h>
|
||||
#include <FindDirectory.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern bool debug;
|
||||
|
||||
// constructor
|
||||
Prefs::Prefs()
|
||||
: interlaced(false),
|
||||
usetransparent(false),
|
||||
usetransparentauto(false),
|
||||
usedithering(false),
|
||||
transparentred(0),
|
||||
transparentgreen(0),
|
||||
transparentblue(0),
|
||||
palettemode(0),
|
||||
palette_size_in_bits(8),
|
||||
file(NULL)
|
||||
{
|
||||
BPath path;
|
||||
find_directory(B_USER_SETTINGS_DIRECTORY, &path);
|
||||
path.Append("GIFTranslator_settings");
|
||||
file = new BFile(path.Path(), B_READ_WRITE | B_CREATE_FILE);
|
||||
|
||||
if (file->InitCheck() != B_OK) {
|
||||
if (debug) printf("Bad filename for attributes\n");
|
||||
return;
|
||||
}
|
||||
|
||||
bool db = false;
|
||||
if (!GetBool("interlaced", &interlaced, &db)) return;
|
||||
db = false;
|
||||
if (!GetBool("usetransparent", &usetransparent, &db)) return;
|
||||
db = false;
|
||||
if (!GetBool("usetransparentauto", &usetransparentauto, &db)) return;
|
||||
db = true;
|
||||
if (!GetBool("usedithering", &usedithering, &db)) return;
|
||||
int di = 0;
|
||||
if (!GetInt("palettemode", &palettemode, &di)) return;
|
||||
di = 8;
|
||||
if (!GetInt("palettesize", &palette_size_in_bits, &di)) return;
|
||||
di = 0;
|
||||
if (!GetInt("transparentred", &transparentred, &di)) return;
|
||||
di = 0;
|
||||
if (!GetInt("transparentgreen", &transparentgreen, &di)) return;
|
||||
di = 0;
|
||||
if (!GetInt("transparentblue", &transparentblue, &di)) return;
|
||||
}
|
||||
|
||||
// destructor
|
||||
Prefs::~Prefs()
|
||||
{
|
||||
delete file;
|
||||
}
|
||||
|
||||
// GetInt
|
||||
bool
|
||||
Prefs::GetInt(const char *name, int *value, int *defaultvalue)
|
||||
{
|
||||
status_t err = file->ReadAttr(name, B_INT32_TYPE, 0, value, 4);
|
||||
if (err == B_ENTRY_NOT_FOUND) {
|
||||
*value = *defaultvalue;
|
||||
if (file->WriteAttr(name, B_INT32_TYPE, 0, defaultvalue, 4) < 0) {
|
||||
if (debug) printf("WriteAttr on %s died\n", name);
|
||||
return false;
|
||||
}
|
||||
} else if (err < 0) {
|
||||
if (debug) printf("Unknown error reading %s\n", name);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// GetBool
|
||||
bool
|
||||
Prefs::GetBool(const char *name, bool *value, bool *defaultvalue)
|
||||
{
|
||||
status_t err = file->ReadAttr(name, B_BOOL_TYPE, 0, value, 1);
|
||||
if (err == B_ENTRY_NOT_FOUND) {
|
||||
*value = *defaultvalue;
|
||||
if (file->WriteAttr(name, B_BOOL_TYPE, 0, defaultvalue, 1) < 0) {
|
||||
if (debug) printf("WriteAttr on %s died\n", name);
|
||||
return false;
|
||||
}
|
||||
} else if (err < 0) {
|
||||
if (debug) printf("Unknown error reading %s\n", name);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// PutInt
|
||||
bool
|
||||
Prefs::PutInt(const char *name, int *value)
|
||||
{
|
||||
status_t err = file->WriteAttr(name, B_INT32_TYPE, 0, value, 4);
|
||||
if (err < 0) {
|
||||
if (debug) printf("WriteAttr on %s died\n", name);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// PutBool
|
||||
bool
|
||||
Prefs::PutBool(const char *name, bool *value)
|
||||
{
|
||||
status_t err = file->WriteAttr(name, B_BOOL_TYPE, 0, value, 1);
|
||||
if (err < 0) {
|
||||
if (debug) printf("WriteAttr on %s died\n", name);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Save
|
||||
void
|
||||
Prefs::Save()
|
||||
{
|
||||
if (!PutBool("interlaced", &interlaced)) return;
|
||||
if (!PutBool("usetransparent", &usetransparent)) return;
|
||||
if (!PutBool("usetransparentauto", &usetransparentauto)) return;
|
||||
if (!PutBool("usedithering", &usedithering)) return;
|
||||
if (!PutInt("palettemode", &palettemode)) return;
|
||||
if (!PutInt("palettesize", &palette_size_in_bits)) return;
|
||||
if (!PutInt("transparentred", &transparentred)) return;
|
||||
if (!PutInt("transparentgreen", &transparentgreen)) return;
|
||||
if (!PutInt("transparentblue", &transparentblue)) return;
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// File: Prefs.h
|
||||
//
|
||||
// Date: December 1999
|
||||
//
|
||||
// Author: Daniel Switkin
|
||||
//
|
||||
// Copyright 2003 (c) by Daniel Switkin. This file is made publically available
|
||||
// under the BSD license, with the stipulations that this complete header must
|
||||
// remain at the top of the file indefinitely, and credit must be given to the
|
||||
// original author in any about box using this software.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Additional authors: Stephan Aßmus, <[email protected]>
|
||||
|
||||
#ifndef PREFS_H
|
||||
#define PREFS_H
|
||||
|
||||
class BNode;
|
||||
|
||||
class Prefs {
|
||||
public:
|
||||
Prefs();
|
||||
void Save();
|
||||
~Prefs();
|
||||
bool interlaced, usetransparent, usetransparentauto,
|
||||
usedithering;
|
||||
int transparentred, transparentgreen,
|
||||
transparentblue, palettemode, palette_size_in_bits;
|
||||
private:
|
||||
bool GetInt(const char *name, int *value, int *defaultvalue);
|
||||
bool GetBool(const char *name, bool *value, bool *defaultvalue);
|
||||
bool PutInt(const char *name, int *value);
|
||||
bool PutBool(const char *name, bool *value);
|
||||
|
||||
BNode *file;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user