From 0994c50f8a48a598adf6861f119994f495dde379 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Mon, 18 May 2009 17:37:15 +0000 Subject: [PATCH] Adding a BIconUtils based HVIFTranslator. It's not very efficient as it does the full work twice in the worst case. Also since it only supports actual HVIF format and not the Icon-O-Matic one directly it is not as useful as one might think. Still it's a start. You could translate from a HVIF file to a PNG using the command line translate tool with it (translate infile outfile 'PNG '). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30792 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/translators/Jamfile | 1 + src/add-ons/translators/hvif/HVIFMain.cpp | 23 +++ .../translators/hvif/HVIFTranslator.cpp | 162 ++++++++++++++++++ src/add-ons/translators/hvif/HVIFTranslator.h | 38 ++++ src/add-ons/translators/hvif/HVIFView.cpp | 53 ++++++ src/add-ons/translators/hvif/HVIFView.h | 19 ++ src/add-ons/translators/hvif/Jamfile | 13 ++ 7 files changed, 309 insertions(+) create mode 100644 src/add-ons/translators/hvif/HVIFMain.cpp create mode 100644 src/add-ons/translators/hvif/HVIFTranslator.cpp create mode 100644 src/add-ons/translators/hvif/HVIFTranslator.h create mode 100644 src/add-ons/translators/hvif/HVIFView.cpp create mode 100644 src/add-ons/translators/hvif/HVIFView.h create mode 100644 src/add-ons/translators/hvif/Jamfile diff --git a/src/add-ons/translators/Jamfile b/src/add-ons/translators/Jamfile index 400ba9aacd..c17625613f 100644 --- a/src/add-ons/translators/Jamfile +++ b/src/add-ons/translators/Jamfile @@ -4,6 +4,7 @@ SubInclude HAIKU_TOP src add-ons translators bmp ; SubInclude HAIKU_TOP src add-ons translators exr ; SubInclude HAIKU_TOP src add-ons translators gif ; SubInclude HAIKU_TOP src add-ons translators hpgs ; +SubInclude HAIKU_TOP src add-ons translators hvif ; SubInclude HAIKU_TOP src add-ons translators ico ; SubInclude HAIKU_TOP src add-ons translators jpeg ; SubInclude HAIKU_TOP src add-ons translators jpeg2000 ; diff --git a/src/add-ons/translators/hvif/HVIFMain.cpp b/src/add-ons/translators/hvif/HVIFMain.cpp new file mode 100644 index 0000000000..e7cfcb0ea8 --- /dev/null +++ b/src/add-ons/translators/hvif/HVIFMain.cpp @@ -0,0 +1,23 @@ +/* + * Copyright 2009, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Michael Lotz, mmlr@mlotz.ch + */ + +#include +#include "HVIFTranslator.h" +#include "TranslatorWindow.h" + +int +main(int argc, char *argv[]) +{ + BApplication application("application/x-vnd.haiku.hvif-translator"); + if (LaunchTranslatorWindow(new HVIFTranslator, "HVIF Settings", + BRect(0, 0, 250, 150)) != B_OK) + return 1; + + application.Run(); + return 0; +} diff --git a/src/add-ons/translators/hvif/HVIFTranslator.cpp b/src/add-ons/translators/hvif/HVIFTranslator.cpp new file mode 100644 index 0000000000..e179a498cb --- /dev/null +++ b/src/add-ons/translators/hvif/HVIFTranslator.cpp @@ -0,0 +1,162 @@ +/* + * Copyright 2009, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Michael Lotz, mmlr@mlotz.ch + */ + +#include "HVIFTranslator.h" +#include "HVIFView.h" + +#include +#include +#include + +#include +#include + +#define HVIF_FORMAT_CODE 'HVIF' +#define HVIF_TRANSLATION_QUALITY 1.0 +#define HVIF_TRANSLATION_CAPABILITY 1.0 + +static translation_format sInputFormats[] = { + { + HVIF_FORMAT_CODE, + B_TRANSLATOR_BITMAP, + HVIF_TRANSLATION_QUALITY, + HVIF_TRANSLATION_CAPABILITY, + "application/x-vnd.Haiku-icon", + "Native Haiku vector icon" + } +}; + + +static translation_format sOutputFormats[] = { + { + B_TRANSLATOR_BITMAP, + B_TRANSLATOR_BITMAP, + 0.4, + 0.4, + "image/x-be-bitmap", + "Be Bitmap Format (HVIFTranslator)" + } +}; + + +BTranslator * +make_nth_translator(int32 n, image_id image, uint32 flags, ...) +{ + if (n == 0) + return new HVIFTranslator(); + return NULL; +} + + +HVIFTranslator::HVIFTranslator() + : BaseTranslator("HVIF Icons", "Native Haiku vector icon translator", + HVIF_TRANSLATOR_VERSION, sInputFormats, + sizeof(sInputFormats) / sizeof(sInputFormats[0]), sOutputFormats, + sizeof(sOutputFormats) / sizeof(sOutputFormats[0]), + "HVIFTranslator_Settings", NULL, 0, B_TRANSLATOR_BITMAP, + HVIF_FORMAT_CODE) +{ +} + + +HVIFTranslator::~HVIFTranslator() +{ +} + + +status_t +HVIFTranslator::DerivedIdentify(BPositionIO *inSource, + const translation_format *inFormat, BMessage *ioExtension, + translator_info *outInfo, uint32 outType) +{ + // TODO: we do the fully work twice! + if (outType != B_TRANSLATOR_BITMAP) + return B_NO_TRANSLATOR; + + // filter out invalid sizes + off_t size = inSource->Seek(0, SEEK_END); + if (size <= 0 || size > 256 * 1024 || inSource->Seek(0, SEEK_SET) != 0) + return B_NO_TRANSLATOR; + + uint8 *buffer = (uint8 *)malloc(size); + if (buffer == NULL) + return B_NO_MEMORY; + + if (inSource->Read(buffer, size) != size) { + free(buffer); + return B_NO_TRANSLATOR; + } + + BBitmap dummy(BRect(0, 0, 1, 1), B_BITMAP_NO_SERVER_LINK, B_RGBA32); + if (BIconUtils::GetVectorIcon(buffer, size, &dummy) != B_OK) { + free(buffer); + return B_NO_TRANSLATOR; + } + + if (outInfo) { + outInfo->type = sInputFormats[0].type; + outInfo->group = sInputFormats[0].group; + outInfo->quality = sInputFormats[0].quality; + outInfo->capability = sInputFormats[0].capability; + strcpy(outInfo->MIME, sInputFormats[0].MIME); + strcpy(outInfo->name, sInputFormats[0].name); + } + + free(buffer); + return B_OK; +} + + +status_t +HVIFTranslator::DerivedTranslate(BPositionIO *inSource, + const translator_info *inInfo, BMessage *ioExtension, uint32 outType, + BPositionIO *outDestination, int32 baseType) +{ + if (outType != B_TRANSLATOR_BITMAP) + return B_NO_TRANSLATOR; + + // filter out invalid sizes + off_t size = inSource->Seek(0, SEEK_END); + if (size <= 0 || size > 256 * 1024 || inSource->Seek(0, SEEK_SET) != 0) + return B_NO_TRANSLATOR; + + uint8 *buffer = (uint8 *)malloc(size); + if (buffer == NULL) + return B_NO_MEMORY; + + if (inSource->Read(buffer, size) != size) { + free(buffer); + return B_NO_TRANSLATOR; + } + + BBitmap rendered(BRect(0, 0, 63, 63), B_BITMAP_NO_SERVER_LINK, B_RGBA32); + if (BIconUtils::GetVectorIcon(buffer, size, &rendered) != B_OK) { + free(buffer); + return B_NO_TRANSLATOR; + } + + BBitmapStream stream(&rendered); + stream.Seek(0, SEEK_SET); + ssize_t read = 0; + + while ((read = stream.Read(buffer, size)) > 0) + outDestination->Write(buffer, read); + + BBitmap *dummy = NULL; + stream.DetachBitmap(&dummy); + free(buffer); + return B_OK; +} + + +BView * +HVIFTranslator::NewConfigView(TranslatorSettings *settings) +{ + return new HVIFView(BRect(0, 0, 250, 150), "HVIFTranslator Settings", + B_FOLLOW_ALL, B_WILL_DRAW); +} diff --git a/src/add-ons/translators/hvif/HVIFTranslator.h b/src/add-ons/translators/hvif/HVIFTranslator.h new file mode 100644 index 0000000000..f84f82fbdd --- /dev/null +++ b/src/add-ons/translators/hvif/HVIFTranslator.h @@ -0,0 +1,38 @@ +/* + * Copyright 2009, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Michael Lotz, mmlr@mlotz.ch + */ +#ifndef HVIF_TRANSLATOR_H +#define HVIF_TRANSLATOR_H + +#include "BaseTranslator.h" + +#define HVIF_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(1, 0, 0) + +class HVIFTranslator : public BaseTranslator { +public: + HVIFTranslator(); + +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); + +protected: +virtual ~HVIFTranslator(); + // this is protected because the object is deleted by the + // Release() function instead of being deleted directly by + // the user +}; + +#endif // HVIF_TRANSLATOR_H diff --git a/src/add-ons/translators/hvif/HVIFView.cpp b/src/add-ons/translators/hvif/HVIFView.cpp new file mode 100644 index 0000000000..7edec75204 --- /dev/null +++ b/src/add-ons/translators/hvif/HVIFView.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2009, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Michael Lotz, mmlr@mlotz.ch + */ + +#include "HVIFView.h" +#include "HVIFTranslator.h" + +#include + +#include + + +HVIFView::HVIFView(const BRect &frame, const char *name, uint32 resizeMode, + uint32 flags) + : BView(frame, name, resizeMode, 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", + "Native Haiku Icon Format Translator"); + stringView->SetFont(be_bold_font); + stringView->ResizeToPreferred(); + AddChild(stringView); + + rect.OffsetBy(0, height + 10); + char version[256]; + snprintf(version, sizeof(version), "Version %d.%d.%d, %s", + int(B_TRANSLATION_MAJOR_VERSION(HVIF_TRANSLATOR_VERSION)), + int(B_TRANSLATION_MINOR_VERSION(HVIF_TRANSLATOR_VERSION)), + int(B_TRANSLATION_REVISION_VERSION(HVIF_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"2009 Haiku Inc."); + stringView->ResizeToPreferred(); + AddChild(stringView); +} diff --git a/src/add-ons/translators/hvif/HVIFView.h b/src/add-ons/translators/hvif/HVIFView.h new file mode 100644 index 0000000000..b8a197b8a0 --- /dev/null +++ b/src/add-ons/translators/hvif/HVIFView.h @@ -0,0 +1,19 @@ +/* + * Copyright 2009, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * Michael Lotz, mmlr@mlotz.ch + */ +#ifndef HVIF_VIEW_H +#define HVIF_VIEW_H + +#include + +class HVIFView : public BView { +public: + HVIFView(const BRect &frame, const char *name, + uint32 resizeMode, uint32 flags); +}; + +#endif // HVIF_VIEW_H diff --git a/src/add-ons/translators/hvif/Jamfile b/src/add-ons/translators/hvif/Jamfile new file mode 100644 index 0000000000..f95a2c5d9d --- /dev/null +++ b/src/add-ons/translators/hvif/Jamfile @@ -0,0 +1,13 @@ +SubDir HAIKU_TOP src add-ons translators hvif ; + +UseLibraryHeaders icon ; + +SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) shared ] ; + +Translator HVIFTranslator : + HVIFMain.cpp + HVIFTranslator.cpp + HVIFView.cpp + : be translation libtranslatorsutils.a + : true +;