From fbef8d31d3815bcaa32ca8114c4631153fe85edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 11 Feb 2005 03:38:15 +0000 Subject: [PATCH] Added support for the "/documentCount" and "/documentIndex" extension used by the TIFF translator. Thanks again to BiPolar for the note about this. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11334 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/translators/icotranslator/ICO.cpp | 51 ++++++++++++++++--- src/add-ons/translators/icotranslator/ICO.h | 9 ++-- .../icotranslator/ICOTranslator.cpp | 10 ++-- .../translators/icotranslator/ICOTranslator.h | 6 ++- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/add-ons/translators/icotranslator/ICO.cpp b/src/add-ons/translators/icotranslator/ICO.cpp index a4f1d3f54b..2337750256 100644 --- a/src/add-ons/translators/icotranslator/ICO.cpp +++ b/src/add-ons/translators/icotranslator/ICO.cpp @@ -5,7 +5,9 @@ // ToDo: This definitely needs to be worked over for endian issues -#include +#include "ICO.h" +#include "ICOTranslator.h" + #include #include @@ -481,7 +483,7 @@ convert_bits_to_data(TranslatorBitmap &bitsHeader, uint8 *bitsData, ico_dir_entr status_t -ICO::identify(BPositionIO &stream, int32 &bitsPerPixel) +ICO::identify(BMessage *settings, BPositionIO &stream, int32 &bitsPerPixel) { // read in the header @@ -496,6 +498,23 @@ ICO::identify(BPositionIO &stream, int32 &bitsPerPixel) if (!header.IsValid()) return B_BAD_VALUE; + int32 iconIndex = 0; + + if (settings) { + // Add page count to ioExtension + settings->RemoveName(kDocumentCount); + settings->AddInt32(kDocumentCount, header.entry_count); + + // Check if a document index has been specified + if (settings->FindInt32(kDocumentIndex, &iconIndex) == B_OK) + iconIndex--; + else + iconIndex = 0; + + if (iconIndex < 0 || iconIndex >= header.entry_count) + return B_NO_TRANSLATOR; + } + // read in directory entries for (uint32 i = 0; i < header.entry_count; i++) { @@ -522,7 +541,8 @@ ICO::identify(BPositionIO &stream, int32 &bitsPerPixel) if (!bitmapHeader.IsValid()) return B_BAD_VALUE; - bitsPerPixel = bitmapHeader.bits_per_pixel; + if ((uint32)iconIndex == i) + bitsPerPixel = bitmapHeader.bits_per_pixel; } return B_OK; @@ -533,7 +553,7 @@ ICO::identify(BPositionIO &stream, int32 &bitsPerPixel) */ status_t -ICO::convert_ico_to_bits(BPositionIO &source, BPositionIO &target) +ICO::convert_ico_to_bits(BMessage *settings, BPositionIO &source, BPositionIO &target) { ico_header header; if (source.Read(&header, sizeof(ico_header)) != (ssize_t)sizeof(ico_header)) @@ -546,19 +566,33 @@ ICO::convert_ico_to_bits(BPositionIO &source, BPositionIO &target) if (!header.IsValid()) return B_BAD_VALUE; - // read in first entry + int32 iconIndex = 0; + + if (settings) { + // Check if a document index has been specified + if (settings->FindInt32(kDocumentIndex, &iconIndex) == B_OK) + iconIndex--; + else + iconIndex = 0; + + if (iconIndex < 0 || iconIndex >= header.entry_count) + return B_BAD_VALUE; + } + + // read in selected entry ico_dir_entry entry; - if (source.Read(&entry, sizeof(ico_dir_entry)) != (ssize_t)sizeof(ico_dir_entry)) + if (source.ReadAt(sizeof(ico_header) + sizeof(ico_dir_entry) * iconIndex, + &entry, sizeof(ico_dir_entry)) != (ssize_t)sizeof(ico_dir_entry)) return B_BAD_VALUE; + entry.SwapToHost(); source.Seek(entry.offset, SEEK_SET); ico_bitmap_header bitmapHeader; if (source.Read(&bitmapHeader, sizeof(ico_bitmap_header)) != (ssize_t)sizeof(ico_bitmap_header)) return B_BAD_VALUE; - entry.SwapToHost(); bitmapHeader.SwapToHost(); if (!bitmapHeader.IsValid()) @@ -609,7 +643,8 @@ ICO::convert_ico_to_bits(BPositionIO &source, BPositionIO &target) status_t -ICO::convert_bits_to_ico(BPositionIO &source, TranslatorBitmap &bitsHeader, BPositionIO &target) +ICO::convert_bits_to_ico(BMessage *settings, BPositionIO &source, + TranslatorBitmap &bitsHeader, BPositionIO &target) { int32 width = bitsHeader.bounds.IntegerWidth() + 1; int32 height = bitsHeader.bounds.IntegerHeight() + 1; diff --git a/src/add-ons/translators/icotranslator/ICO.h b/src/add-ons/translators/icotranslator/ICO.h index a4507dd5d7..c7f29bcb1f 100644 --- a/src/add-ons/translators/icotranslator/ICO.h +++ b/src/add-ons/translators/icotranslator/ICO.h @@ -10,6 +10,8 @@ #include #include +class BMessage; + namespace ICO { @@ -77,9 +79,10 @@ struct rgba32_color { }; -extern status_t identify(BPositionIO &stream, int32 &bitsPerPixel); -extern status_t convert_ico_to_bits(BPositionIO &source, BPositionIO &target); -extern status_t convert_bits_to_ico(BPositionIO &source, TranslatorBitmap &bitsHeader, BPositionIO &target); +extern status_t identify(BMessage *settings, BPositionIO &stream, 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, + TranslatorBitmap &bitsHeader, BPositionIO &target); } // namespace ICO diff --git a/src/add-ons/translators/icotranslator/ICOTranslator.cpp b/src/add-ons/translators/icotranslator/ICOTranslator.cpp index 22cb0ceea5..e97637379e 100644 --- a/src/add-ons/translators/icotranslator/ICOTranslator.cpp +++ b/src/add-ons/translators/icotranslator/ICOTranslator.cpp @@ -13,8 +13,8 @@ #include -#define READ_BUFFER_SIZE 2048 -#define DATA_BUFFER_SIZE 64 +const char *kDocumentCount = "/documentCount"; +const char *kDocumentIndex = "/documentIndex"; // The input formats that this translator supports. @@ -96,7 +96,7 @@ ICOTranslator::DerivedIdentify(BPositionIO *stream, return B_NO_TRANSLATOR; int32 bitsPerPixel; - if (ICO::identify(*stream, bitsPerPixel) != B_OK) + if (ICO::identify(ioExtension, *stream, bitsPerPixel) != B_OK) return B_NO_TRANSLATOR; info->type = ICO_IMAGE_FORMAT; @@ -133,7 +133,7 @@ ICOTranslator::DerivedTranslate(BPositionIO *source, if (status != B_OK) return status; - return ICO::convert_bits_to_ico(*source, bitsHeader, *target); + return ICO::convert_bits_to_ico(ioExtension, *source, bitsHeader, *target); } case 0: @@ -142,7 +142,7 @@ ICOTranslator::DerivedTranslate(BPositionIO *source, if (outType != B_TRANSLATOR_BITMAP) return B_NO_TRANSLATOR; - return ICO::convert_ico_to_bits(*source, *target); + return ICO::convert_ico_to_bits(ioExtension, *source, *target); } default: diff --git a/src/add-ons/translators/icotranslator/ICOTranslator.h b/src/add-ons/translators/icotranslator/ICOTranslator.h index ebc9fbf10b..25a5c8a5ba 100644 --- a/src/add-ons/translators/icotranslator/ICOTranslator.h +++ b/src/add-ons/translators/icotranslator/ICOTranslator.h @@ -18,7 +18,7 @@ #include -#define ICO_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(0, 1, 0) +#define ICO_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(0, 3, 0) #define ICO_IMAGE_FORMAT 'ICO ' #define ICO_IN_QUALITY 0.5 @@ -55,4 +55,8 @@ class ICOTranslator : public BaseTranslator { private: }; +// Extensions that ShowImage supports +extern const char *kDocumentCount; +extern const char *kDocumentIndex; + #endif /* ICO_TRANSLATOR_H */