12b05778cSAxel Dörfler/*
22b05778cSAxel Dörfler * Copyright 2005, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
32b05778cSAxel Dörfler * Distributed under the terms of the MIT License.
42b05778cSAxel Dörfler */
52b05778cSAxel Dörfler#ifndef ICO_H
62b05778cSAxel Dörfler#define ICO_H
72b05778cSAxel Dörfler
82b05778cSAxel Dörfler
92b05778cSAxel Dörfler#include <GraphicsDefs.h>
102b05778cSAxel Dörfler#include <BufferIO.h>
112b05778cSAxel Dörfler#include <TranslatorFormats.h>
122b05778cSAxel Dörfler
13fbef8d31SAxel Dörflerclass BMessage;
14fbef8d31SAxel Dörfler
152b05778cSAxel Dörfler
162b05778cSAxel Dörflernamespace ICO {
172b05778cSAxel Dörfler
182b05778cSAxel Dörfler// All ICO structures are written in little endian format
192b05778cSAxel Dörfler
204efb3cc0SAxel Dörflerenum ico_type {
214efb3cc0SAxel Dörfler	kTypeIcon	= 1,
224efb3cc0SAxel Dörfler	kTypeCursor	= 2,
234efb3cc0SAxel Dörfler};
244efb3cc0SAxel Dörfler
252b05778cSAxel Dörflerstruct ico_header {
262b05778cSAxel Dörfler	uint16	reserved;
272b05778cSAxel Dörfler	uint16	type;
282b05778cSAxel Dörfler	uint16	entry_count;
292b05778cSAxel Dörfler
304efb3cc0SAxel Dörfler	bool IsValid() const;
312b05778cSAxel Dörfler	void SwapToHost();
322b05778cSAxel Dörfler	void SwapFromHost();
332b05778cSAxel Dörfler} _PACKED;
342b05778cSAxel Dörfler
352b05778cSAxel Dörflerstruct ico_dir_entry {
362b05778cSAxel Dörfler	uint8	width;
372b05778cSAxel Dörfler	uint8	height;
382b05778cSAxel Dörfler	uint8	color_count;
392b05778cSAxel Dörfler	uint8	reserved;
402b05778cSAxel Dörfler
412b05778cSAxel Dörfler	uint16	planes;
422b05778cSAxel Dörfler	uint16	bits_per_pixel;
432b05778cSAxel Dörfler	uint32	size;
442b05778cSAxel Dörfler	uint32	offset;
452b05778cSAxel Dörfler
462b05778cSAxel Dörfler	bool IsValid() const { return bits_per_pixel <= 24; }
472b05778cSAxel Dörfler	void SwapToHost();
482b05778cSAxel Dörfler	void SwapFromHost();
492b05778cSAxel Dörfler} _PACKED;
502b05778cSAxel Dörfler
512b05778cSAxel Dörflerstruct ico_bitmap_header {
522b05778cSAxel Dörfler	uint32	size;				// size of this structure
532b05778cSAxel Dörfler	uint32	width;
542b05778cSAxel Dörfler	uint32	height;
552b05778cSAxel Dörfler	uint16	planes;
562b05778cSAxel Dörfler	uint16	bits_per_pixel;		// 1, 4, 8, 16, or 24 bits per pixel
572b05778cSAxel Dörfler	uint32	compression;
582b05778cSAxel Dörfler	uint32	image_size;
592b05778cSAxel Dörfler	uint32	x_pixels_per_meter;	// aspect ratio
602b05778cSAxel Dörfler	uint32	y_pixels_per_meter;
612b05778cSAxel Dörfler	uint32	colors_used;		// number of actually used colors
622b05778cSAxel Dörfler	uint32	important_colors;	// number of important colors (zero = all)
632b05778cSAxel Dörfler
642b05778cSAxel Dörfler	bool IsValid() const;
652b05778cSAxel Dörfler	void SwapToHost();
662b05778cSAxel Dörfler	void SwapFromHost();
672b05778cSAxel Dörfler} _PACKED;
682b05778cSAxel Dörfler
6936129be0SAxel Dörfler
7036129be0SAxel Dörfler// More or less accidently, ICO colors are in the same format as
7136129be0SAxel Dörfler// the color information in B_RGBA32 bitmaps
7236129be0SAxel Dörfler
7336129be0SAxel Dörflerstruct rgba32_color {
742b05778cSAxel Dörfler	uint8	blue;
752b05778cSAxel Dörfler	uint8	green;
762b05778cSAxel Dörfler	uint8	red;
772b05778cSAxel Dörfler	uint8	alpha;
782b05778cSAxel Dörfler
792b05778cSAxel Dörfler	inline bool
8036129be0SAxel Dörfler	operator==(const rgba32_color& other) const
812b05778cSAxel Dörfler	{
8279b64912SAxel Dörfler		return red == other.red && green == other.green && blue == other.blue;
832b05778cSAxel Dörfler	}
842b05778cSAxel Dörfler};
852b05778cSAxel Dörfler
8673f41f49SKarsten Heimrichextern bool is_valid_size(int32 size);
874efb3cc0SAxel Dörflerextern status_t identify(BMessage *settings, BPositionIO &stream, uint8 &type, int32 &bitsPerPixel);
88fbef8d31SAxel Dörflerextern status_t convert_ico_to_bits(BMessage *settings, BPositionIO &source, BPositionIO &target);
89fbef8d31SAxel Dörflerextern status_t convert_bits_to_ico(BMessage *settings, BPositionIO &source,
90fbef8d31SAxel Dörfler					TranslatorBitmap &bitsHeader, BPositionIO &target);
912b05778cSAxel Dörfler
922b05778cSAxel Dörfler}	// namespace ICO
932b05778cSAxel Dörfler
942b05778cSAxel Dörfler#endif	/* ICO_H */