{  $Id: icnstypes.pas 27267 2010-09-04 16:28:08Z sekelsenmat $  }
{
 /***************************************************************************
                              IcnsTypes.pas
                              ---------------

 ***************************************************************************/

 *****************************************************************************
 *                                                                           *
 *  This file is part of the Lazarus Component Library (LCL)                 *
 *                                                                           *
 *  See the file COPYING.modifiedLGPL.txt, included in this distribution,    *
 *  for details about the copyright.                                         *
 *                                                                           *
 *  This program is distributed in the hope that it will be useful,          *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
 *                                                                           *
 *****************************************************************************

  Author: Paul Ishenin

  Abstract:
    Types, consts and functions we need to read Mac OS X icon resource files - icns
  Most defines present here were taken from univint package of fpc
}
unit IcnsTypes;

{$mode objfpc}{$H+}

interface

type
  FourCharCode = array[0..3] of char;

type
  TIconFamilyElement = record
    elementType: FourCharCode; {  'ICN#', 'icl8', etc... }
    elementSize: LongInt;      { Size of this element }
  end;

  TIconFamilyResource = record
    resourceType: FourCharCode; {  Always 'icns' }
    resourceSize: LongInt;      {  Total size of this resource }
  end;

const
  kIconFamilyType = 'icns';

  kIconServices512PixelDataARGB: FourCharCode = 'ic09';
  kIconServices256PixelDataARGB: FourCharCode = 'ic08';
  kThumbnail32BitData          : FourCharCode = 'it32';
  kThumbnail8BitMask           : FourCharCode = 't8mk';
  kHuge1BitMask                : FourCharCode = 'ich#';
  kHuge4BitData                : FourCharCode = 'ich4';
  kHuge8BitData                : FourCharCode= 'ich8';
  kHuge32BitData               : FourCharCode= 'ih32';
  kHuge8BitMask                : FourCharCode= 'h8mk';
  {	 The following icon types can be used as a resource type 	}
  {	 or as an icon element type inside a 'icns' icon family 	}
  kLarge1BitMask               : FourCharCode= 'ICN#';
  kLarge4BitData               : FourCharCode= 'icl4';
  kLarge8BitData               : FourCharCode= 'icl8';
  kLarge32BitData              : FourCharCode= 'il32';
  kLarge8BitMask               : FourCharCode= 'l8mk';
  kSmall1BitMask               : FourCharCode= 'ics#';
  kSmall4BitData               : FourCharCode= 'ics4';
  kSmall8BitData               : FourCharCode= 'ics8';
  kSmall32BitData              : FourCharCode= 'is32';
  kSmall8BitMask               : FourCharCode= 's8mk';
  kMini1BitMask                : FourCharCode= 'icm#';
  kMini4BitData                : FourCharCode= 'icm4';
  kMini8BitData                : FourCharCode= 'icm8';

type
  // from lower to higher
  TicnsIconType =
  (
    iitNone,
    // data icons
    iitMini4BitData,
    iitMini8BitData,
    iitSmall4BitData,
    iitSmall8BitData,
    iitSmall32BitData,
    iitLarge4BitData,
    iitLarge8BitData,
    iitLarge32BitData,
    iitHuge4BitData,
    iitHuge8BitData,
    iitHuge32BitData,
    iitThumbnail32BitData,
    // mask icons
    iitMini1BitMask,
    iitSmall1BitMask,
    iitSmall8BitMask,
    iitLarge1BitMask,
    iitLarge8BitMask,
    iitHuge1BitMask,
    iitHuge8BitMask,
    iitThumbnail8BitMask,
    // alpha icons
    iit256PixelDataARGB,
    iit512PixelDataARGB
  );
  
  TicnsIconTypes = set of TicnsIconType;
  
  TicnsIconInfo = record
    Width: Integer;
    Height: Integer;
    Depth: Integer;
  end;

const
  icnsDataTypes =
    [
      iitMini4BitData, iitMini8BitData, iitSmall4BitData, iitSmall8BitData,
      iitSmall32BitData, iitLarge4BitData, iitLarge8BitData, iitLarge32BitData,
      iitHuge4BitData, iitHuge8BitData, iitHuge32BitData, iitThumbnail32BitData
    ];
  icnsMaskTypes =
    [
      iitMini1BitMask, iitSmall1BitMask, iitSmall8BitMask, iitLarge1BitMask,
      iitLarge8BitMask, iitHuge1BitMask, iitHuge8BitMask, iitThumbnail8BitMask
    ];
  icnsRGB =
    [
      iitSmall32BitData, iitLarge32BitData, iitHuge32BitData, iitThumbnail32BitData
    ];
  icnsWithAlpha =
    [
      iit256PixelDataARGB, iit512PixelDataARGB
    ];

  icnsIconTypeInfo: array[TicnsIconType] of TicnsIconInfo =
  (
 { iitNone               } (Width: 000; Height: 000; Depth: 00),
 { iitMini4BitData       } (Width: 016; Height: 012; Depth: 04),
 { iitMini8BitData       } (Width: 016; Height: 012; Depth: 08),
 { iitSmall4BitData      } (Width: 016; Height: 016; Depth: 04),
 { iitSmall8BitData      } (Width: 016; Height: 016; Depth: 08),
 { iitSmall32BitData     } (Width: 016; Height: 016; Depth: 32),
 { iitLarge4BitData      } (Width: 032; Height: 032; Depth: 04),
 { iitLarge8BitData      } (Width: 032; Height: 032; Depth: 08),
 { iitLarge32BitData     } (Width: 032; Height: 032; Depth: 32),
 { iitHuge4BitData       } (Width: 048; Height: 048; Depth: 04),
 { iitHuge8BitData       } (Width: 048; Height: 048; Depth: 08),
 { iitHuge32BitData      } (Width: 048; Height: 048; Depth: 32),
 { iitThumbnail32BitData } (Width: 128; Height: 128; Depth: 32),
 { iitMini1BitMask       } (Width: 016; Height: 012; Depth: 01),
 { iitSmall1BitMask      } (Width: 016; Height: 016; Depth: 01),
 { iitSmall8BitMask      } (Width: 016; Height: 016; Depth: 08),
 { iitLarge1BitMask      } (Width: 032; Height: 032; Depth: 01),
 { iitLarge8BitMask      } (Width: 032; Height: 032; Depth: 08),
 { iitHuge1BitMask       } (Width: 048; Height: 048; Depth: 01),
 { iitHuge8BitMask       } (Width: 048; Height: 048; Depth: 08),
 { iitThumbnail8BitMask  } (Width: 128; Height: 128; Depth: 08),
 { iit256PixelDataARGB   } (Width: 256; Height: 256; Depth: 32),
 { iit512PixelDataARGB   } (Width: 512; Height: 512; Depth: 32)
  );
  
  icnsMaskToImageMap: array[iitMini1BitMask..iitThumbnail8BitMask] of TicnsIconTypes =
  (
 { iitMini1BitMask       } [iitMini4BitData, iitMini8BitData],
 { iitSmall1BitMask      } [iitSmall4BitData, iitSmall8BitData, iitSmall32BitData],
 { iitSmall8BitMask      } [iitSmall4BitData, iitSmall8BitData, iitSmall32BitData],
 { iitLarge1BitMask      } [iitLarge4BitData, iitLarge8BitData, iitLarge32BitData],
 { iitLarge8BitMask      } [iitLarge4BitData, iitLarge8BitData, iitLarge32BitData],
 { iitHuge1BitMask       } [iitHuge4BitData, iitHuge8BitData, iitHuge32BitData],
 { iitHuge8BitMask       } [iitHuge4BitData, iitHuge8BitData, iitHuge32BitData],
 { iitThumbnail8BitMask  } [iitThumbnail32BitData]
  );

function GetIcnsIconType(const StrIconType: FourCharCode): TicnsIconType;

// Returns proper TicnsIconType, or iitNone, if Width/Height is incorrect
function GetDataTypeRGB(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
function GetMaskType8bit(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;

implementation

function GetDataTypeRGB(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
begin
  Result := iitNone;
  if Width <> Height then Exit;
  
  case Width of
    16: begin
      Result := iitSmall32BitData;
      FourChar := kSmall32BitData;
    end;
    32: begin
      Result := iitLarge32BitData;
      FourChar := kLarge32BitData;
    end;
    48: begin
      Result := iitHuge32BitData;
      FourChar := kHuge32BitData;
    end;      
    128: begin
      Result := iitThumbnail32BitData;
      FourChar := kThumbnail32BitData;
    end;
    256: begin
      Result := iit256PixelDataARGB;
      FourChar :=  kIconServices256PixelDataARGB;
    end;
    512: begin
      Result := iit512PixelDataARGB;
      FourChar := kIconServices512PixelDataARGB;
    end;
  end; 
end;

function GetMaskType8bit(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
begin
  Result := iitNone;
  if Width <> Height then Exit;
  
  case Width of
    16: begin
      Result := iitSmall8BitMask;
      FourChar := kSmall8BitMask;
    end;
    32: begin
      Result := iitLarge8BitMask;
      FourChar := kLarge8BitMask;
    end;
    48: begin
      Result := iitHuge8BitMask;
      FourChar := kHuge8BitMask;
    end;
    128: begin
      Result := iitThumbnail8BitMask;
      FourChar := kThumbnail8BitMask;
    end;
  end; 
end;

function GetIcnsIconType(const StrIconType: FourCharCode): TicnsIconType;
begin
  Result := iitNone;

  if StrIconType = kMini4BitData then
    exit(iitMini4BitData);
    
  if StrIconType = kMini8BitData then
    exit(iitMini8BitData);

  if StrIconType = kSmall4BitData then
    exit(iitSmall4BitData);

  if StrIconType = kSmall8BitData then
    exit(iitSmall8BitData);

  if StrIconType = kSmall32BitData then
    exit(iitSmall32BitData);

  if StrIconType = kLarge4BitData then
    exit(iitLarge4BitData);

  if StrIconType = kLarge8BitData then
    exit(iitLarge8BitData);

  if StrIconType = kLarge32BitData then
    exit(iitLarge32BitData);

  if StrIconType = kHuge4BitData then
    exit(iitHuge4BitData);

  if StrIconType = kHuge8BitData then
    exit(iitHuge8BitData);

  if StrIconType = kHuge32BitData then
    exit(iitHuge32BitData);
    
  if StrIconType = kThumbnail32BitData then
    exit(iitThumbnail32BitData);

  if StrIconType = kMini1BitMask then
    exit(iitMini1BitMask);

  if StrIconType = kSmall1BitMask then
    exit(iitSmall1BitMask);

  if StrIconType = kSmall8BitMask then
    exit(iitSmall8BitMask);

  if StrIconType = kLarge1BitMask then
    exit(iitLarge1BitMask);

  if StrIconType = kLarge8BitMask then
    exit(iitLarge8BitMask);

  if StrIconType = kHuge1BitMask then
    exit(iitHuge1BitMask);

  if StrIconType = kHuge8BitMask then
    exit(iitHuge8BitMask);

  if StrIconType = kThumbnail8BitMask then
    exit(iitThumbnail8BitMask);

  if StrIconType = kIconServices256PixelDataARGB then
    exit(iit256PixelDataARGB);

  if StrIconType = kIconServices512PixelDataARGB then
    exit(iit512PixelDataARGB);
end;

end.

