* Initial and very basic version of a RAW image translator.
* Based on Dave Coffin's fabuluous dcraw - it's basically the same thing in C++, but follows common sense programming rules a bit more :-). * Current version probably only supports PENTAX RAW format, though. * Still lots of places left to clean up. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20404 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -8,6 +8,7 @@ SubInclude HAIKU_TOP src add-ons translators jpeg2000 ;
|
||||
SubInclude HAIKU_TOP src add-ons translators libtiff ;
|
||||
SubInclude HAIKU_TOP src add-ons translators png ;
|
||||
SubInclude HAIKU_TOP src add-ons translators ppm ;
|
||||
SubInclude HAIKU_TOP src add-ons translators raw ;
|
||||
SubInclude HAIKU_TOP src add-ons translators rtf ;
|
||||
SubInclude HAIKU_TOP src add-ons translators sgi ;
|
||||
SubInclude HAIKU_TOP src add-ons translators stxt ;
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2005-2007, Axel Dörfler, [email protected]. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#include "ConfigView.h"
|
||||
#include "RAWTranslator.h"
|
||||
|
||||
#include <StringView.h>
|
||||
#include <CheckBox.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
ConfigView::ConfigView(const BRect &frame, uint32 resize, uint32 flags)
|
||||
: BView(frame, "RAWTranslator Settings", resize, flags)
|
||||
{
|
||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
|
||||
font_height fontHeight;
|
||||
be_bold_font->GetHeight(&fontHeight);
|
||||
float height = fontHeight.descent + fontHeight.ascent + fontHeight.leading;
|
||||
|
||||
BRect rect(10, 10, 200, 10 + height);
|
||||
BStringView *stringView = new BStringView(rect, "title", "RAW Images");
|
||||
stringView->SetFont(be_bold_font);
|
||||
stringView->ResizeToPreferred();
|
||||
AddChild(stringView);
|
||||
|
||||
rect.OffsetBy(0, height + 10);
|
||||
char version[256];
|
||||
sprintf(version, "Version %d.%d.%d, %s",
|
||||
int(B_TRANSLATION_MAJOR_VERSION(RAW_TRANSLATOR_VERSION)),
|
||||
int(B_TRANSLATION_MINOR_VERSION(RAW_TRANSLATOR_VERSION)),
|
||||
int(B_TRANSLATION_REVISION_VERSION(RAW_TRANSLATOR_VERSION)),
|
||||
__DATE__);
|
||||
stringView = new BStringView(rect, "version", version);
|
||||
stringView->ResizeToPreferred();
|
||||
AddChild(stringView);
|
||||
|
||||
GetFontHeight(&fontHeight);
|
||||
height = fontHeight.descent + fontHeight.ascent + fontHeight.leading;
|
||||
|
||||
rect.OffsetBy(0, height + 5);
|
||||
stringView = new BStringView(rect, "copyright", B_UTF8_COPYRIGHT "2007 Haiku Inc.");
|
||||
stringView->ResizeToPreferred();
|
||||
AddChild(stringView);
|
||||
|
||||
rect.OffsetBy(0, height + 20);
|
||||
BCheckBox *checkBox = new BCheckBox(rect, "color", "Write 32 bit images on true color input", NULL);
|
||||
checkBox->ResizeToPreferred();
|
||||
AddChild(checkBox);
|
||||
|
||||
rect.OffsetBy(0, height + 10);
|
||||
checkBox = new BCheckBox(rect, "size", "Enforce valid icon sizes", NULL);
|
||||
checkBox->ResizeToPreferred();
|
||||
checkBox->SetValue(1);
|
||||
AddChild(checkBox);
|
||||
|
||||
rect.OffsetBy(0, height + 15);
|
||||
stringView = new BStringView(rect, "valid1", "Valid icon sizes are 16, 32, or 48");
|
||||
stringView->ResizeToPreferred();
|
||||
AddChild(stringView);
|
||||
|
||||
rect.OffsetBy(0, height + 5);
|
||||
stringView = new BStringView(rect, "valid2", "pixel in either direction.");
|
||||
stringView->ResizeToPreferred();
|
||||
AddChild(stringView);
|
||||
}
|
||||
|
||||
|
||||
ConfigView::~ConfigView()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright 2004-2007, Axel Dörfler, [email protected]. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef CONFIG_VIEW_H
|
||||
#define CONFIG_VIEW_H
|
||||
|
||||
|
||||
#include <View.h>
|
||||
|
||||
|
||||
class ConfigView : public BView {
|
||||
public:
|
||||
ConfigView(const BRect &frame, uint32 resize = B_FOLLOW_ALL,
|
||||
uint32 flags = B_WILL_DRAW);
|
||||
virtual ~ConfigView();
|
||||
};
|
||||
|
||||
#endif /* CONFIG_VIEW_H */
|
||||
@@ -0,0 +1,26 @@
|
||||
SubDir HAIKU_TOP src add-ons translators raw ;
|
||||
|
||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||
|
||||
# Include code from shared translator directory
|
||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons translators shared ] ;
|
||||
|
||||
Translator RAWTranslator :
|
||||
# RawTranslator classes
|
||||
main.cpp
|
||||
RAWTranslator.cpp
|
||||
ConfigView.cpp
|
||||
RAW.cpp
|
||||
|
||||
# shared classes
|
||||
BaseTranslator.cpp
|
||||
TranslatorSettings.cpp
|
||||
TranslatorWindow.cpp
|
||||
|
||||
: be translation
|
||||
;
|
||||
|
||||
Package haiku-translationkit-cvs :
|
||||
RAWTranslator
|
||||
: boot home config add-ons Translators
|
||||
;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,170 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef RAW_H
|
||||
#define RAW_H
|
||||
|
||||
|
||||
#include "ReadHelper.h"
|
||||
|
||||
struct jhead;
|
||||
struct tiff_tag;
|
||||
|
||||
|
||||
struct image_meta_info {
|
||||
char manufacturer[64];
|
||||
char model[128];
|
||||
char software[64];
|
||||
float flash_used;
|
||||
float iso_speed;
|
||||
float shutter;
|
||||
float aperture;
|
||||
float focal_length;
|
||||
double pixel_aspect;
|
||||
uint32 raw_width;
|
||||
uint32 raw_height;
|
||||
int flip;
|
||||
uint32 dng_version;
|
||||
uint32 shot_order;
|
||||
int32 black;
|
||||
double maximum;
|
||||
float camera_multipliers[4];
|
||||
float pre_multipliers[4];
|
||||
float rgb_camera[3][4]; /* RGB from camera color */
|
||||
time_t timestamp;
|
||||
};
|
||||
|
||||
struct image_data_info {
|
||||
uint32 width;
|
||||
uint32 height;
|
||||
uint32 output_width;
|
||||
uint32 output_height;
|
||||
uint32 bits_per_sample;
|
||||
uint32 compression;
|
||||
uint32 photometric_interpretation;
|
||||
uint32 flip;
|
||||
uint32 samples;
|
||||
uint32 bytes;
|
||||
off_t data_offset;
|
||||
bool is_raw;
|
||||
};
|
||||
|
||||
class DCRaw {
|
||||
public:
|
||||
DCRaw(BPositionIO& stream);
|
||||
~DCRaw();
|
||||
|
||||
status_t Identify();
|
||||
status_t ReadImageAt(uint32 index, uint8*& outputBuffer,
|
||||
size_t& bufferSize);
|
||||
|
||||
void GetMetaInfo(image_meta_info& metaInfo) const;
|
||||
uint32 CountImages() const;
|
||||
status_t ImageAt(uint32 index, image_data_info& info) const;
|
||||
|
||||
private:
|
||||
int32 _AllocateImage();
|
||||
image_data_info& _Raw();
|
||||
image_data_info& _Thumb();
|
||||
void _CorrectIndex(uint32& index) const;
|
||||
uint16& _Bayer(int32 column, int32 row);
|
||||
int32 _FilterCoefficient(int32 column, int32 row);
|
||||
int32 _FlipIndex(uint32 row, uint32 col, uint32 flip);
|
||||
|
||||
// image manipulation and conversion
|
||||
void _ScaleColors();
|
||||
void _WaveletDenoise();
|
||||
void _PreInterpolate();
|
||||
void _CameraToCIELab(ushort cam[4], float lab[3]);
|
||||
void _CameraXYZCoefficients(double cam_xyz[4][3]);
|
||||
void _AdobeCoefficients(char* manufacturer, char* model);
|
||||
void _BorderInterpolate(uint32 border);
|
||||
void _AHDInterpolate();
|
||||
void _PseudoInverse(double (*in)[3], double (*out)[3], uint32 size);
|
||||
void _ConvertToRGB();
|
||||
void _GammaLookUpTable(uchar* lut);
|
||||
|
||||
void _ParseThumbTag(off_t baseOffset, uint32 offsetTag, uint32 lengthTag);
|
||||
void _ParseManufacturerTag(off_t baseOffset);
|
||||
void _ParseEXIF(off_t baseOffset);
|
||||
|
||||
// Lossless JPEG
|
||||
void _InitDecoder();
|
||||
uchar *_MakeDecoder(const uchar* source, int level);
|
||||
void _InitDecodeBits();
|
||||
uint32 _GetDecodeBits(uint32 numBits);
|
||||
status_t _LosslessJPEGInit(struct jhead* jh, bool infoOnly);
|
||||
int _LosslessJPEGDiff(struct decode *dindex);
|
||||
void _LosslessJPEGRow(struct jhead *jh, int jrow);
|
||||
|
||||
// RAW Loader
|
||||
void _LoadRAWPacked12();
|
||||
|
||||
// Image writers
|
||||
void _WriteJPEG(image_data_info& image, uint8* outputBuffer);
|
||||
void _WriteRGB32(image_data_info& image, uint8* outputBuffer);
|
||||
|
||||
// TIFF
|
||||
time_t _ParseTIFFTimestamp(bool reversed);
|
||||
void _ParseTIFFTag(off_t baseOffset, tiff_tag& tag, off_t& offset);
|
||||
status_t _ParseTIFFImageFileDirectory(off_t baseOffset, uint32 offset);
|
||||
status_t _ParseTIFFImageFileDirectory(off_t baseOffset);
|
||||
status_t _ParseTIFF(off_t baseOffset);
|
||||
|
||||
TReadHelper fRead;
|
||||
image_meta_info fMeta;
|
||||
image_data_info* fImages;
|
||||
uint32 fNumImages;
|
||||
|
||||
int32 fRawIndex;
|
||||
int32 fThumbIndex;
|
||||
uint32 fDNGVersion;
|
||||
|
||||
uint16 (*fImageData)[4];
|
||||
// output image data
|
||||
int32 fThreshold;
|
||||
int32 fShrink;
|
||||
bool fHalfSize;
|
||||
bool fUseCameraWhiteBalance;
|
||||
bool fUseAutoWhiteBalance;
|
||||
bool fRawColor;
|
||||
bool fUseGamma;
|
||||
float fBrightness;
|
||||
int32 fOutputColor;
|
||||
int32 fHighlight;
|
||||
int32 fDocumentMode;
|
||||
uint32 fOutputWidth;
|
||||
uint32 fOutputHeight;
|
||||
uint32 fInputWidth;
|
||||
uint32 fInputHeight;
|
||||
int32 fTopMargin;
|
||||
int32 fLeftMargin;
|
||||
uint32 fUniqueID;
|
||||
uint32 fColors;
|
||||
uint16 fWhite[8][8];
|
||||
float fUserMultipliers[4];
|
||||
uint32* fOutputProfile;
|
||||
uint32 fOutputBitsPerSample;
|
||||
int32 (*fHistogram)[4];
|
||||
float* cbrt;
|
||||
float xyz_cam[3][4];
|
||||
// TODO: find better names for these...
|
||||
|
||||
// Lossless JPEG
|
||||
decode* fDecodeBuffer;
|
||||
decode* fSecondDecode;
|
||||
decode* fFreeDecode;
|
||||
int fDecodeLeaf;
|
||||
uint32 fDecodeBits;
|
||||
uint32 fDecodeBitsRead;
|
||||
bool fDecodeBitsReset;
|
||||
bool fDecodeBitsZeroAfterMax;
|
||||
|
||||
uint32 fFilters;
|
||||
uint32 fEXIFFilters;
|
||||
|
||||
off_t fCurveOffset;
|
||||
};
|
||||
|
||||
#endif // RAW_H
|
||||
@@ -0,0 +1,225 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#include "RAWTranslator.h"
|
||||
#include "ConfigView.h"
|
||||
#include "RAW.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// Extensions that ShowImage supports
|
||||
const char *kDocumentCount = "/documentCount";
|
||||
const char *kDocumentIndex = "/documentIndex";
|
||||
|
||||
// The input formats that this translator supports.
|
||||
translation_format sInputFormats[] = {
|
||||
{
|
||||
RAW_IMAGE_FORMAT,
|
||||
B_TRANSLATOR_BITMAP,
|
||||
RAW_IN_QUALITY,
|
||||
RAW_IN_CAPABILITY,
|
||||
"image/x-vnd.adobe-dng",
|
||||
"Adobe Digital Negative"
|
||||
},
|
||||
{
|
||||
RAW_IMAGE_FORMAT,
|
||||
B_TRANSLATOR_BITMAP,
|
||||
RAW_IN_QUALITY,
|
||||
RAW_IN_CAPABILITY,
|
||||
"image/x-vnd.photo-raw",
|
||||
"Digital Photo RAW image"
|
||||
},
|
||||
};
|
||||
|
||||
// The output formats that this translator supports.
|
||||
translation_format sOutputFormats[] = {
|
||||
{
|
||||
B_TRANSLATOR_BITMAP,
|
||||
B_TRANSLATOR_BITMAP,
|
||||
BITS_OUT_QUALITY,
|
||||
BITS_OUT_CAPABILITY,
|
||||
"x-be-bitmap",
|
||||
"Be Bitmap image"
|
||||
},
|
||||
};
|
||||
|
||||
// Default settings for the Translator
|
||||
static TranSetting sDefaultSettings[] = {
|
||||
{B_TRANSLATOR_EXT_HEADER_ONLY, TRAN_SETTING_BOOL, false},
|
||||
{B_TRANSLATOR_EXT_DATA_ONLY, TRAN_SETTING_BOOL, false}
|
||||
};
|
||||
|
||||
const uint32 kNumInputFormats = sizeof(sInputFormats) / sizeof(translation_format);
|
||||
const uint32 kNumOutputFormats = sizeof(sOutputFormats) / sizeof(translation_format);
|
||||
const uint32 kNumDefaultSettings = sizeof(sDefaultSettings) / sizeof(TranSetting);
|
||||
|
||||
|
||||
RAWTranslator::RAWTranslator()
|
||||
: BaseTranslator("Raw Images", "Raw Image Translator",
|
||||
RAW_TRANSLATOR_VERSION,
|
||||
sInputFormats, kNumInputFormats,
|
||||
sOutputFormats, kNumOutputFormats,
|
||||
"RawTranslator_Settings",
|
||||
sDefaultSettings, kNumDefaultSettings,
|
||||
B_TRANSLATOR_BITMAP, RAW_IMAGE_FORMAT)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
RAWTranslator::~RAWTranslator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
RAWTranslator::DerivedIdentify(BPositionIO *stream,
|
||||
const translation_format *format, BMessage *settings,
|
||||
translator_info *info, uint32 outType)
|
||||
{
|
||||
if (!outType)
|
||||
outType = B_TRANSLATOR_BITMAP;
|
||||
if (outType != B_TRANSLATOR_BITMAP)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
DCRaw raw(*stream);
|
||||
status_t status;
|
||||
|
||||
try {
|
||||
status = raw.Identify();
|
||||
} catch (status_t error) {
|
||||
status = error;
|
||||
}
|
||||
|
||||
if (status < B_OK)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
image_meta_info meta;
|
||||
raw.GetMetaInfo(meta);
|
||||
|
||||
if (settings) {
|
||||
int32 count = raw.CountImages();
|
||||
|
||||
// Add page count to ioExtension
|
||||
settings->RemoveName(kDocumentCount);
|
||||
settings->AddInt32(kDocumentCount, count);
|
||||
|
||||
// Check if a document index has been specified
|
||||
int32 index;
|
||||
if (settings->FindInt32(kDocumentIndex, &index) == B_OK)
|
||||
index--;
|
||||
else
|
||||
index = 0;
|
||||
|
||||
if (index < 0 || index >= count)
|
||||
return B_NO_TRANSLATOR;
|
||||
}
|
||||
|
||||
info->type = RAW_IMAGE_FORMAT;
|
||||
info->group = B_TRANSLATOR_BITMAP;
|
||||
info->quality = RAW_IN_QUALITY;
|
||||
info->capability = RAW_IN_CAPABILITY;
|
||||
snprintf(info->name, sizeof(info->name), "%s RAW image", meta.manufacturer);
|
||||
strcpy(info->MIME, "image/x-vnd.photo-raw");
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
RAWTranslator::DerivedTranslate(BPositionIO* source,
|
||||
const translator_info* info, BMessage* settings,
|
||||
uint32 outType, BPositionIO* target, int32 baseType)
|
||||
{
|
||||
if (!outType)
|
||||
outType = B_TRANSLATOR_BITMAP;
|
||||
if (outType != B_TRANSLATOR_BITMAP || baseType != 0)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
DCRaw raw(*source);
|
||||
|
||||
int32 imageIndex = 0;
|
||||
uint8* buffer = NULL;
|
||||
size_t bufferSize;
|
||||
status_t status;
|
||||
|
||||
try {
|
||||
status = raw.Identify();
|
||||
|
||||
if (status == B_OK && settings) {
|
||||
// Check if a document index has been specified
|
||||
if (settings->FindInt32(kDocumentIndex, &imageIndex) == B_OK)
|
||||
imageIndex--;
|
||||
else
|
||||
imageIndex = 0;
|
||||
|
||||
if (imageIndex < 0 || imageIndex >= (int32)raw.CountImages())
|
||||
status = B_BAD_VALUE;
|
||||
}
|
||||
if (status == B_OK)
|
||||
status = raw.ReadImageAt(imageIndex, buffer, bufferSize);
|
||||
} catch (status_t error) {
|
||||
status = error;
|
||||
}
|
||||
|
||||
if (status < B_OK)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
image_meta_info meta;
|
||||
raw.GetMetaInfo(meta);
|
||||
|
||||
image_data_info data;
|
||||
raw.ImageAt(imageIndex, data);
|
||||
|
||||
if (!data.is_raw)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
uint32 dataSize = data.output_width * 4 * data.output_height;
|
||||
|
||||
TranslatorBitmap header;
|
||||
header.magic = B_TRANSLATOR_BITMAP;
|
||||
header.bounds.Set(0, 0, data.output_width - 1, data.output_height - 1);
|
||||
header.rowBytes = data.output_width * 4;
|
||||
header.colors = B_RGB32;
|
||||
header.dataSize = dataSize;
|
||||
|
||||
// write out Be's Bitmap header
|
||||
swap_data(B_UINT32_TYPE, &header, sizeof(TranslatorBitmap),
|
||||
B_SWAP_HOST_TO_BENDIAN);
|
||||
target->Write(&header, sizeof(TranslatorBitmap));
|
||||
|
||||
ssize_t bytesWritten = target->Write(buffer, dataSize);
|
||||
if (bytesWritten < B_OK)
|
||||
return bytesWritten;
|
||||
|
||||
if ((size_t)bytesWritten != dataSize)
|
||||
return B_IO_ERROR;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
BView *
|
||||
RAWTranslator::NewConfigView(TranslatorSettings *settings)
|
||||
{
|
||||
return new ConfigView(BRect(0, 0, 225, 175));
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
BTranslator *
|
||||
make_nth_translator(int32 n, image_id you, uint32 flags, ...)
|
||||
{
|
||||
if (n != 0)
|
||||
return NULL;
|
||||
|
||||
return new RAWTranslator();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef RAW_TRANSLATOR_H
|
||||
#define RAW_TRANSLATOR_H
|
||||
|
||||
|
||||
#include "BaseTranslator.h"
|
||||
|
||||
#include <Translator.h>
|
||||
#include <TranslatorFormats.h>
|
||||
#include <TranslationDefs.h>
|
||||
#include <GraphicsDefs.h>
|
||||
#include <InterfaceDefs.h>
|
||||
#include <DataIO.h>
|
||||
#include <File.h>
|
||||
#include <ByteOrder.h>
|
||||
|
||||
|
||||
#define RAW_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(0, 1, 0)
|
||||
#define RAW_IMAGE_FORMAT 'RAWI'
|
||||
|
||||
#define RAW_IN_QUALITY 0.95
|
||||
#define RAW_IN_CAPABILITY 0.95
|
||||
#define BITS_IN_QUALITY 1
|
||||
#define BITS_IN_CAPABILITY 1
|
||||
|
||||
#define RAW_OUT_QUALITY 0.8
|
||||
#define RAW_OUT_CAPABILITY 0.8
|
||||
#define BITS_OUT_QUALITY 1
|
||||
#define BITS_OUT_CAPABILITY 0.9
|
||||
|
||||
|
||||
class RAWTranslator : public BaseTranslator {
|
||||
public:
|
||||
RAWTranslator();
|
||||
virtual ~RAWTranslator();
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
#endif // RAW_TRANSLATOR_H
|
||||
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright 2004-2007, Haiku, Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef READ_HELPER_H
|
||||
#define READ_HELPER_H
|
||||
|
||||
|
||||
#include "TIFF.h"
|
||||
|
||||
#include <BufferIO.h>
|
||||
#include <ByteOrder.h>
|
||||
|
||||
|
||||
template<class T>
|
||||
inline void
|
||||
byte_swap(T &/*data*/)
|
||||
{
|
||||
// Specialize for data types which actually swap
|
||||
// printf("DEAD MEAT!\n");
|
||||
// exit(1);
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
inline void
|
||||
byte_swap(float &data)
|
||||
{
|
||||
data = __swap_float(data);
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
inline void
|
||||
byte_swap(int32 &data)
|
||||
{
|
||||
data = __swap_int32(data);
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
inline void
|
||||
byte_swap(uint32 &data)
|
||||
{
|
||||
data = __swap_int32(data);
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
inline void
|
||||
byte_swap(int16 &data)
|
||||
{
|
||||
data = __swap_int16(data);
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
inline void
|
||||
byte_swap(uint16 &data)
|
||||
{
|
||||
data = __swap_int16(data);
|
||||
}
|
||||
|
||||
|
||||
class TReadHelper {
|
||||
public:
|
||||
TReadHelper(BPositionIO& stream)
|
||||
:
|
||||
fStream(&stream, 65536, false),
|
||||
fError(B_OK),
|
||||
fSwap(false)
|
||||
{
|
||||
}
|
||||
|
||||
template<class T> inline void
|
||||
operator()(T &data)
|
||||
{
|
||||
fError = fStream.Read((void *)&data, sizeof(T));
|
||||
if (fError > B_OK) {
|
||||
if (IsSwapping())
|
||||
byte_swap(data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fError == 0)
|
||||
fError = B_ERROR;
|
||||
throw fError;
|
||||
}
|
||||
|
||||
template<class T> inline void
|
||||
operator()(T data, size_t length)
|
||||
{
|
||||
fError = fStream.Read((void *)data, length);
|
||||
if (fError < (ssize_t)length)
|
||||
fError = B_ERROR;
|
||||
|
||||
if (fError >= B_OK)
|
||||
return;
|
||||
|
||||
throw fError;
|
||||
}
|
||||
|
||||
template<class T> inline T
|
||||
Next()
|
||||
{
|
||||
T value;
|
||||
fError = fStream.Read((void *)&value, sizeof(T));
|
||||
if (fError > B_OK) {
|
||||
if (IsSwapping())
|
||||
byte_swap(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
if (fError == 0)
|
||||
fError = B_ERROR;
|
||||
throw fError;
|
||||
}
|
||||
|
||||
inline uint32
|
||||
Next(uint16 type)
|
||||
{
|
||||
if (type == TIFF_UINT16_TYPE || type == TIFF_INT16_TYPE)
|
||||
return Next<uint16>();
|
||||
|
||||
return Next<uint32>();
|
||||
}
|
||||
|
||||
inline double
|
||||
NextDouble(uint16 type)
|
||||
{
|
||||
switch (type) {
|
||||
case TIFF_UINT16_TYPE:
|
||||
return Next<uint16>();
|
||||
case TIFF_UINT32_TYPE:
|
||||
return Next<uint32>();
|
||||
case TIFF_UFRACTION_TYPE:
|
||||
{
|
||||
double value = Next<uint32>();
|
||||
return value / Next<uint32>();
|
||||
}
|
||||
case TIFF_INT16_TYPE:
|
||||
return Next<int16>();
|
||||
case TIFF_INT32_TYPE:
|
||||
return Next<int32>();
|
||||
case TIFF_FRACTION_TYPE:
|
||||
{
|
||||
double value = Next<int32>();
|
||||
return value / Next<int32>();
|
||||
}
|
||||
case TIFF_FLOAT_TYPE:
|
||||
return Next<float>();
|
||||
case TIFF_DOUBLE_TYPE:
|
||||
return Next<double>();
|
||||
|
||||
default:
|
||||
return Next<uint8>();
|
||||
}
|
||||
}
|
||||
|
||||
status_t Status()
|
||||
{ return fError >= B_OK ? B_OK : fError; };
|
||||
|
||||
off_t Seek(off_t offset, int32 mode)
|
||||
{ return fStream.Seek(offset, mode); }
|
||||
off_t Position()
|
||||
{ return fStream.Position(); }
|
||||
|
||||
void SetSwap(bool yesNo) { fSwap = yesNo; };
|
||||
bool IsSwapping() { return fSwap; };
|
||||
|
||||
BPositionIO& Stream() { return fStream; }
|
||||
|
||||
private:
|
||||
BBufferIO fStream;
|
||||
status_t fError;
|
||||
bool fSwap;
|
||||
};
|
||||
|
||||
#endif // READ_HELPER_H
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef TIFF_H
|
||||
#define TIFF_H
|
||||
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
enum types {
|
||||
TIFF_UINT16_TYPE = 3,
|
||||
TIFF_UINT32_TYPE,
|
||||
TIFF_UFRACTION_TYPE,
|
||||
TIFF_INT16_TYPE = 8,
|
||||
TIFF_INT32_TYPE,
|
||||
TIFF_FRACTION_TYPE,
|
||||
TIFF_FLOAT_TYPE,
|
||||
TIFF_DOUBLE_TYPE,
|
||||
};
|
||||
|
||||
struct tiff_tag {
|
||||
uint16 tag;
|
||||
uint16 type;
|
||||
uint32 length;
|
||||
};
|
||||
|
||||
#endif // TIFF_H
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#include "RAWTranslator.h"
|
||||
#include "RAW.h"
|
||||
#include "TranslatorWindow.h"
|
||||
|
||||
#include <Application.h>
|
||||
|
||||
#define TEST_MODE 0
|
||||
#if TEST_MODE
|
||||
# include <Bitmap.h>
|
||||
# include <BitmapStream.h>
|
||||
# include <View.h>
|
||||
# include <Window.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
BApplication app("application/x-vnd.haiku-raw-translator");
|
||||
|
||||
#if TEST_MODE
|
||||
if (argc > 1) {
|
||||
for (int i = 1; i < argc; i++) {
|
||||
BFile file;
|
||||
status_t status = file.SetTo(argv[i], B_READ_ONLY);
|
||||
if (status != B_OK) {
|
||||
fprintf(stderr, "Cannot read file %s: %s\n", argv[i],
|
||||
strerror(status));
|
||||
continue;
|
||||
}
|
||||
|
||||
DCRaw raw(file);
|
||||
|
||||
try {
|
||||
status = raw.Identify();
|
||||
} catch (status_t error) {
|
||||
status = error;
|
||||
}
|
||||
|
||||
if (status < B_OK) {
|
||||
fprintf(stderr, "Could not identify file %s: %s\n",
|
||||
argv[i], strerror(status));
|
||||
continue;
|
||||
}
|
||||
|
||||
image_meta_info meta;
|
||||
raw.GetMetaInfo(meta);
|
||||
|
||||
printf("manufacturer: %s\n", meta.manufacturer);
|
||||
printf("model: %s\n", meta.model);
|
||||
printf("software: %s\n", meta.software);
|
||||
printf("flash used: %g\n", meta.flash_used);
|
||||
printf("ISO speed: %g\n", meta.iso_speed);
|
||||
printf("shutter: ");
|
||||
if (meta.shutter >= 1)
|
||||
printf("%g sec\n", meta.shutter);
|
||||
else
|
||||
printf("1/%g sec\n", 1 / meta.shutter);
|
||||
printf("aperture: %g\n", meta.aperture);
|
||||
printf("focal length: %g mm\n", meta.focal_length);
|
||||
printf("pixel aspect: %g\n", meta.pixel_aspect);
|
||||
printf("flip: %d\n", meta.flip);
|
||||
printf("shot order: %ld\n", meta.shot_order);
|
||||
printf("DNG version: %ld\n", meta.dng_version);
|
||||
printf("Camera White Balance:");
|
||||
for (int32 i = 0; i < 4; i++) {
|
||||
printf(" %g", meta.camera_multipliers[i]);
|
||||
}
|
||||
putchar('\n');
|
||||
|
||||
for (int32 i = 0; i < (int32)raw.CountImages(); i++) {
|
||||
image_data_info data;
|
||||
raw.ImageAt(i, data);
|
||||
|
||||
printf(" [%ld] %s %lu x %lu (%ld bits per sample, compression %ld)\n",
|
||||
i, data.is_raw ? "RAW " : "JPEG",
|
||||
data.width, data.height, data.bits_per_sample, data.compression);
|
||||
|
||||
if (!data.is_raw) {
|
||||
// write data to file
|
||||
uint8* buffer;
|
||||
size_t bufferSize;
|
||||
try {
|
||||
status = raw.ReadImageAt(i, buffer, bufferSize);
|
||||
} catch (status_t error) {
|
||||
status = error;
|
||||
}
|
||||
if (status == B_OK) {
|
||||
BString name = "/tmp/output";
|
||||
name << i << ".jpg";
|
||||
BFile output(name.String(),
|
||||
B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
|
||||
output.Write(buffer, bufferSize);
|
||||
}
|
||||
} else {
|
||||
RAWTranslator translator;
|
||||
BBitmapStream output;
|
||||
BBitmap* bitmap;
|
||||
|
||||
status_t status = translator.DerivedTranslate(&file, NULL,
|
||||
NULL, B_TRANSLATOR_BITMAP, &output, 0);
|
||||
if (status == B_OK)
|
||||
status = output.DetachBitmap(&bitmap);
|
||||
if (status == B_OK) {
|
||||
BWindow* window = new BWindow(BRect(50, 50,
|
||||
bitmap->Bounds().Width() + 50,
|
||||
bitmap->Bounds().Height() + 50),
|
||||
"RAW", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS
|
||||
| B_NOT_RESIZABLE);
|
||||
BView* view = new BView(window->Bounds(), NULL,
|
||||
B_WILL_DRAW, B_FOLLOW_NONE);
|
||||
window->AddChild(view);
|
||||
window->Show();
|
||||
snooze(300000);
|
||||
window->Lock();
|
||||
view->DrawBitmap(bitmap, window->Bounds());
|
||||
view->Sync();
|
||||
window->Unlock();
|
||||
delete bitmap;
|
||||
|
||||
wait_for_thread(window->Thread(), &status);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
status_t status = LaunchTranslatorWindow(new RAWTranslator, "RAW Settings",
|
||||
BRect(0, 0, 225, 175));
|
||||
if (status != B_OK)
|
||||
return 1;
|
||||
|
||||
app.Run();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user