* Applied the changes I made to the JPEG translator to the JPEG2000 translator as well.

* Further cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19141 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-10-29 12:45:02 +00:00
parent 69b17409a0
commit 117da2d75f
4 changed files with 975 additions and 1120 deletions

View File

@ -105,15 +105,14 @@ SaveSettings(jpeg_settings *settings)
{
// Make path to settings file
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) {
path.SetTo(SETTINGS_PATH);
path.Append(SETTINGS_FILE);
} else
path.Append(SETTINGS_FILE);
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
return;
path.Append(SETTINGS_FILE);
// Open settings file (create it if there's no file) and write settings
FILE *file = NULL;
if ((file = fopen( path.Path(), "wb+"))) {
if ((file = fopen(path.Path(), "wb+"))) {
fwrite(settings, sizeof(jpeg_settings), 1, file);
fclose(file);
}
@ -155,10 +154,11 @@ LoadSettings(jpeg_settings *settings)
// Make path to settings file
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) {
path.SetTo(SETTINGS_PATH);
path.Append(SETTINGS_FILE);
} else
path.Append(SETTINGS_FILE);
LoadDefaultSettings(settings);
return;
}
path.Append(SETTINGS_FILE);
// Open settings file (create it if there's no file) and write settings
FILE *file = NULL;
@ -485,7 +485,7 @@ SSlider::UpdateText() const
void
SSlider::ResizeToPreferred()
{
int32 width = (int32)ceil(StringWidth( Label()) + StringWidth("9999"));
int32 width = (int32)ceil(StringWidth(Label()) + StringWidth("9999"));
if (width < 230)
width = 230;
@ -503,7 +503,7 @@ TranslatorReadView::TranslatorReadView(const char *name, jpeg_settings *settings
: SView(name, x, y),
fSettings(settings)
{
fAlwaysRGB32 = new BCheckBox( BRect(10, GetPreferredHeight(), 10,
fAlwaysRGB32 = new BCheckBox(BRect(10, GetPreferredHeight(), 10,
GetPreferredHeight()), "alwaysrgb32", VIEW_LABEL_ALWAYSRGB32,
new BMessage(VIEW_MSG_SET_ALWAYSRGB32));
fAlwaysRGB32->SetFont(be_plain_font);
@ -512,7 +512,7 @@ TranslatorReadView::TranslatorReadView(const char *name, jpeg_settings *settings
AddChild(fAlwaysRGB32);
fPhotoshopCMYK = new BCheckBox( BRect(10, GetPreferredHeight(), 10,
fPhotoshopCMYK = new BCheckBox(BRect(10, GetPreferredHeight(), 10,
GetPreferredHeight()), "photoshopCMYK", VIEW_LABEL_PHOTOSHOPCMYK,
new BMessage(VIEW_MSG_SET_PHOTOSHOPCMYK));
fPhotoshopCMYK->SetFont(be_plain_font);
@ -521,7 +521,7 @@ TranslatorReadView::TranslatorReadView(const char *name, jpeg_settings *settings
AddChild(fPhotoshopCMYK);
fShowErrorBox = new BCheckBox( BRect(10, GetPreferredHeight(), 10,
fShowErrorBox = new BCheckBox(BRect(10, GetPreferredHeight(), 10,
GetPreferredHeight()), "error", VIEW_LABEL_SHOWREADERRORBOX,
new BMessage(VIEW_MSG_SET_SHOWREADERRORBOX));
fShowErrorBox->SetFont(be_plain_font);
@ -609,7 +609,7 @@ TranslatorWriteView::TranslatorWriteView(const char *name, jpeg_settings *settin
fSmoothingSlider->SetValue(fSettings->Smoothing);
AddChild(fSmoothingSlider);
fProgress = new BCheckBox( BRect(10, GetPreferredHeight()+10, 10,
fProgress = new BCheckBox(BRect(10, GetPreferredHeight()+10, 10,
GetPreferredHeight()), "progress", VIEW_LABEL_PROGRESSIVE,
new BMessage(VIEW_MSG_SET_PROGRESSIVE));
fProgress->SetFont(be_plain_font);
@ -618,8 +618,8 @@ TranslatorWriteView::TranslatorWriteView(const char *name, jpeg_settings *settin
AddChild(fProgress);
fOptimizeColors = new BCheckBox( BRect(10, GetPreferredHeight()+5, 10,
GetPreferredHeight()+5), "optimizecolors", VIEW_LABEL_OPTIMIZECOLORS,
fOptimizeColors = new BCheckBox(BRect(10, GetPreferredHeight()+5, 10,
GetPreferredHeight() + 5), "optimizecolors", VIEW_LABEL_OPTIMIZECOLORS,
new BMessage(VIEW_MSG_SET_OPTIMIZECOLORS));
fOptimizeColors->SetFont(be_plain_font);
if (fSettings->OptimizeColors)
@ -627,8 +627,8 @@ TranslatorWriteView::TranslatorWriteView(const char *name, jpeg_settings *settin
AddChild(fOptimizeColors);
fSmallerFile = new BCheckBox( BRect(25, GetPreferredHeight()+5, 25,
GetPreferredHeight()+5), "smallerfile", VIEW_LABEL_SMALLERFILE,
fSmallerFile = new BCheckBox(BRect(25, GetPreferredHeight()+5, 25,
GetPreferredHeight() + 5), "smallerfile", VIEW_LABEL_SMALLERFILE,
new BMessage(VIEW_MSG_SET_SMALLERFILE));
fSmallerFile->SetFont(be_plain_font);
if (fSettings->SmallerFile)
@ -638,7 +638,7 @@ TranslatorWriteView::TranslatorWriteView(const char *name, jpeg_settings *settin
AddChild(fSmallerFile);
fGrayAsRGB24 = new BCheckBox( BRect(10, GetPreferredHeight()+5, 25,
fGrayAsRGB24 = new BCheckBox(BRect(10, GetPreferredHeight()+5, 25,
GetPreferredHeight()+5), "gray1asrgb24", VIEW_LABEL_GRAY1ASRGB24,
new BMessage(VIEW_MSG_SET_GRAY1ASRGB24));
fGrayAsRGB24->SetFont(be_plain_font);
@ -861,54 +861,6 @@ TranslatorView::AttachedToWindow()
while ((child = ChildAt(index++)) != NULL)
child->Hide();
#if 0
// Hack for DataTranslations which doesn't resize visible area to requested by view
// which makes some parts of bigger than usual translationviews out of visible area
// so if it was loaded to DataTranslations resize window if needed
BWindow *window = Window();
if (!strcmp(window->Name(), "DataTranslations")) {
BView *view = Parent();
if (view) {
BRect frame = view->Frame();
if (frame.Width() < GetPreferredWidth()
|| (frame.Height()-48) < GetPreferredHeight()) {
float x = ceil(GetPreferredWidth() - frame.Width());
float y = ceil(GetPreferredHeight() - (frame.Height()-48));
if (x < 0)
x = 0;
if (y < 0)
y = 0;
// DataTranslations has main view called "Background"
// change it's resizing mode so it will always resize with window
// also make sure view will be redrawed after resize
view = window->FindView("Background");
if (view) {
view->SetResizingMode(B_FOLLOW_ALL);
view->SetFlags(B_FULL_UPDATE_ON_RESIZE);
}
// The same with "Info..." button, except redrawing, which isn't needed
view = window->FindView("Info…");
if (view)
view->SetResizingMode(B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
window->ResizeBy(x, y);
// Let user resize window if resizing option is not already there...
uint32 flags = window->Flags();
if (flags & B_NOT_RESIZABLE) {
// ...but first prevent too small window (so "Info..." button will not look strange ;)
// max will be 800x600 which should be enough for now
window->SetSizeLimits(400, 800, 66, 600);
flags ^= B_NOT_RESIZABLE;
window->SetFlags(flags);
}
}
}
}
#endif
}
@ -1000,7 +952,8 @@ TranslatorView::MouseDown(BPoint where)
TranslatorWindow::TranslatorWindow(bool quitOnClose)
: BWindow(BRect(100, 100, 100, 100), "JPEG Settings", B_TITLED_WINDOW, B_NOT_ZOOMABLE)
: BWindow(BRect(100, 100, 100, 100), "JPEG Settings", B_TITLED_WINDOW,
B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS)
{
BRect extent(0, 0, 0, 0);
BView *config = NULL;
@ -1424,7 +1377,7 @@ Decompress(BPositionIO *in, BPositionIO *out)
jpeg_start_decompress(&cinfo);
// !!! Initialize this bounds rect to the size of your image
BRect bounds( 0, 0, cinfo.output_width-1, cinfo.output_height-1);
BRect bounds(0, 0, cinfo.output_width-1, cinfo.output_height-1);
// Bytes count in one line of image (scanline)
int64 row_bytes = cinfo.output_width * out_color_components;
@ -1504,12 +1457,13 @@ Error(j_common_ptr cinfo, status_t error)
int
main() {
BApplication app("application/x-vnd.Shard.JPEGTranslator");
main(int, char**)
{
BApplication app("application/x-vnd.Haiku-JPEGTranslator");
TranslatorWindow *window = new TranslatorWindow();
window->Show();
app.Run();
return 0;
}

View File

@ -50,8 +50,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Settings
#define SETTINGS_FILE "OpenJPEGTranslator"
#define SETTINGS_PATH "/boot/home/config/settings"
#define SETTINGS_FILE "JPEGTranslator"
// View messages
#define VIEW_MSG_SET_QUALITY 'JSCQ'
@ -111,7 +110,6 @@ class SSlider : public BSlider {
mutable char fStatusLabel[12];
};
//! Basic view class with resizing to needed size
class SView : public BView {
public:
@ -133,7 +131,6 @@ class SView : public BView {
float fPreferredHeight;
};
//! Configuration view for reading settings
class TranslatorReadView : public SView {
public:
@ -150,8 +147,7 @@ class TranslatorReadView : public SView {
BCheckBox* fShowErrorBox;
};
// !Configuration view for writing settings
//! Configuration view for writing settings
class TranslatorWriteView : public SView {
public:
TranslatorWriteView(const char* name, jpeg_settings* settings,
@ -170,13 +166,11 @@ class TranslatorWriteView : public SView {
BCheckBox* fGrayAsRGB24;
};
class TranslatorAboutView : public SView {
public:
TranslatorAboutView(const char* name, float x = 0, float y = 0);
};
//! Configuration view
class TranslatorView : public SView {
public:
@ -197,9 +191,7 @@ class TranslatorView : public SView {
int32 fActiveChild;
};
//---------------------------------------------------
// Window used for configuration
//---------------------------------------------------
//! Window used for configuration
class TranslatorWindow : public BWindow {
public:
TranslatorWindow(bool quitOnClose = true);
@ -222,9 +214,8 @@ EXTERN(void) be_jpeg_stdio_dest(j_compress_ptr cinfo, BPositionIO *outfile); //
//---------------------------------------------------
EXTERN(struct jpeg_error_mgr *) be_jpeg_std_error (struct jpeg_error_mgr * err, jpeg_settings * settings); // from "be_jerror.cpp"
//---------------------------------------------------
// Main functions of translator :)
//---------------------------------------------------
// Main functions of translator :)
status_t Copy(BPositionIO *in, BPositionIO *out);
status_t Compress(BPositionIO *in, BPositionIO *out);
status_t Decompress(BPositionIO *in, BPositionIO *out);

File diff suppressed because it is too large Load Diff

View File

@ -33,12 +33,6 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define _JP2TRANSLATOR_H_
//----------------------------------------------------------------------------
//
// Include
//
//----------------------------------------------------------------------------
#include <Alert.h>
#include <Application.h>
#include <CheckBox.h>
@ -55,15 +49,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "libjasper/jasper.h"
//----------------------------------------------------------------------------
//
// Define & Global variables declaration
//
//----------------------------------------------------------------------------
// Settings
#define SETTINGS_FILE "OpenJPEG2000Translator"
#define SETTINGS_PATH "/boot/home/config/settings"
#define SETTINGS_FILE "JPEG2000Translator"
// View messages
#define VIEW_MSG_SET_QUALITY 'JSCQ'
@ -77,20 +65,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define VIEW_LABEL_JPC "Output only codestream (.jpc)"
#define VIEW_LABEL_GRAYASRGB32 "Read Greyscale images as RGB32"
// This will be used true if Settings are running, else false
extern bool AreSettingsRunning;
//----------------------------------------------------------------------------
//
// Classes
//
//----------------------------------------------------------------------------
//---------------------------------------------------
// Settings storage structure
//---------------------------------------------------
struct SETTINGS
{
//! Settings storage structure
struct jpeg_settings {
// compression
jpr_uchar_t Quality; // default: 25
bool JPC; // default: false // compress to JPC or JP2?
@ -99,595 +76,113 @@ struct SETTINGS
bool B_GRAY8_as_B_RGB32; // default: true
};
//---------------------------------------------------
// Slider used in TranslatorView
// With status showing actual value
//---------------------------------------------------
class SSlider : public BSlider
{
/*!
Slider used in TranslatorView
With status showing actual value
*/
class SSlider : public BSlider {
public:
SSlider(BRect frame, const char *name, const char *label, BMessage *message, int32 minValue, int32 maxValue, orientation posture = B_HORIZONTAL, thumb_style thumbType = B_BLOCK_THUMB, uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP, uint32 flags = B_NAVIGABLE | B_WILL_DRAW | B_FRAME_EVENTS);
char* UpdateText() const;
void ResizeToPreferred();
SSlider(BRect frame, const char *name, const char *label,
BMessage *message, int32 minValue, int32 maxValue,
orientation posture = B_HORIZONTAL,
thumb_style thumbType = B_BLOCK_THUMB,
uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = B_NAVIGABLE | B_WILL_DRAW | B_FRAME_EVENTS);
char* UpdateText() const;
void ResizeToPreferred();
private:
char statusLabel[12];
mutable char fStatusLabel[12];
};
//---------------------------------------------------
// Basic view class with resizing to needed size
//---------------------------------------------------
class SView : public BView
{
//! Basic view class with resizing to needed size
class SView : public BView {
public:
SView(const char *name, float x = 0, float y = 0)
:BView( BRect(x,y,x,y), name, B_FOLLOW_NONE, B_WILL_DRAW)
{
preferredWidth = 0;
preferredHeight = 0;
SetViewColor( ui_color(B_PANEL_BACKGROUND_COLOR));
SetFont(be_plain_font);
};
void GetPreferredSize(float *width, float *height)
{
*width = preferredWidth;
*height = preferredHeight;
}
inline float GetPreferredWidth() { return preferredWidth; };
inline float GetPreferredHeight() { return preferredHeight; };
inline void ResizePreferredBy(float width, float height) { preferredWidth += width; preferredHeight += height; };
inline void ResizeToPreferred() { ResizeTo(preferredWidth, preferredHeight); };
void AddChild(BView *child, BView *before = NULL)
{
BView::AddChild(child, before);
child->ResizeToPreferred();
BRect frame = child->Frame();
if (frame.right > preferredWidth)
preferredWidth = frame.right;
if (frame.bottom > preferredHeight)
preferredHeight = frame.bottom;
}
SView(const char* name, float x = 0, float y = 0);
virtual void GetPreferredSize(float* _width, float* _height);
virtual void ResizeToPreferred();
void AddChild(BView* child, BView* before = NULL);
float GetPreferredWidth()
{ return fPreferredWidth; }
float GetPreferredHeight()
{ return fPreferredHeight; }
void ResizePreferredBy(float width, float height);
private:
float preferredWidth;
float preferredHeight;
float fPreferredWidth;
float fPreferredHeight;
};
//---------------------------------------------------
// Configuration view for reading settings
//---------------------------------------------------
class TranslatorReadView : public SView
{
//! Configuration view for reading settings
class TranslatorReadView : public SView {
public:
TranslatorReadView(const char *name, SETTINGS *settings, float x = 0, float y = 0);
void AttachedToWindow();
void MessageReceived(BMessage *message);
TranslatorReadView(const char* name, jpeg_settings* settings,
float x = 0, float y = 0);
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
private:
SETTINGS *Settings;
BCheckBox *grayasrgb32;
jpeg_settings* fSettings;
BCheckBox* fGrayAsRGB32;
};
//---------------------------------------------------
// Configuration view for writing settings
//---------------------------------------------------
class TranslatorWriteView : public SView
{
//! Configuration view for writing settings
class TranslatorWriteView : public SView {
public:
TranslatorWriteView(const char *name, SETTINGS *settings, float x = 0, float y = 0);
void AttachedToWindow();
void MessageReceived(BMessage *message);
TranslatorWriteView(const char* name, jpeg_settings* settings,
float x = 0, float y = 0);
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
private:
SETTINGS *Settings;
SSlider *quality;
BCheckBox *gray1asrgb24;
BCheckBox *jpc;
jpeg_settings* fSettings;
SSlider* fQualitySlider;
BCheckBox* fGrayAsRGB24;
BCheckBox* fCodeStreamOnly;
};
//---------------------------------------------------
// About view
//---------------------------------------------------
class TranslatorAboutView : public SView
{
class TranslatorAboutView : public SView {
public:
TranslatorAboutView(const char *name, float x = 0, float y = 0);
TranslatorAboutView(const char* name, float x = 0, float y = 0);
};
//---------------------------------------------------
// Configuration view
//---------------------------------------------------
class TranslatorView : public SView
{
//! Configuration view
class TranslatorView : public SView {
public:
TranslatorView(const char *name);
~TranslatorView() { AreSettingsRunning = false; };
void AttachedToWindow();
void Draw(BRect updateRect);
void MouseDown(BPoint where);
TranslatorView(const char *name);
virtual ~TranslatorView();
virtual void AttachedToWindow();
virtual void Draw(BRect updateRect);
virtual void MouseDown(BPoint where);
private:
SETTINGS Settings;
int32 tabWidth;
int32 tabHeight;
int32 activeChild;
BRect _TabFrame(int32 index) const;
jpeg_settings fSettings;
BList fTabs;
int32 fTabWidth;
int32 fTabHeight;
int32 fActiveChild;
};
//---------------------------------------------------
// Window used for configuration
//---------------------------------------------------
class TranslatorWindow : public BWindow
{
//! Window used for configuration
class TranslatorWindow : public BWindow {
public:
TranslatorWindow(bool quit_on_close = true);
TranslatorWindow(bool quitOnClose = true);
};
//----------------------------------------------------------------------------
//
// Functions :: Settings
//
//----------------------------------------------------------------------------
//---------------------------------------------------
// Make Settings to defaults
//---------------------------------------------------
inline void
LoadDefaultSettings(SETTINGS *Settings)
{
Settings->Quality = 25;
Settings->JPC = false;
Settings->B_GRAY1_as_B_RGB24 = false;
Settings->B_GRAY8_as_B_RGB32 = true;
}
//---------------------------------------------------
// Save Settings to config file
//---------------------------------------------------
inline void
SaveSettings(SETTINGS *Settings)
{
// Make path to settings file
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) {
path.SetTo(SETTINGS_PATH);
path.Append(SETTINGS_FILE);
} else
path.Append(SETTINGS_FILE);
// Open settings file (create it if there's no file) and write settings
FILE *file = NULL;
if ((file = fopen( path.Path(), "wb+"))) {
fwrite(Settings, sizeof(SETTINGS), 1, file);
fclose(file);
}
}
//---------------------------------------------------
// Return true if Settings were run, false if not
//---------------------------------------------------
inline bool
SettingsChangedAlert()
{
// If settings view wasn't already initialized (settings not running)
// and user wants to run settings
if (!AreSettingsRunning && (new BAlert("Different settings file", "JPEG2000 settings were set to default because of incompatible settings file.", "Configure settings", "OK", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT))->Go() == 0) {
// Create settings window (with no quit on close!), launch it and wait until it's closed
status_t err;
TranslatorWindow *window = new TranslatorWindow(false);
window->Show();
wait_for_thread(window->Thread(), &err);
return true;
}
return false;
}
//---------------------------------------------------
// Load settings from config file
// If can't find it make them default and try to save
//---------------------------------------------------
inline void
LoadSettings(SETTINGS *Settings)
{
// Make path to settings file
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) {
path.SetTo(SETTINGS_PATH);
path.Append(SETTINGS_FILE);
} else
path.Append(SETTINGS_FILE);
// Open settings file (create it if there's no file) and write settings
FILE *file = NULL;
if ((file = fopen( path.Path(), "rb"))) {
if ( !fread(Settings, sizeof(SETTINGS), 1, file)) {
// Settings struct has changed size
// Load default settings, and Save them
fclose(file);
LoadDefaultSettings(Settings);
SaveSettings(Settings);
// Tell user settings were changed to default, and ask to run settings panel or not
if (SettingsChangedAlert())
// User configured settings, load them again
LoadSettings(Settings);
} else
fclose(file);
} else if ((file = fopen( path.Path(), "wb+"))) {
LoadDefaultSettings(Settings);
fwrite(Settings, sizeof(SETTINGS), 1, file);
fclose(file);
// Tell user settings were changed to default, and ask to run settings panel or not
if (SettingsChangedAlert())
// User configured settings, load them again
LoadSettings(Settings);
}
}
//----------------------------------------------------------------------------
//
// Functions
//
//----------------------------------------------------------------------------
//---------------------------------------------------
// Main functions of translator :)
//---------------------------------------------------
// Main functions of translator :)
status_t Copy(BPositionIO *in, BPositionIO *out);
status_t Compress(BPositionIO *in, BPositionIO *out);
status_t Decompress(BPositionIO *in, BPositionIO *out);
status_t Error(jas_stream_t *stream, jas_image_t *image, jas_matrix_t **pixels, int32 pixels_count, jpr_uchar_t *scanline, status_t error = B_ERROR);
//---------------------------------------------------
// Make RGB32 scanline from *pixels[3]
//---------------------------------------------------
inline void
read_rgb24_to_rgb32(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[2], x);
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[1], x);
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[0], x);
scanline[index++] = 255;
x++;
}
}
//---------------------------------------------------
// Make gray scanline from *pixels[1]
//---------------------------------------------------
inline void
read_gray_to_rgb32(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
jpr_uchar_t color = 0;
while (x < width)
{
color = (jpr_uchar_t)jas_matrix_getv(pixels[0], x++);
scanline[index++] = color;
scanline[index++] = color;
scanline[index++] = color;
scanline[index++] = 255;
}
}
//---------------------------------------------------
// Make RGBA32 scanline from *pixels[4]
// (just read data to scanline)
//---------------------------------------------------
inline void
read_rgba32(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[2], x);
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[1], x);
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[0], x);
scanline[index++] = (jpr_uchar_t)jas_matrix_getv(pixels[3], x);
x++;
}
}
//---------------------------------------------------
// Make gray scanline from *pixels[1]
// (just read data to scanline)
//---------------------------------------------------
inline void
read_gray(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
while (x < width)
{
scanline[x] = (jpr_uchar_t)jas_matrix_getv(pixels[0], x);
x++;
}
}
//---------------------------------------------------
// Make *pixels[1] from gray1 scanline
//---------------------------------------------------
inline void
write_gray1_to_gray(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
while (x < (width/8))
{
unsigned char c = scanline[x++];
for (int b = 128; b; b = b >> 1) {
if (c & b)
jas_matrix_setv(pixels[0], index++, 0);
else
jas_matrix_setv(pixels[0], index++, 255);
}
}
}
//---------------------------------------------------
// Make *pixels[3] from gray1 scanline
//---------------------------------------------------
inline void
write_gray1_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
while (x < (width/8))
{
unsigned char c = scanline[x++];
for (int b = 128; b; b = b >> 1) {
if (c & b) {
jas_matrix_setv(pixels[0], index, 0);
jas_matrix_setv(pixels[1], index, 0);
jas_matrix_setv(pixels[2], index, 0);
}
else {
jas_matrix_setv(pixels[0], index, 255);
jas_matrix_setv(pixels[1], index, 255);
jas_matrix_setv(pixels[2], index, 255);
}
index++;
}
}
}
//---------------------------------------------------
// Make *pixels[3] from cmap8 scanline
//---------------------------------------------------
inline void
write_cmap8_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
const color_map *map = system_colors();
int32 x = 0;
while (x < width)
{
rgb_color color = map->color_list[scanline[x]];
jas_matrix_setv(pixels[0], x, color.red);
jas_matrix_setv(pixels[1], x, color.green);
jas_matrix_setv(pixels[2], x, color.blue);
x++;
}
}
//---------------------------------------------------
// Make *pixels[1] from gray scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_gray(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[0], x, scanline[x]);
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB15/RGBA15 scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb15_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
int16 in_pixel;
while (x < width) {
in_pixel = scanline[index] | (scanline[index+1] << 8);
index += 2;
jas_matrix_setv(pixels[0], x, (char)(((in_pixel & 0x7c00)) >> 7) | (((in_pixel & 0x7c00)) >> 12));
jas_matrix_setv(pixels[1], x, (char)(((in_pixel & 0x3e0)) >> 2) | (((in_pixel & 0x3e0)) >> 7));
jas_matrix_setv(pixels[2], x, (char)(((in_pixel & 0x1f)) << 3) | (((in_pixel & 0x1f)) >> 2));
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB15/RGBA15 bigendian scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb15b_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
int16 in_pixel;
while (x < width) {
in_pixel = scanline[index+1] | (scanline[index] << 8);
index += 2;
jas_matrix_setv(pixels[0], x, (char)(((in_pixel & 0x7c00)) >> 7) | (((in_pixel & 0x7c00)) >> 12));
jas_matrix_setv(pixels[1], x, (char)(((in_pixel & 0x3e0)) >> 2) | (((in_pixel & 0x3e0)) >> 7));
jas_matrix_setv(pixels[2], x, (char)(((in_pixel & 0x1f)) << 3) | (((in_pixel & 0x1f)) >> 2));
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB16/RGBA16 scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb16_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
int16 in_pixel;
while (x < width) {
in_pixel = scanline[index] | (scanline[index+1] << 8);
index += 2;
jas_matrix_setv(pixels[0], x, (char)(((in_pixel & 0xf800)) >> 8) | (((in_pixel & 0x7c00)) >> 12));
jas_matrix_setv(pixels[1], x, (char)(((in_pixel & 0x7e0)) >> 3) | (((in_pixel & 0x7e0)) >> 9));
jas_matrix_setv(pixels[2], x, (char)(((in_pixel & 0x1f)) << 3) | (((in_pixel & 0x1f)) >> 2));
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB16/RGBA16 bigendian scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb16b_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 x = 0;
int32 index = 0;
int16 in_pixel;
while (x < width) {
in_pixel = scanline[index+1] | (scanline[index] << 8);
index += 2;
jas_matrix_setv(pixels[0], x, (char)(((in_pixel & 0xf800)) >> 8) | (((in_pixel & 0xf800)) >> 13));
jas_matrix_setv(pixels[1], x, (char)(((in_pixel & 0x7e0)) >> 3) | (((in_pixel & 0x7e0)) >> 9));
jas_matrix_setv(pixels[2], x, (char)(((in_pixel & 0x1f)) << 3) | (((in_pixel & 0x1f)) >> 2));
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB24 scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[2], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[0], x, scanline[index++]);
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB24 bigendian scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb24b(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[0], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[2], x, scanline[index++]);
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB32 scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb32_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[2], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[0], x, scanline[index++]);
index++;
x++;
}
}
//---------------------------------------------------
// Make *pixels[3] from RGB32 bigendian scanline
// (just write data to pixels)
//---------------------------------------------------
inline void
write_rgb32b_to_rgb24(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
index++;
jas_matrix_setv(pixels[0], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[2], x, scanline[index++]);
x++;
}
}
//---------------------------------------------------
// Make *pixels[4] from RGBA32 scanline
// (just write data to pixels)
// !!! UNTESTED !!!
//---------------------------------------------------
inline void
write_rgba32(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[3], x, scanline[index++]);
jas_matrix_setv(pixels[2], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[0], x, scanline[index++]);
x++;
}
}
//---------------------------------------------------
// Make *pixels[4] from RGBA32 bigendian scanline
// (just write data to pixels)
// !!! UNTESTED !!!
//---------------------------------------------------
inline void
write_rgba32b(jas_matrix_t **pixels, jpr_uchar_t *scanline, int width)
{
int32 index = 0;
int32 x = 0;
while (x < width)
{
jas_matrix_setv(pixels[0], x, scanline[index++]);
jas_matrix_setv(pixels[1], x, scanline[index++]);
jas_matrix_setv(pixels[2], x, scanline[index++]);
jas_matrix_setv(pixels[3], x, scanline[index++]);
x++;
}
}
#endif // _JP2TRANSLATOR_H_