From 646dadb991685ed1b37fa956a13f6893dc1e3f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 10 Apr 2007 21:12:12 +0000 Subject: [PATCH] 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 --- src/add-ons/translators/raw/RAW.cpp | 67 +++++++++++++++---- src/add-ons/translators/raw/RAW.h | 8 +++ src/add-ons/translators/raw/RAWTranslator.cpp | 57 ++++++++++++++-- src/add-ons/translators/raw/RAWTranslator.h | 12 ++-- 4 files changed, 123 insertions(+), 21 deletions(-) diff --git a/src/add-ons/translators/raw/RAW.cpp b/src/add-ons/translators/raw/RAW.cpp index 6db556db00..935ac22dc4 100644 --- a/src/add-ons/translators/raw/RAW.cpp +++ b/src/add-ons/translators/raw/RAW.cpp @@ -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; +} diff --git a/src/add-ons/translators/raw/RAW.h b/src/add-ons/translators/raw/RAW.h index 5cb2481938..e23923d89f 100644 --- a/src/add-ons/translators/raw/RAW.h +++ b/src/add-ons/translators/raw/RAW.h @@ -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 diff --git a/src/add-ons/translators/raw/RAWTranslator.cpp b/src/add-ons/translators/raw/RAWTranslator.cpp index 7662714c29..914ec1d558 100644 --- a/src/add-ons/translators/raw/RAWTranslator.cpp +++ b/src/add-ons/translators/raw/RAWTranslator.cpp @@ -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); diff --git a/src/add-ons/translators/raw/RAWTranslator.h b/src/add-ons/translators/raw/RAWTranslator.h index 32dba0a45b..bd95f52aba 100644 --- a/src/add-ons/translators/raw/RAWTranslator.h +++ b/src/add-ons/translators/raw/RAWTranslator.h @@ -18,11 +18,11 @@ #include -#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