From 73f41f49ecfa4f9bd7051bb5c6f764f65e6f5dcf Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 19 Jan 2010 22:52:09 +0000 Subject: [PATCH] * Introduce a new method to ask the translator if it can handle the image output size, if not it will not show up in the dynamically generated translator list. Folow up on ticket #4874. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35186 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/translators/ico/ICO.cpp | 14 ++++----- src/add-ons/translators/ico/ICO.h | 2 +- src/add-ons/translators/ico/ICOTranslator.cpp | 9 ++++++ src/add-ons/translators/ico/ICOTranslator.h | 3 ++ .../translators/shared/BaseTranslator.cpp | 30 ++++++++++++------- .../translators/shared/BaseTranslator.h | 2 ++ 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/add-ons/translators/ico/ICO.cpp b/src/add-ons/translators/ico/ICO.cpp index 4cd9c5a2de..ef83bfa241 100644 --- a/src/add-ons/translators/ico/ICO.cpp +++ b/src/add-ons/translators/ico/ICO.cpp @@ -166,13 +166,6 @@ get_4_bits_per_pixel(uint8 *line, int32 x) } -static bool -is_valid_size(int32 size) -{ - return size == 16 || size == 32 || size == 48; -} - - static uint8 get_alpha_value(color_space space, uint32 value) { @@ -495,6 +488,13 @@ convert_bits_to_data(TranslatorBitmap &bitsHeader, uint8 *bitsData, ico_dir_entr // #pragma mark - +bool +ICO::is_valid_size(int32 size) +{ + return size == 16 || size == 32 || size == 48; +} + + status_t ICO::identify(BMessage *settings, BPositionIO &stream, uint8 &type, int32 &bitsPerPixel) { diff --git a/src/add-ons/translators/ico/ICO.h b/src/add-ons/translators/ico/ICO.h index 1dec2d8c15..3a96167419 100644 --- a/src/add-ons/translators/ico/ICO.h +++ b/src/add-ons/translators/ico/ICO.h @@ -83,7 +83,7 @@ struct rgba32_color { } }; - +extern bool is_valid_size(int32 size); extern status_t identify(BMessage *settings, BPositionIO &stream, uint8 &type, int32 &bitsPerPixel); extern status_t convert_ico_to_bits(BMessage *settings, BPositionIO &source, BPositionIO &target); extern status_t convert_bits_to_ico(BMessage *settings, BPositionIO &source, diff --git a/src/add-ons/translators/ico/ICOTranslator.cpp b/src/add-ons/translators/ico/ICOTranslator.cpp index 67a73f84a7..cc34c85dad 100644 --- a/src/add-ons/translators/ico/ICOTranslator.cpp +++ b/src/add-ons/translators/ico/ICOTranslator.cpp @@ -156,6 +156,15 @@ ICOTranslator::DerivedTranslate(BPositionIO *source, } +status_t +ICOTranslator::DerivedCanHandleImageSize(float width, float height) const +{ + if (!ICO::is_valid_size(width) || !ICO::is_valid_size(height)) + return B_NO_TRANSLATOR; + return B_OK; +} + + BView * ICOTranslator::NewConfigView(TranslatorSettings *settings) { diff --git a/src/add-ons/translators/ico/ICOTranslator.h b/src/add-ons/translators/ico/ICOTranslator.h index e5c59fdeef..80e0889002 100644 --- a/src/add-ons/translators/ico/ICOTranslator.h +++ b/src/add-ons/translators/ico/ICOTranslator.h @@ -44,6 +44,9 @@ class ICOTranslator : public BaseTranslator { const translator_info *inInfo, BMessage *ioExtension, uint32 outType, BPositionIO *outDestination, int32 baseType); + virtual status_t DerivedCanHandleImageSize(float width, + float height) const; + virtual BView *NewConfigView(TranslatorSettings *settings); protected: diff --git a/src/add-ons/translators/shared/BaseTranslator.cpp b/src/add-ons/translators/shared/BaseTranslator.cpp index 13b9e9d562..65b54c1183 100644 --- a/src/add-ons/translators/shared/BaseTranslator.cpp +++ b/src/add-ons/translators/shared/BaseTranslator.cpp @@ -383,8 +383,7 @@ BaseTranslator::BitsCheck(BPositionIO *inSource, BMessage *ioExtension, memcpy(&sourceMagic, ch, sizeof(uint32)); if (sourceMagic == kBitsMagic) return B_OK; - else - return B_OK + 1; + return B_OK + 1; } status_t @@ -392,17 +391,19 @@ BaseTranslator::BitsIdentify(BPositionIO *inSource, const translation_format *inFormat, BMessage *ioExtension, translator_info *outInfo, uint32 outType) { - status_t result; - - result = BitsCheck(inSource, ioExtension, outType); - if (result == B_OK) - result = identify_bits_header(inSource, outInfo); - else if (result == B_OK + 1) + status_t result = BitsCheck(inSource, ioExtension, outType); + if (result == B_OK) { + TranslatorBitmap bitmap; + result = identify_bits_header(inSource, outInfo, &bitmap); + if (result == B_OK) + result = DerivedCanHandleImageSize(bitmap.bounds.Width() + 1.0, + bitmap.bounds.Height() + 1.0); + } else if (result >= B_OK) { // if NOT B_TRANSLATOR_BITMAP, it could be an image in the // derived format result = DerivedIdentify(inSource, inFormat, ioExtension, outInfo, outType); - + } return result; } @@ -452,7 +453,7 @@ BaseTranslator::Identify(BPositionIO *inSource, case B_TRANSLATOR_BITMAP: return BitsIdentify(inSource, inFormat, ioExtension, outInfo, outType); - + default: return DerivedIdentify(inSource, inFormat, ioExtension, outInfo, outType); @@ -595,7 +596,7 @@ BaseTranslator::Translate(BPositionIO *inSource, case B_TRANSLATOR_BITMAP: return BitsTranslate(inSource, inInfo, ioExtension, outType, outDestination); - + default: return DerivedTranslate(inSource, inInfo, ioExtension, outType, outDestination, -1); @@ -677,6 +678,13 @@ BaseTranslator::DerivedTranslate(BPositionIO *inSource, } +status_t +BaseTranslator::DerivedCanHandleImageSize(float width, float height) const +{ + return B_OK; +} + + BView * BaseTranslator::NewConfigView(TranslatorSettings *settings) { diff --git a/src/add-ons/translators/shared/BaseTranslator.h b/src/add-ons/translators/shared/BaseTranslator.h index fc9c05d1be..40fa884efb 100644 --- a/src/add-ons/translators/shared/BaseTranslator.h +++ b/src/add-ons/translators/shared/BaseTranslator.h @@ -110,6 +110,8 @@ public: const translator_info *inInfo, BMessage *ioExtension, uint32 outType, BPositionIO *outDestination, int32 baseType); + virtual status_t DerivedCanHandleImageSize(float width, float height) const; + virtual BView *NewConfigView(TranslatorSettings *settings);