* Copyright 2005-2006, Axel DΓΆrfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "ICOTranslator.h"
#include <Catalog.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Catalog.h>
#include "ConfigView.h"
#include "ICO.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "ICOTranslator"
const char *kDocumentCount = "/documentCount";
const char *kDocumentIndex = "/documentIndex";
#define kICOMimeType "image/vnd.microsoft.icon"
#define kICOName "Windows icon"
static const translation_format sInputFormats[] = {
{
ICO_IMAGE_FORMAT,
B_TRANSLATOR_BITMAP,
ICO_IN_QUALITY,
ICO_IN_CAPABILITY,
kICOMimeType,
kICOName
},
{
B_TRANSLATOR_BITMAP,
B_TRANSLATOR_BITMAP,
BITS_IN_QUALITY,
BITS_IN_CAPABILITY,
"image/x-be-bitmap",
"Be Bitmap Format (ICOTranslator)"
},
};
static const translation_format sOutputFormats[] = {
{
ICO_IMAGE_FORMAT,
B_TRANSLATOR_BITMAP,
ICO_OUT_QUALITY,
ICO_OUT_CAPABILITY,
kICOMimeType,
kICOName
},
{
B_TRANSLATOR_BITMAP,
B_TRANSLATOR_BITMAP,
BITS_OUT_QUALITY,
BITS_OUT_CAPABILITY,
"image/x-be-bitmap",
"Be Bitmap Format (ICOTranslator)"
},
};
static const TranSetting sDefaultSettings[] = {
{B_TRANSLATOR_EXT_HEADER_ONLY, TRAN_SETTING_BOOL, false},
{B_TRANSLATOR_EXT_DATA_ONLY, TRAN_SETTING_BOOL, false}
};
const uint32 kNumInputFormats = sizeof(sInputFormats) / sizeof(translation_format);
const uint32 kNumOutputFormats = sizeof(sOutputFormats) / sizeof(translation_format);
const uint32 kNumDefaultSettings = sizeof(sDefaultSettings) / sizeof(TranSetting);
ICOTranslator::ICOTranslator()
: BaseTranslator(B_TRANSLATE("Windows icons"),
B_TRANSLATE("Windows icon translator"),
ICO_TRANSLATOR_VERSION,
sInputFormats, kNumInputFormats,
sOutputFormats, kNumOutputFormats,
"ICOTranslator_Settings",
sDefaultSettings, kNumDefaultSettings,
B_TRANSLATOR_BITMAP, ICO_IMAGE_FORMAT)
{
}
ICOTranslator::~ICOTranslator()
{
}
status_t
ICOTranslator::DerivedIdentify(BPositionIO *stream,
const translation_format *format, BMessage *ioExtension,
translator_info *info, uint32 outType)
{
if (!outType)
outType = B_TRANSLATOR_BITMAP;
if (outType != B_TRANSLATOR_BITMAP && outType != ICO_IMAGE_FORMAT)
return B_NO_TRANSLATOR;
int32 bitsPerPixel;
uint8 type;
if (ICO::identify(ioExtension, *stream, type, bitsPerPixel) != B_OK)
return B_NO_TRANSLATOR;
info->type = ICO_IMAGE_FORMAT;
info->group = B_TRANSLATOR_BITMAP;
info->quality = ICO_IN_QUALITY;
info->capability = ICO_IN_CAPABILITY;
snprintf(info->name, sizeof(info->name), B_TRANSLATE("Windows %s %ld bit image"),
type == ICO::kTypeIcon ? B_TRANSLATE("Icon") : B_TRANSLATE("Cursor"),
(long int)bitsPerPixel);
strcpy(info->MIME, kICOMimeType);
return B_OK;
}
status_t
ICOTranslator::DerivedTranslate(BPositionIO *source,
const translator_info *info, BMessage *ioExtension,
uint32 outType, BPositionIO *target, int32 baseType)
{
if (!outType)
outType = B_TRANSLATOR_BITMAP;
if (outType != B_TRANSLATOR_BITMAP && outType != ICO_IMAGE_FORMAT)
return B_NO_TRANSLATOR;
switch (baseType) {
case 1:
{
if (outType != ICO_IMAGE_FORMAT)
return B_NO_TRANSLATOR;
TranslatorBitmap bitsHeader;
status_t status = identify_bits_header(source, NULL, &bitsHeader);
if (status != B_OK)
return status;
return ICO::convert_bits_to_ico(ioExtension, *source, bitsHeader, *target);
}
case 0:
{
if (outType != B_TRANSLATOR_BITMAP)
return B_NO_TRANSLATOR;
return ICO::convert_ico_to_bits(ioExtension, *source, *target);
}
default:
return B_NO_TRANSLATOR;
}
}
status_t
ICOTranslator::DerivedCanHandleImageSize(float width, float height) const
{
if (!ICO::is_valid_size((int)width) || !ICO::is_valid_size((int)height))
return B_NO_TRANSLATOR;
return B_OK;
}
BView *
ICOTranslator::NewConfigView(TranslatorSettings *settings)
{
return new ConfigView();
}
BTranslator *
make_nth_translator(int32 n, image_id you, uint32 flags, ...)
{
if (n != 0)
return NULL;
return new ICOTranslator();
}