Implemented a progress monitor - I'll implement support for this in ShowImage next.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20644 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
af56b5b233
commit
646dadb991
@ -93,6 +93,20 @@ y_flipped(int32 orientation)
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
void
|
||||
dump_to_disk(void* data, size_t length)
|
||||
{
|
||||
FILE* file = fopen("/tmp/RAW.out", "wb");
|
||||
if (file == NULL)
|
||||
return;
|
||||
|
||||
fwrite(data, length, 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
@ -105,7 +119,7 @@ DCRaw::DCRaw(BPositionIO& stream)
|
||||
fDNGVersion(0),
|
||||
fIsTIFF(false),
|
||||
fThreshold(0),
|
||||
fHalfSize(true),
|
||||
fHalfSize(false),
|
||||
fUseCameraWhiteBalance(true),
|
||||
fUseAutoWhiteBalance(true),
|
||||
fRawColor(true),
|
||||
@ -126,7 +140,8 @@ DCRaw::DCRaw(BPositionIO& stream)
|
||||
fDecodeLeaf(0),
|
||||
fDecodeBitsZeroAfterMax(false),
|
||||
fFilters(~0),
|
||||
fEXIFOffset(-1)
|
||||
fEXIFOffset(-1),
|
||||
fProgressMonitor(NULL)
|
||||
{
|
||||
fImages = new image_data_info[kImageBufferCount];
|
||||
fDecodeBuffer = new decode[kDecodeBufferCount];
|
||||
@ -888,6 +903,9 @@ DCRaw::_FixupValues()
|
||||
void
|
||||
DCRaw::_ScaleColors()
|
||||
{
|
||||
if (fProgressMonitor != NULL)
|
||||
fProgressMonitor("Scale Colors", 5, fProgressData);
|
||||
|
||||
int dblack, c, val, sum[8];
|
||||
uint32 row, col, x, y;
|
||||
double dsum[8], dmin, dmax;
|
||||
@ -1008,6 +1026,9 @@ DCRaw::_WaveletDenoise()
|
||||
void
|
||||
DCRaw::_PreInterpolate()
|
||||
{
|
||||
if (fProgressMonitor != NULL)
|
||||
fProgressMonitor("Pre-Interpolate", 10, fProgressData);
|
||||
|
||||
uint32 row, col;
|
||||
|
||||
if (fShrink) {
|
||||
@ -1488,6 +1509,9 @@ DCRaw::_BorderInterpolate(uint32 border)
|
||||
void
|
||||
DCRaw::_AHDInterpolate()
|
||||
{
|
||||
if (fProgressMonitor != NULL)
|
||||
fProgressMonitor("Interpolate", 30, fProgressData);
|
||||
|
||||
#define TS 256 /* Tile Size */
|
||||
|
||||
int i, j, tr, tc, fc, c, d, val, hm[2];
|
||||
@ -1508,8 +1532,15 @@ DCRaw::_AHDInterpolate()
|
||||
rgb = (ushort(*)[TS][TS][3])buffer;
|
||||
lab = (short (*)[TS][TS][3])(buffer + 12*TS*TS);
|
||||
homo = (char (*)[TS][TS])(buffer + 24*TS*TS);
|
||||
float percentage = 30;
|
||||
float percentageStep = 55.0f / (fInputHeight / (TS - 6));
|
||||
|
||||
for (top = 0; top < fInputHeight; top += TS - 6) {
|
||||
if (fProgressMonitor) {
|
||||
fProgressMonitor("Interpolate", percentage, fProgressData);
|
||||
percentage += percentageStep;
|
||||
}
|
||||
|
||||
for (left = 0; left < fInputWidth; left += TS - 6) {
|
||||
memset(rgb, 0, 12 * TS * TS);
|
||||
|
||||
@ -1677,6 +1708,9 @@ DCRaw::_PseudoInverse(double (*in)[3], double (*out)[3], uint32 size)
|
||||
void
|
||||
DCRaw::_ConvertToRGB()
|
||||
{
|
||||
if (fProgressMonitor != NULL)
|
||||
fProgressMonitor("Convert to RGB", 85, fProgressData);
|
||||
|
||||
uint32 row, col, c, i, j, k;
|
||||
float out[3], out_cam[3][4];
|
||||
double num, inverse[3][3];
|
||||
@ -2190,16 +2224,6 @@ DCRaw::_CanonHasLowBits()
|
||||
return hasLowBits;
|
||||
}
|
||||
|
||||
void
|
||||
dump_to_disk(void* data, size_t length)
|
||||
{
|
||||
FILE* file = fopen("/tmp/RAW.out", "wb");
|
||||
if (file == NULL)
|
||||
return;
|
||||
|
||||
fwrite(data, length, 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
void
|
||||
DCRaw::_LoadRAWCanonCompressed(const image_data_info& image)
|
||||
@ -2354,7 +2378,7 @@ DCRaw::_LoadRAWLosslessJPEG(const image_data_info& image)
|
||||
}
|
||||
}
|
||||
|
||||
dump_to_disk(fImageData, fInputWidth * fColors * 100);
|
||||
//dump_to_disk(fImageData, fInputWidth * fColors * 100);
|
||||
free(jh.row);
|
||||
|
||||
if (rawWidth > fInputWidth)
|
||||
@ -2393,6 +2417,9 @@ DCRaw::_LoadRAW(const image_data_info& image)
|
||||
void
|
||||
DCRaw::_WriteRGB32(image_data_info& image, uint8* outputBuffer)
|
||||
{
|
||||
if (fProgressMonitor != NULL)
|
||||
fProgressMonitor("Write RGB", 95, fProgressData);
|
||||
|
||||
uint8* line, lookUpTable[0x10000];
|
||||
|
||||
uint32 width = image.flip > 4 ? fOutputHeight : fOutputWidth;
|
||||
@ -3393,3 +3420,17 @@ DCRaw::GetEXIFTag(off_t& offset, size_t& length, bool& bigEndian) const
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DCRaw::SetProgressMonitor(monitor_hook hook, void* data)
|
||||
{
|
||||
fProgressMonitor = hook;
|
||||
fProgressData = data;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DCRaw::SetHalfSize(bool half)
|
||||
{
|
||||
fHalfSize = half;
|
||||
}
|
||||
|
@ -50,6 +50,8 @@ struct image_data_info {
|
||||
bool is_raw;
|
||||
};
|
||||
|
||||
typedef void (*monitor_hook)(const char* message, float percentage, void* data);
|
||||
|
||||
class DCRaw {
|
||||
public:
|
||||
DCRaw(BPositionIO& stream);
|
||||
@ -65,6 +67,9 @@ class DCRaw {
|
||||
|
||||
status_t GetEXIFTag(off_t& offset, size_t& length,
|
||||
bool& bigEndian) const;
|
||||
void SetProgressMonitor(monitor_hook hook, void* data);
|
||||
|
||||
void SetHalfSize(bool half);
|
||||
|
||||
private:
|
||||
int32 _AllocateImage();
|
||||
@ -185,6 +190,9 @@ class DCRaw {
|
||||
uint32 fEXIFLength;
|
||||
|
||||
off_t fCurveOffset;
|
||||
|
||||
monitor_hook fProgressMonitor;
|
||||
void* fProgressData;
|
||||
};
|
||||
|
||||
#endif // RAW_H
|
||||
|
@ -16,8 +16,10 @@
|
||||
|
||||
|
||||
// Extensions that ShowImage supports
|
||||
const char *kDocumentCount = "/documentCount";
|
||||
const char *kDocumentIndex = "/documentIndex";
|
||||
const char* kDocumentCount = "/documentCount";
|
||||
const char* kDocumentIndex = "/documentIndex";
|
||||
const char* kProgressMonitor = "/progressMonitor";
|
||||
|
||||
|
||||
// The input formats that this translator supports.
|
||||
translation_format sInputFormats[] = {
|
||||
@ -62,6 +64,10 @@ const uint32 kNumOutputFormats = sizeof(sOutputFormats) / sizeof(translation_for
|
||||
const uint32 kNumDefaultSettings = sizeof(sDefaultSettings) / sizeof(TranSetting);
|
||||
|
||||
|
||||
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
RAWTranslator::RAWTranslator()
|
||||
: BaseTranslator("RAW Images", "RAW Image Translator",
|
||||
RAW_TRANSLATOR_VERSION,
|
||||
@ -133,6 +139,37 @@ RAWTranslator::DerivedIdentify(BPositionIO *stream,
|
||||
}
|
||||
|
||||
|
||||
bigtime_t gStart;
|
||||
|
||||
|
||||
/*static*/ void
|
||||
RAWTranslator::_ProgressMonitor(const char* message, float percentage,
|
||||
void* data)
|
||||
{
|
||||
BMessenger& messenger = *(BMessenger*)data;
|
||||
|
||||
BMessage update;
|
||||
update.AddString("message", message);
|
||||
update.AddFloat("percent", percentage);
|
||||
update.AddInt64("time", system_time());
|
||||
|
||||
#if 1
|
||||
static bigtime_t last;
|
||||
static int32 lastHash;
|
||||
int32 hash = *(int32*)message;
|
||||
|
||||
if (system_time() - last > 500000 || hash != lastHash) {
|
||||
printf("%6.3fs: %3.1f%% %s\n",
|
||||
(system_time() - gStart) / 1000000.0, percentage, message);
|
||||
last = system_time();
|
||||
lastHash = hash;
|
||||
}
|
||||
#endif
|
||||
|
||||
messenger.SendMessage(&update);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
RAWTranslator::DerivedTranslate(BPositionIO* source,
|
||||
const translator_info* info, BMessage* settings,
|
||||
@ -143,17 +180,27 @@ RAWTranslator::DerivedTranslate(BPositionIO* source,
|
||||
if (outType != B_TRANSLATOR_BITMAP || baseType != 0)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
DCRaw raw(*source);
|
||||
|
||||
bool headerOnly = false;
|
||||
if (settings != NULL)
|
||||
BMessenger monitor;
|
||||
|
||||
if (settings != NULL) {
|
||||
settings->FindBool(B_TRANSLATOR_EXT_HEADER_ONLY, &headerOnly);
|
||||
|
||||
DCRaw raw(*source);
|
||||
if (settings->FindMessenger(kProgressMonitor, &monitor) == B_OK) {
|
||||
raw.SetProgressMonitor(&_ProgressMonitor, &monitor);
|
||||
_ProgressMonitor("Reading Image Data", 0, &monitor);
|
||||
}
|
||||
}
|
||||
|
||||
int32 imageIndex = 0;
|
||||
uint8* buffer = NULL;
|
||||
size_t bufferSize;
|
||||
status_t status;
|
||||
|
||||
gStart = system_time();
|
||||
|
||||
try {
|
||||
status = raw.Identify();
|
||||
|
||||
@ -176,6 +223,8 @@ RAWTranslator::DerivedTranslate(BPositionIO* source,
|
||||
if (status < B_OK)
|
||||
return B_NO_TRANSLATOR;
|
||||
|
||||
printf("TOTAL: %6.3fs\n", (system_time() - gStart) / 1000000.0);
|
||||
|
||||
image_meta_info meta;
|
||||
raw.GetMetaInfo(meta);
|
||||
|
||||
|
@ -18,11 +18,11 @@
|
||||
#include <ByteOrder.h>
|
||||
|
||||
|
||||
#define RAW_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(0, 1, 0)
|
||||
#define RAW_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(0, 5, 0)
|
||||
#define RAW_IMAGE_FORMAT 'RAWI'
|
||||
|
||||
#define RAW_IN_QUALITY 0.95
|
||||
#define RAW_IN_CAPABILITY 0.95
|
||||
#define RAW_IN_QUALITY 0.90
|
||||
#define RAW_IN_CAPABILITY 0.90
|
||||
#define BITS_IN_QUALITY 1
|
||||
#define BITS_IN_CAPABILITY 1
|
||||
|
||||
@ -45,7 +45,11 @@ class RAWTranslator : public BaseTranslator {
|
||||
const translator_info *inInfo, BMessage *ioExtension,
|
||||
uint32 outType, BPositionIO *outDestination, int32 baseType);
|
||||
|
||||
virtual BView *NewConfigView(TranslatorSettings *settings);
|
||||
virtual BView *NewConfigView(TranslatorSettings *settings);
|
||||
|
||||
private:
|
||||
static void _ProgressMonitor(const char* message, float percentage,
|
||||
void* data);
|
||||
};
|
||||
|
||||
#endif // RAW_TRANSLATOR_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user