PPM translator: clang-format

Change-Id: I290f9b369af37d919308759b83c42122f7f309bc
Reviewed-on: https://review.haiku-os.org/c/902
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Adrien Destugues
2019-01-26 20:46:59 +00:00
committed by waddlesplash
parent 4bf8cf7a1b
commit 72c5a125f1
4 changed files with 1013 additions and 1011 deletions
+11 -9
View File
@@ -22,12 +22,11 @@
BPoint get_window_origin();
void set_window_origin(BPoint pt);
class PPMWindow :
public BWindow
class PPMWindow : public BWindow
{
public:
PPMWindow(BRect area) :
BWindow(area, B_TRANSLATE("PPM Settings"), B_TITLED_WINDOW,
PPMWindow(BRect area)
: BWindow(area, B_TRANSLATE("PPM Settings"), B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS)
{
BLayoutBuilder::Group<>(this, B_HORIZONTAL);
@@ -70,10 +69,14 @@ main()
o.x -= r.Width() / 2;
o.y -= r.Height() / 2;
/* clamp location to screen */
if (o.x < f.left) o.x = f.left;
if (o.y < f.top) o.y = f.top;
if (o.x > f.right) o.x = f.right;
if (o.y > f.bottom) o.y = f.bottom;
if (o.x < f.left)
o.x = f.left;
if (o.y < f.top)
o.y = f.top;
if (o.x > f.right)
o.x = f.right;
if (o.y > f.bottom)
o.y = f.bottom;
}
}
w->MoveTo(o);
@@ -81,4 +84,3 @@ main()
app.Run();
return 0;
}
+208 -222
View File
@@ -22,13 +22,13 @@
#include <PopUpMenu.h>
#include <Screen.h>
#include <StringView.h>
#include <TranslatorAddOn.h>
#include <TranslationKit.h>
#include <TranslatorAddOn.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include "colorspace.h"
@@ -43,11 +43,19 @@
#endif
#if !defined(_PR3_COMPATIBLE_) /* R4 headers? Else we need to define these constants. */
#define B_CMY24 ((color_space)0xC001) /* C[7:0] M[7:0] Y[7:0] No gray removal done */
#define B_CMY32 ((color_space)0xC002) /* C[7:0] M[7:0] Y[7:0] X[7:0] No gray removal done */
#define B_CMYA32 ((color_space)0xE002) /* C[7:0] M[7:0] Y[7:0] A[7:0] No gray removal done */
#define B_CMYK32 ((color_space)0xC003) /* C[7:0] M[7:0] Y[7:0] K[7:0] */
#if !defined(_PR3_COMPATIBLE_) /* R4 headers? Else we need to define these \
constants. */
#define B_CMY24 \
((color_space) 0xC001) /* C[7:0] M[7:0] Y[7:0] No gray removal \
done */
#define B_CMY32 \
((color_space) 0xC002) /* C[7:0] M[7:0] Y[7:0] X[7:0] No gray removal \
done */
#define B_CMYA32 \
((color_space) 0xE002) /* C[7:0] M[7:0] Y[7:0] A[7:0] No gray removal \
done */
#define B_CMYK32 \
((color_space) 0xC003) /* C[7:0] M[7:0] Y[7:0] K[7:0] */
#endif
#define PPM_TRANSLATOR_VERSION 0x100
@@ -66,18 +74,23 @@ int32 translatorVersion = PPM_TRANSLATOR_VERSION;
#define PPM_TYPE 'PPM '
/* These two data arrays are a really good idea to export from Translators, but not required. */
translation_format inputFormats[] = {
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.4, 0.8, "image/x-be-bitmap", "Be Bitmap Format (PPMTranslator)" },
{ PPM_TYPE, B_TRANSLATOR_BITMAP, 0.3, 0.8, "image/x-portable-pixmap", "PPM image" },
{ 0, 0, 0, 0, "\0", "\0" }
}; /* optional (else Identify is always called) */
/* These two data arrays are a really good idea to export from Translators, but
* not required. */
translation_format inputFormats[]
= {{B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.4, 0.8, "image/x-be-bitmap",
"Be Bitmap Format (PPMTranslator)"},
{PPM_TYPE, B_TRANSLATOR_BITMAP, 0.3, 0.8, "image/x-portable-pixmap",
"PPM image"},
{0, 0, 0, 0, "\0",
"\0"}}; /* optional (else Identify is always called) */
translation_format outputFormats[] = {
{ B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.4, 0.8, "image/x-be-bitmap", "Be Bitmap Format (PPMTranslator)" },
{ PPM_TYPE, B_TRANSLATOR_BITMAP, 0.3, 0.8, "image/x-portable-pixmap", "PPM image" },
{ 0, 0, 0, 0, "\0", "\0" }
}; /* optional (else Translate is called anyway) */
translation_format outputFormats[]
= {{B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP, 0.4, 0.8, "image/x-be-bitmap",
"Be Bitmap Format (PPMTranslator)"},
{PPM_TYPE, B_TRANSLATOR_BITMAP, 0.3, 0.8, "image/x-portable-pixmap",
"PPM image"},
{0, 0, 0, 0, "\0",
"\0"}}; /* optional (else Translate is called anyway) */
/* Translators that don't export outputFormats */
/* will not be considered by files looking for */
@@ -96,7 +109,8 @@ static ppm_settings g_settings;
BPoint get_window_origin();
void set_window_origin(BPoint pos);
BPoint get_window_origin()
BPoint
get_window_origin()
{
BPoint ret;
g_settings_lock.Lock();
@@ -105,7 +119,8 @@ BPoint get_window_origin()
return ret;
}
void set_window_origin(BPoint pos)
void
set_window_origin(BPoint pos)
{
g_settings_lock.Lock();
g_settings.window_pos = pos;
@@ -114,10 +129,10 @@ void set_window_origin(BPoint pos)
}
class PrefsLoader {
class PrefsLoader
{
public:
PrefsLoader(
const char * str)
PrefsLoader(const char* str)
{
dprintf(("PPMTranslator: PrefsLoader()\n"));
/* defaults */
@@ -151,50 +166,53 @@ public:
continue;
}
if (sscanf(ptr, "%31[a-zA-Z_0-9] =", name) != 1) {
syslog(LOG_ERR, "unknown PPMTranslator "
"settings line: %s", line);
}
else {
syslog(LOG_ERR,
"unknown PPMTranslator "
"settings line: %s",
line);
} else {
if (!strcmp(name, "color_space")) {
while (*ptr != '=') {
ptr++;
}
ptr++;
if (sscanf(ptr, "%d",
(int*)&g_settings.out_space) != 1) {
syslog(LOG_ERR, "illegal color space "
"in PPMTranslator settings: %s", ptr);
if (sscanf(ptr, "%d", (int*) &g_settings.out_space)
!= 1) {
syslog(LOG_ERR,
"illegal color space "
"in PPMTranslator settings: %s",
ptr);
}
}
else if (!strcmp(name, "window_pos")) {
} else if (!strcmp(name, "window_pos")) {
while (*ptr != '=') {
ptr++;
}
ptr++;
if (sscanf(ptr, "%f,%f",
&g_settings.window_pos.x,
&g_settings.window_pos.y) != 2) {
syslog(LOG_ERR, "illegal window position "
"in PPMTranslator settings: %s", ptr);
if (sscanf(ptr, "%f,%f", &g_settings.window_pos.x,
&g_settings.window_pos.y)
!= 2) {
syslog(LOG_ERR,
"illegal window position "
"in PPMTranslator settings: %s",
ptr);
}
}
else if (!strcmp(name, "write_ascii")) {
} else if (!strcmp(name, "write_ascii")) {
while (*ptr != '=') {
ptr++;
}
ptr++;
int ascii = g_settings.write_ascii;
if (sscanf(ptr, "%d", &ascii) != 1) {
syslog(LOG_ERR, "illegal write_ascii value "
"in PPMTranslator settings: %s", ptr);
}
else {
syslog(LOG_ERR,
"illegal write_ascii value "
"in PPMTranslator settings: %s",
ptr);
} else {
g_settings.write_ascii = ascii;
}
}
else {
syslog(LOG_ERR,
"unknown PPMTranslator setting: %s", line);
} else {
syslog(
LOG_ERR, "unknown PPMTranslator setting: %s", line);
}
}
}
@@ -219,7 +237,8 @@ public:
fprintf(f, "color_space = %d\n", g_settings.out_space);
fprintf(f, "window_pos = %g,%g\n", g_settings.window_pos.x,
g_settings.window_pos.y);
fprintf(f, "write_ascii = %d\n", g_settings.write_ascii ? 1 : 0);
fprintf(
f, "write_ascii = %d\n", g_settings.write_ascii ? 1 : 0);
fclose(f);
}
}
@@ -247,8 +266,7 @@ Identify( /* required */
BPositionIO* inSource,
const translation_format* inFormat, /* can beNULL */
BMessage* ioExtension, /* can be NULL */
translator_info * outInfo,
uint32 outType)
translator_info* outInfo, uint32 outType)
{
dprintf(("PPMTranslator: Identify()\n"));
/* Silence compiler warnings. */
@@ -267,26 +285,30 @@ Identify( /* required */
int width, rowbytes, height, max;
bool ascii, is_ppm;
color_space space;
status_t err = read_ppm_header(inSource, &width, &rowbytes, &height, &max, &ascii, &space, &is_ppm, NULL);
status_t err = read_ppm_header(inSource, &width, &rowbytes, &height, &max,
&ascii, &space, &is_ppm, NULL);
if (err != B_OK) {
return err;
}
/* Stuff info into info struct -- Translation Kit will do "translator" for us. */
/* Stuff info into info struct -- Translation Kit will do "translator" for
* us. */
outInfo->group = B_TRANSLATOR_BITMAP;
if (is_ppm) {
outInfo->type = PPM_TYPE;
outInfo->quality = 0.3; /* no alpha, etc */
outInfo->capability = 0.8; /* we're pretty good at PPM reading, though */
outInfo->capability
= 0.8; /* we're pretty good at PPM reading, though */
strlcpy(outInfo->name, B_TRANSLATE("PPM image"), sizeof(outInfo->name));
strcpy(outInfo->MIME, "image/x-portable-pixmap");
}
else {
} else {
outInfo->type = B_TRANSLATOR_BITMAP;
outInfo->quality = 0.4; /* B_TRANSLATOR_BITMAP can do alpha, at least */
outInfo->capability = 0.8; /* and we might not know many variations thereof */
outInfo->capability
= 0.8; /* and we might not know many variations thereof */
strlcpy(outInfo->name, B_TRANSLATE("Be Bitmap Format (PPMTranslator)"),
sizeof(outInfo->name));
strcpy(outInfo->MIME, "image/x-be-bitmap"); /* this is the MIME type of B_TRANSLATOR_BITMAP */
strcpy(outInfo->MIME, "image/x-be-bitmap"); /* this is the MIME type of
B_TRANSLATOR_BITMAP */
}
return B_OK;
}
@@ -300,8 +322,7 @@ Translate( /* required */
BPositionIO* inSource,
const translator_info* /* inInfo*/, /* silence compiler warning */
BMessage* ioExtension, /* can be NULL */
uint32 outType,
BPositionIO * outDestination)
uint32 outType, BPositionIO* outDestination)
{
dprintf(("PPMTranslator: Translate()\n"));
inSource->Seek(0, SEEK_SET); /* paranoia */
@@ -310,7 +331,8 @@ Translate( /* required */
if (!outType) {
outType = B_TRANSLATOR_BITMAP;
}
dprintf(("PPMTranslator: outType is '%c%c%c%c'\n", char(outType>>24), char(outType>>16), char(outType>>8), char(outType)));
dprintf(("PPMTranslator: outType is '%c%c%c%c'\n", char(outType >> 24),
char(outType >> 16), char(outType >> 8), char(outType)));
if (outType != B_TRANSLATOR_BITMAP && outType != PPM_TYPE) {
return B_NO_TRANSLATOR;
}
@@ -322,7 +344,8 @@ Translate( /* required */
/* Read_ppm_header() will always return with stream at beginning of data */
/* for both B_TRANSLATOR_BITMAP and PPM_TYPE, and indicate what it is. */
char* comment = NULL;
status_t err = read_ppm_header(inSource, &width, &rowbytes, &height, &max, &ascii, &space, &is_ppm, &comment);
status_t err = read_ppm_header(inSource, &width, &rowbytes, &height, &max,
&ascii, &space, &is_ppm, &comment);
if (comment != NULL) {
if (ioExtension != NULL) {
#if defined(_PR3_COMPATIBLE_) /* R4 headers? */
@@ -354,16 +377,21 @@ Translate( /* required */
if (outType == PPM_TYPE) {
out_space = B_RGB24_BIG;
out_rowbytes = 3 * width;
}
else { /* When outputting to B_TRANSLATOR_BITMAP, follow user's wishes. */
} else { /* When outputting to B_TRANSLATOR_BITMAP, follow user's wishes.
*/
#if defined(_PR3_COMPATIBLE_) /* R4 headers? */
if (!ioExtension || ioExtension->FindInt32(B_TRANSLATOR_EXT_BITMAP_COLOR_SPACE, (int32*)&out_space) ||
if (!ioExtension
|| ioExtension->FindInt32(
B_TRANSLATOR_EXT_BITMAP_COLOR_SPACE, (int32*) &out_space)
||
#else
if (!ioExtension || ioExtension->FindInt32("bits/space", (int32*)&out_space) ||
if (!ioExtension
|| ioExtension->FindInt32("bits/space", (int32*) &out_space) ||
#endif
(out_space == B_NO_COLOR_SPACE)) {
if (g_settings.out_space == B_NO_COLOR_SPACE) {
switch (space) { /* The 24-bit versions are pretty silly, use 32 instead. */
switch (space) { /* The 24-bit versions are pretty silly, use 32
instead. */
case B_RGB24:
case B_RGB24_BIG:
out_space = B_RGB32;
@@ -373,8 +401,7 @@ Translate( /* required */
out_space = space;
break;
}
}
else {
} else {
out_space = g_settings.out_space;
}
}
@@ -391,13 +418,16 @@ Translate( /* required */
else
magic = "P6\n";
err = outDestination->Write(magic, strlen(magic));
if (err == (long)strlen(magic)) err = 0;
if (err == (long) strlen(magic))
err = 0;
// comment = NULL;
const char* fsComment;
#if defined(_PR3_COMPATIBLE_) /* R4 headers? */
if ((ioExtension != NULL) && !ioExtension->FindString(B_TRANSLATOR_EXT_COMMENT, &fsComment)) {
if ((ioExtension != NULL)
&& !ioExtension->FindString(B_TRANSLATOR_EXT_COMMENT, &fsComment)) {
#else
if ((ioExtension != NULL) && !ioExtension->FindString("/comment", &fsComment)) {
if ((ioExtension != NULL)
&& !ioExtension->FindString("/comment", &fsComment)) {
#endif
err = write_comment(fsComment, outDestination);
}
@@ -405,11 +435,11 @@ Translate( /* required */
char data[40];
sprintf(data, "%d %d %d\n", width, height, max);
err = outDestination->Write(data, strlen(data));
if (err == (long)strlen(data)) err = 0;
if (err == (long) strlen(data))
err = 0;
}
/* header done */
}
else {
} else {
dprintf(("PPMTranslator: write B_TRANSLATOR_BITMAP\n"));
/* B_TRANSLATOR_BITMAP header */
TranslatorBitmap hdr;
@@ -421,94 +451,102 @@ Translate( /* required */
hdr.rowBytes = B_HOST_TO_BENDIAN_INT32(out_rowbytes);
hdr.colors = (color_space) B_HOST_TO_BENDIAN_INT32(out_space);
hdr.dataSize = B_HOST_TO_BENDIAN_INT32(out_rowbytes * height);
dprintf(("rowBytes is %d, width %d, out_space %x, space %x\n", out_rowbytes, width, out_space, space));
dprintf(("rowBytes is %d, width %d, out_space %x, space %x\n",
out_rowbytes, width, out_space, space));
err = outDestination->Write(&hdr, sizeof(hdr));
dprintf(("PPMTranslator: Write() returns %" B_PRIx32 "\n", err));
#if DEBUG
{
BBitmap * map = new BBitmap(BRect(0,0,width-1,height-1), out_space);
BBitmap* map
= new BBitmap(BRect(0, 0, width - 1, height - 1), out_space);
printf("map rb = %" B_PRId32 "\n", map->BytesPerRow());
delete map;
}
#endif
if (err == sizeof(hdr)) err = 0;
if (err == sizeof(hdr))
err = 0;
/* header done */
}
if (err != B_OK) {
return err > 0 ? B_IO_ERROR : err;
}
/* Write data. Luckily, PPM and B_TRANSLATOR_BITMAP both scan from left to right, top to bottom. */
return copy_data(inSource, outDestination, rowbytes, out_rowbytes, height, max, ascii, out_ascii, space, out_space);
/* Write data. Luckily, PPM and B_TRANSLATOR_BITMAP both scan from left to
* right, top to bottom. */
return copy_data(inSource, outDestination, rowbytes, out_rowbytes, height,
max, ascii, out_ascii, space, out_space);
}
class PPMView :
public BView
class PPMView : public BView
{
public:
PPMView(
const char * name,
uint32 flags) :
BView(name, flags)
PPMView(const char* name, uint32 flags) : BView(name, flags)
{
SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
fTitle = new BStringView("title",
B_TRANSLATE("PPM image translator"));
fTitle = new BStringView("title", B_TRANSLATE("PPM image translator"));
fTitle->SetFont(be_bold_font);
char detail[100];
int ver = static_cast<int>(translatorVersion);
sprintf(detail, B_TRANSLATE("Version %d.%d.%d, %s"), ver >> 8,
((ver >> 4) & 0xf),
(ver & 0xf), __DATE__);
((ver >> 4) & 0xf), (ver & 0xf), __DATE__);
fDetail = new BStringView("detail", detail);
fBasedOn = new BStringView("basedOn",
B_TRANSLATE("Based on PPMTranslator sample code"));
fBasedOn = new BStringView(
"basedOn", B_TRANSLATE("Based on PPMTranslator sample code"));
fCopyright = new BStringView("copyright",
B_TRANSLATE("Sample code copyright 1999, Be Incorporated"));
fMenu = new BPopUpMenu("Color Space");
fMenu->AddItem(new BMenuItem(B_TRANSLATE("None"),
CSMessage(B_NO_COLOR_SPACE)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 8:8:8 32 bits"),
CSMessage(B_RGB32)));
fMenu->AddItem(
new BMenuItem(B_TRANSLATE("None"), CSMessage(B_NO_COLOR_SPACE)));
fMenu->AddItem(new BMenuItem(
B_TRANSLATE("RGB 8:8:8 32 bits"), CSMessage(B_RGB32)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGBA 8:8:8:8 32 "
"bits"), CSMessage(B_RGBA32)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 5:5:5 16 bits"),
CSMessage(B_RGB15)));
"bits"),
CSMessage(B_RGBA32)));
fMenu->AddItem(new BMenuItem(
B_TRANSLATE("RGB 5:5:5 16 bits"), CSMessage(B_RGB15)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGBA 5:5:5:1 16 "
"bits"), CSMessage(B_RGBA15)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 5:6:5 16 bits"),
CSMessage(B_RGB16)));
"bits"),
CSMessage(B_RGBA15)));
fMenu->AddItem(new BMenuItem(
B_TRANSLATE("RGB 5:6:5 16 bits"), CSMessage(B_RGB16)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("System palette 8 "
"bits"), CSMessage(B_CMAP8)));
"bits"),
CSMessage(B_CMAP8)));
fMenu->AddSeparatorItem();
fMenu->AddItem(new BMenuItem(B_TRANSLATE("Grayscale 8 bits"),
CSMessage(B_GRAY8)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("Bitmap 1 bit"),
CSMessage(B_GRAY1)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("CMY 8:8:8 32 bits"),
CSMessage(B_CMY32)));
fMenu->AddItem(
new BMenuItem(B_TRANSLATE("Grayscale 8 bits"), CSMessage(B_GRAY8)));
fMenu->AddItem(
new BMenuItem(B_TRANSLATE("Bitmap 1 bit"), CSMessage(B_GRAY1)));
fMenu->AddItem(new BMenuItem(
B_TRANSLATE("CMY 8:8:8 32 bits"), CSMessage(B_CMY32)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("CMYA 8:8:8:8 32 "
"bits"), CSMessage(B_CMYA32)));
"bits"),
CSMessage(B_CMYA32)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("CMYK 8:8:8:8 32 "
"bits"), CSMessage(B_CMYK32)));
"bits"),
CSMessage(B_CMYK32)));
fMenu->AddSeparatorItem();
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 8:8:8 32 bits "
"big-endian"), CSMessage(B_RGB32_BIG)));
"big-endian"),
CSMessage(B_RGB32_BIG)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGBA 8:8:8:8 32 "
"bits big-endian"), CSMessage(B_RGBA32_BIG)));
"bits big-endian"),
CSMessage(B_RGBA32_BIG)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 5:5:5 16 bits "
"big-endian"), CSMessage(B_RGB15_BIG)));
"big-endian"),
CSMessage(B_RGB15_BIG)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGBA 5:5:5:1 16 "
"bits big-endian"), CSMessage(B_RGBA15_BIG)));
"bits big-endian"),
CSMessage(B_RGBA15_BIG)));
fMenu->AddItem(new BMenuItem(B_TRANSLATE("RGB 5:6:5 16 bits "
"big-endian"), CSMessage(B_RGB16)));
fField = new BMenuField(B_TRANSLATE("Input color space:"),
fMenu);
"big-endian"),
CSMessage(B_RGB16)));
fField = new BMenuField(B_TRANSLATE("Input color space:"), fMenu);
fField->SetViewColor(ViewColor());
SelectColorSpace(g_settings.out_space);
BMessage* msg = new BMessage(CHANGE_ASCII);
@@ -534,31 +572,22 @@ public:
BFont font;
GetFont(&font);
SetExplicitPreferredSize(BSize((font.Size() * 350)/12,
(font.Size() * 200)/12));
}
~PPMView()
{
/* nothing here */
SetExplicitPreferredSize(
BSize((font.Size() * 350) / 12, (font.Size() * 200) / 12));
}
~PPMView() { /* nothing here */ }
enum {
SET_COLOR_SPACE = 'ppm=',
CHANGE_ASCII
};
enum { SET_COLOR_SPACE = 'ppm=', CHANGE_ASCII };
virtual void MessageReceived(
BMessage * message)
virtual void MessageReceived(BMessage* message)
{
if (message->what == SET_COLOR_SPACE) {
SetSettings(message);
}
else if (message->what == CHANGE_ASCII) {
} else if (message->what == CHANGE_ASCII) {
BMessage msg;
msg.AddBool("ppm /ascii", fAscii->Value());
SetSettings(&msg);
}
else {
} else {
BView::MessageReceived(message);
}
}
@@ -576,8 +605,7 @@ virtual void AllAttached()
fAscii->SetTarget(msgr);
}
void SetSettings(
BMessage * message)
void SetSettings(BMessage* message)
{
g_settings_lock.Lock();
color_space space;
@@ -603,16 +631,14 @@ private:
BMenuField* fField;
BCheckBox* fAscii;
BMessage * CSMessage(
color_space space)
BMessage* CSMessage(color_space space)
{
BMessage* ret = new BMessage(SET_COLOR_SPACE);
ret->AddInt32("space", space);
return ret;
}
void SelectColorSpace(
color_space space)
void SelectColorSpace(color_space space)
{
for (int ix = 0; ix < fMenu->CountItems(); ix++) {
int32 s;
@@ -641,13 +667,13 @@ private:
status_t
MakeConfig(/* optional */
BMessage* ioExtension, /* can be NULL */
BView * * outView,
BRect * outExtent)
BView** outView, BRect* outExtent)
{
PPMView * v = new PPMView(B_TRANSLATE("PPMTranslator Settings"),
B_WILL_DRAW);
PPMView* v
= new PPMView(B_TRANSLATE("PPMTranslator Settings"), B_WILL_DRAW);
*outView = v;
v->ResizeTo(v->ExplicitPreferredSize());;
v->ResizeTo(v->ExplicitPreferredSize());
;
*outExtent = v->Bounds();
if (ioExtension) {
v->SetSettings(ioExtension);
@@ -678,20 +704,9 @@ GetConfigMessage( /* optional */
}
status_t
read_ppm_header(
BDataIO * inSource,
int * width,
int * rowbytes,
int * height,
int * max,
bool * ascii,
color_space * space,
bool * is_ppm,
char ** comment)
read_ppm_header(BDataIO* inSource, int* width, int* rowbytes, int* height,
int* max, bool* ascii, color_space* space, bool* is_ppm, char** comment)
{
/* check for PPM magic number */
char ch[2];
@@ -703,18 +718,17 @@ read_ppm_header(
/* B_TRANSLATOR_BITMAP magic? */
if (ch[0] == 'b' && ch[1] == 'i') {
*is_ppm = false;
return read_bits_header(inSource, 2, width, rowbytes, height, max, ascii, space);
return read_bits_header(
inSource, 2, width, rowbytes, height, max, ascii, space);
}
return B_NO_TRANSLATOR;
}
*is_ppm = true;
if (ch[1] == '6') {
*ascii = false;
}
else if (ch[1] == '3') {
} else if (ch[1] == '3') {
*ascii = true;
}
else {
} else {
return B_NO_TRANSLATOR;
}
// status_t err = B_NO_TRANSLATOR;
@@ -723,7 +737,8 @@ read_ppm_header(
scan_height,
scan_max,
scan_white
} state = scan_width;
} state
= scan_width;
int* scan = NULL;
bool in_comment = false;
*space = B_RGB24_BIG;
@@ -774,17 +789,17 @@ read_ppm_header(
*scan = 0;
}
*scan = (*scan) * 10 + (ch[0] - '0');
}
else if (isspace(ch[0])) {
} else if (isspace(ch[0])) {
if (scan) { /* are we done with one value? */
scan = NULL;
state = (enum scan_state)(state + 1);
}
if (state == scan_white) { /* we only ever read one whitespace, since we skip space */
return B_OK; /* when reading ASCII, and there is a single whitespace after max in raw mode */
if (state == scan_white) { /* we only ever read one whitespace,
since we skip space */
return B_OK; /* when reading ASCII, and there is a single
whitespace after max in raw mode */
}
}
else {
} else {
if (state != scan_white) {
return B_NO_TRANSLATOR;
}
@@ -795,20 +810,13 @@ read_ppm_header(
}
status_t
read_bits_header(
BDataIO * io,
int skipped,
int * width,
int * rowbytes,
int * height,
int * max,
bool * ascii,
color_space * space)
read_bits_header(BDataIO* io, int skipped, int* width, int* rowbytes,
int* height, int* max, bool* ascii, color_space* space)
{
/* read the rest of a possible B_TRANSLATOR_BITMAP header */
if (skipped < 0 || skipped > 4) return B_NO_TRANSLATOR;
if (skipped < 0 || skipped > 4)
return B_NO_TRANSLATOR;
int rd = sizeof(TranslatorBitmap) - skipped;
TranslatorBitmap hdr;
/* pre-initialize magic because we might have skipped part of it already */
@@ -830,7 +838,8 @@ read_bits_header(
if (hdr.magic != B_TRANSLATOR_BITMAP) {
return B_NO_TRANSLATOR;
}
if (hdr.colors & 0xffff0000) { /* according to <GraphicsDefs.h> this is a reasonable check. */
if (hdr.colors & 0xffff0000) { /* according to <GraphicsDefs.h> this is a
reasonable check. */
return B_NO_TRANSLATOR;
}
if (hdr.rowBytes * (hdr.bounds.Height() + 1) > hdr.dataSize) {
@@ -847,11 +856,10 @@ read_bits_header(
}
/* String may contain newlines, after which we need to insert extra hash signs. */
/* String may contain newlines, after which we need to insert extra hash signs.
*/
status_t
write_comment(
const char * str,
BDataIO * io)
write_comment(const char* str, BDataIO* io)
{
const char* end = str + strlen(str);
const char* ptr = str;
@@ -892,11 +900,7 @@ write_comment(
static status_t
read_ascii_line(
BDataIO * in,
int max,
unsigned char * data,
int rowbytes)
read_ascii_line(BDataIO* in, int max, unsigned char* data, int rowbytes)
{
char ch;
status_t err;
@@ -913,8 +917,7 @@ read_ascii_line(
if (isdigit(ch)) {
dig = true;
val = val * 10 + (ch - '0');
}
else {
} else {
if (dig) {
*(data++) = val * 255 / max;
val = 0;
@@ -944,10 +947,7 @@ read_ascii_line(
static status_t
write_ascii_line(
BDataIO * out,
unsigned char * data,
int rowbytes)
write_ascii_line(BDataIO* out, unsigned char* data, int rowbytes)
{
char buffer[20];
int linelen = 0;
@@ -971,8 +971,7 @@ write_ascii_line(
static unsigned char*
make_scale_data(
int max)
make_scale_data(int max)
{
unsigned char* ptr = (unsigned char*) malloc(max);
for (int ix = 0; ix < max; ix++) {
@@ -983,10 +982,7 @@ make_scale_data(
static void
scale_data(
unsigned char * scale,
unsigned char * data,
int bytes)
scale_data(unsigned char* scale, unsigned char* data, int bytes)
{
for (int ix = 0; ix < bytes; ix++) {
data[ix] = scale[data[ix]];
@@ -995,19 +991,12 @@ scale_data(
status_t
copy_data(
BDataIO * in,
BDataIO * out,
int rowbytes,
int out_rowbytes,
int height,
int max,
bool in_ascii,
bool out_ascii,
color_space in_space,
copy_data(BDataIO* in, BDataIO* out, int rowbytes, int out_rowbytes, int height,
int max, bool in_ascii, bool out_ascii, color_space in_space,
color_space out_space)
{
dprintf(("copy_data(%x, %x, %x, %x, %x, %x)\n", rowbytes, out_rowbytes, height, max, in_space, out_space));
dprintf(("copy_data(%x, %x, %x, %x, %x, %x)\n", rowbytes, out_rowbytes,
height, max, in_space, out_space));
/* We read/write one scanline at a time. */
unsigned char* data = (unsigned char*) malloc(rowbytes);
unsigned char* out_data = (unsigned char*) malloc(out_rowbytes);
@@ -1025,8 +1014,7 @@ copy_data(
while ((height-- > 0) && !err) {
if (in_ascii) {
err = read_ascii_line(in, max, data, rowbytes);
}
else {
} else {
err = in->Read(data, rowbytes);
if (err == rowbytes) {
err = B_OK;
@@ -1038,13 +1026,13 @@ copy_data(
if (err == B_OK) {
unsigned char* wbuf = data;
if (in_space != out_space) {
err = convert_space(in_space, out_space, data, rowbytes, out_data);
err = convert_space(
in_space, out_space, data, rowbytes, out_data);
wbuf = out_data;
}
if (!err && out_ascii) {
err = write_ascii_line(out, wbuf, out_rowbytes);
}
else if (!err) {
} else if (!err) {
err = out->Write(wbuf, out_rowbytes);
if (err == out_rowbytes) {
err = B_OK;
@@ -1057,5 +1045,3 @@ copy_data(
free(scale);
return err > 0 ? B_IO_ERROR : err;
}
+71 -57
View File
@@ -5,35 +5,42 @@
*/
#include <Debug.h>
#include <GraphicsDefs.h>
#include <InterfaceDefs.h>
#include <Debug.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "colorspace.h"
#if !defined(_PR3_COMPATIBLE_)
#define B_CMY24 ((color_space)0xC001) /* C[7:0] M[7:0] Y[7:0] No gray removal done */
#define B_CMY32 ((color_space)0xC002) /* C[7:0] M[7:0] Y[7:0] X[7:0] No gray removal done */
#define B_CMYA32 ((color_space)0xE002) /* C[7:0] M[7:0] Y[7:0] A[7:0] No gray removal done */
#define B_CMYK32 ((color_space)0xC003) /* C[7:0] M[7:0] Y[7:0] K[7:0] */
#define B_CMY24 \
((color_space) 0xC001) /* C[7:0] M[7:0] Y[7:0] No gray removal \
done */
#define B_CMY32 \
((color_space) 0xC002) /* C[7:0] M[7:0] Y[7:0] X[7:0] No gray removal \
done */
#define B_CMYA32 \
((color_space) 0xE002) /* C[7:0] M[7:0] Y[7:0] A[7:0] No gray removal \
done */
#define B_CMYK32 \
((color_space) 0xC003) /* C[7:0] M[7:0] Y[7:0] K[7:0] */
#endif
int
expand_data( /* expands to BGRA in the output buffer from <whatever> in the input buffer */
expand_data(/* expands to BGRA in the output buffer from <whatever> in the input
buffer */
color_space from_space,
unsigned char * in_data,
int rowbytes,
unsigned char * out_buf)
unsigned char* in_data, int rowbytes, unsigned char* out_buf)
{
ASSERT(in_data != out_buf);
/* We don't do YUV and friends yet. */
/* It's important to replicate the most significant component bits to LSB when going 15->24 */
/* It's important to replicate the most significant component bits to LSB
* when going 15->24 */
unsigned char* in_out = out_buf;
switch (from_space) {
case B_RGB32:
@@ -198,8 +205,7 @@ expand_data( /* expands to BGRA in the output buffer from <whatever> in the inpu
unsigned char ch;
if (c1 & b) {
ch = 0;
}
else {
} else {
ch = 255;
}
out_buf[0] = ch;
@@ -212,7 +218,8 @@ expand_data( /* expands to BGRA in the output buffer from <whatever> in the inpu
rowbytes -= 1;
}
break;
case B_CMY24: /* We do the "clean" inversion which doesn't correct for printing ink deficiencies. */
case B_CMY24: /* We do the "clean" inversion which doesn't correct
for printing ink deficiencies. */
while (rowbytes > 2) {
out_buf[0] = 255 - in_data[2];
out_buf[1] = 255 - in_data[1];
@@ -245,7 +252,8 @@ expand_data( /* expands to BGRA in the output buffer from <whatever> in the inpu
rowbytes -= 4;
}
break;
case B_CMYK32: /* We assume uniform gray removal, and no under-color-removal. */
case B_CMYK32: /* We assume uniform gray removal, and no
under-color-removal. */
while (rowbytes > 3) {
int comp = 255 - in_data[2] - in_data[3];
out_buf[0] = comp < 0 ? 0 : comp;
@@ -267,18 +275,18 @@ expand_data( /* expands to BGRA in the output buffer from <whatever> in the inpu
int
collapse_data(
unsigned char * in_buf,
int num_bytes,
color_space out_space,
collapse_data(unsigned char* in_buf, int num_bytes, color_space out_space,
unsigned char* out_buf)
{
ASSERT(in_buf != out_buf);
unsigned char* in_out = out_buf;
/* We could increase perceived image quality of down conversions by implementing */
/* dithering. However, someone might want to operate on the images after */
/* conversion, in which case dithering would be un-good. Besides, good error */
/* We could increase perceived image quality of down conversions by
* implementing */
/* dithering. However, someone might want to operate on the images after
*/
/* conversion, in which case dithering would be un-good. Besides, good
* error */
/* diffusion requires more than one scan line to propagate errors to. */
switch (out_space) {
case B_RGB32:
@@ -299,7 +307,8 @@ collapse_data(
break;
case B_RGB16:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<3)&0x7e0)|((in_buf[2]<<8)&0xf800);
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 3) & 0x7e0)
| ((in_buf[2] << 8) & 0xf800);
out_buf[0] = val;
out_buf[1] = val >> 8;
out_buf += 2;
@@ -309,7 +318,8 @@ collapse_data(
break;
case B_RGB15:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<2)&0x3e0)|((in_buf[2]<<7)&0x7c00)|0x8000;
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 2) & 0x3e0)
| ((in_buf[2] << 7) & 0x7c00) | 0x8000;
out_buf[0] = val;
out_buf[1] = val >> 8;
out_buf += 2;
@@ -319,7 +329,8 @@ collapse_data(
break;
case B_RGBA15:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<2)&0x3e0)|((in_buf[2]<<7)&0x7c00);
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 2) & 0x3e0)
| ((in_buf[2] << 7) & 0x7c00);
if (in_buf[3] > 127) {
val = val | 0x8000;
}
@@ -335,20 +346,21 @@ collapse_data(
while (num_bytes > 3) {
if (in_buf[3] < 128) {
out_buf[0] = B_TRANSPARENT_8_BIT;
}
else {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<2)&0x3e0)|((in_buf[2]<<7)&0x7c00);
} else {
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 2) & 0x3e0)
| ((in_buf[2] << 7) & 0x7c00);
out_buf[0] = map->index_map[val];
}
out_buf += 1;
in_buf += 4;
num_bytes -= 4;
}
}
break;
} break;
case B_GRAY8:
while (num_bytes > 3) { /* There are better algorithms than Y = .25B+.50G+.25R */
/* but hardly faster -- and it's still better than (B+G+R)/3 ! */
while (num_bytes > 3) { /* There are better algorithms than Y =
.25B+.50G+.25R */
/* but hardly faster -- and it's still better than (B+G+R)/3 !
*/
out_buf[0] = (in_buf[0] + in_buf[1] * 2 + in_buf[2]) >> 2;
out_buf += 1;
in_buf += 4;
@@ -366,7 +378,8 @@ collapse_data(
cnt = 0;
ob = 0;
}
c = ((in_buf[0]+in_buf[1]*2+in_buf[2])&0x200)>>(2+cnt);
c = ((in_buf[0] + in_buf[1] * 2 + in_buf[2]) & 0x200)
>> (2 + cnt);
ob = ob | c;
cnt++;
in_buf += 4;
@@ -411,7 +424,8 @@ collapse_data(
break;
case B_RGB16_BIG:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<3)&0x7e0)|((in_buf[2]<<8)&0xf800);
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 3) & 0x7e0)
| ((in_buf[2] << 8) & 0xf800);
out_buf[0] = val >> 8;
out_buf[1] = val;
out_buf += 2;
@@ -421,7 +435,8 @@ collapse_data(
break;
case B_RGB15_BIG:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<2)&0x3e0)|((in_buf[2]<<7)&0x7c00)|0x8000;
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 2) & 0x3e0)
| ((in_buf[2] << 7) & 0x7c00) | 0x8000;
out_buf[0] = val >> 8;
out_buf[1] = val;
out_buf += 2;
@@ -431,7 +446,8 @@ collapse_data(
break;
case B_RGBA15_BIG:
while (num_bytes > 3) {
uint16 val = (in_buf[0]>>3)|((in_buf[1]<<2)&0x3e0)|((in_buf[2]<<7)&0x7c00);
uint16 val = (in_buf[0] >> 3) | ((in_buf[1] << 2) & 0x3e0)
| ((in_buf[2] << 7) & 0x7c00);
if (in_buf[3] > 127) {
val = val | 0x8000;
}
@@ -497,9 +513,7 @@ collapse_data(
#if DEBUG_DATA
static void
print_data(
unsigned char * ptr,
int n)
print_data(unsigned char* ptr, int n)
{
while (n-- > 0) {
printf("%02x ", *(ptr++));
@@ -510,19 +524,18 @@ print_data(
status_t
convert_space(
color_space in_space,
color_space out_space,
unsigned char * in_data,
int rowbytes,
unsigned char * out_data)
convert_space(color_space in_space, color_space out_space,
unsigned char* in_data, int rowbytes, unsigned char* out_data)
{
ASSERT(in_data != out_data);
/* Instead of coding each transformation separately, which would create */
/* a very large number of conversion functions, we write one function to */
/* Instead of coding each transformation separately, which would create
*/
/* a very large number of conversion functions, we write one function to
*/
/* convert to RGBA32, and another function to convert from RGBA32, and */
/* put them together to get a manageable program, at a slight expense in */
/* put them together to get a manageable program, at a slight expense in
*/
/* conversion speed. */
int n;
@@ -536,7 +549,8 @@ convert_space(
memcpy(out_data, in_data, rowbytes);
return B_OK;
}
/* When the input format is RGBA32, we don't need the first conversion. */
/* When the input format is RGBA32, we don't need the first conversion.
*/
if (in_space == B_RGBA32) {
n = collapse_data(in_data, rowbytes, out_space, out_data);
#if DEBUG_DATA
@@ -545,7 +559,8 @@ convert_space(
#endif
return B_OK;
}
/* When the output format is RGBA32, we don't need any second conversion. */
/* When the output format is RGBA32, we don't need any second conversion.
*/
if (out_space == B_RGB32 || out_space == B_RGBA32) {
n = expand_data(in_space, in_data, rowbytes, out_data);
#if DEBUG_DATA
@@ -579,13 +594,12 @@ convert_space(
}
/* Figure out what the rowbytes is for a given width in a given color space. */
/* Rowbytes is bytes per pixel times width, rounded up to nearest multiple of 4. */
/* Figure out what the rowbytes is for a given width in a given color space.
*/
/* Rowbytes is bytes per pixel times width, rounded up to nearest multiple
* of 4. */
int
calc_rowbytes(
color_space space,
int width)
calc_rowbytes(color_space space, int width)
{
int v = width * 4;
switch (space) {
+4 -4
View File
@@ -17,13 +17,13 @@ status_t convert_space(color_space in_space, color_space out_space,
/* This function expands rowbytes amount of data from in_data into */
/* RGBA32 data in out_buf, which must be big enough. */
int expand_data(color_space from_space, unsigned char * in_data,
int rowbytes, unsigned char * out_buf);
int expand_data(color_space from_space, unsigned char* in_data, int rowbytes,
unsigned char* out_buf);
/* This function converts num_bytes bytes of RGBA32 data into some new */
/* color space in out_buf, where out_buf must be big enough. */
int collapse_data(unsigned char * in_buf, int num_bytes,
color_space out_space, unsigned char * out_buf);
int collapse_data(unsigned char* in_buf, int num_bytes, color_space out_space,
unsigned char* out_buf);
/* Given a specific number of pixels in width in the color space space */
/* this function calculates what the row_bytes should be. */