1 {  $Id: icnstypes.pas 41387 2013-05-24 18:30:06Z juha $  }
2 {
3  /***************************************************************************
4                               IcnsTypes.pas
5                               ---------------
6 
7  ***************************************************************************/
8 
9  *****************************************************************************
10   This file is part of the Lazarus Component Library (LCL)
11 
12   See the file COPYING.modifiedLGPL.txt, included in this distribution,
13   for details about the license.
14  *****************************************************************************
15 
16   Author: Paul Ishenin
17 
18   Abstract:
19     Types, consts and functions we need to read Mac OS X icon resource files - icns
20     Most defines present here were taken from univint package of fpc
21 }
22 unit IcnsTypes;
23 
24 {$mode objfpc}{$H+}
25 
26 interface
27 
28 type
29   FourCharCode = array[0..3] of char;
30 
31 type
32   TIconFamilyElement = record
33     elementType: FourCharCode; {  'ICN#', 'icl8', etc... }
34     elementSize: LongInt;      { Size of this element }
35   end;
36 
37   TIconFamilyResource = record
38     resourceType: FourCharCode; {  Always 'icns' }
39     resourceSize: LongInt;      {  Total size of this resource }
40   end;
41 
42 const
43   kIconFamilyType = 'icns';
44 
45   kIconServices512PixelDataARGB: FourCharCode = 'ic09';
46   kIconServices256PixelDataARGB: FourCharCode = 'ic08';
47   kThumbnail32BitData          : FourCharCode = 'it32';
48   kThumbnail8BitMask           : FourCharCode = 't8mk';
49   kHuge1BitMask                : FourCharCode = 'ich#';
50   kHuge4BitData                : FourCharCode = 'ich4';
51   kHuge8BitData                : FourCharCode= 'ich8';
52   kHuge32BitData               : FourCharCode= 'ih32';
53   kHuge8BitMask                : FourCharCode= 'h8mk';
54   {	 The following icon types can be used as a resource type 	}
55   {	 or as an icon element type inside a 'icns' icon family 	}
56   kLarge1BitMask               : FourCharCode= 'ICN#';
57   kLarge4BitData               : FourCharCode= 'icl4';
58   kLarge8BitData               : FourCharCode= 'icl8';
59   kLarge32BitData              : FourCharCode= 'il32';
60   kLarge8BitMask               : FourCharCode= 'l8mk';
61   kSmall1BitMask               : FourCharCode= 'ics#';
62   kSmall4BitData               : FourCharCode= 'ics4';
63   kSmall8BitData               : FourCharCode= 'ics8';
64   kSmall32BitData              : FourCharCode= 'is32';
65   kSmall8BitMask               : FourCharCode= 's8mk';
66   kMini1BitMask                : FourCharCode= 'icm#';
67   kMini4BitData                : FourCharCode= 'icm4';
68   kMini8BitData                : FourCharCode= 'icm8';
69 
70 type
71   // from lower to higher
72   TicnsIconType =
73   (
74     iitNone,
75     // data icons
76     iitMini4BitData,
77     iitMini8BitData,
78     iitSmall4BitData,
79     iitSmall8BitData,
80     iitSmall32BitData,
81     iitLarge4BitData,
82     iitLarge8BitData,
83     iitLarge32BitData,
84     iitHuge4BitData,
85     iitHuge8BitData,
86     iitHuge32BitData,
87     iitThumbnail32BitData,
88     // mask icons
89     iitMini1BitMask,
90     iitSmall1BitMask,
91     iitSmall8BitMask,
92     iitLarge1BitMask,
93     iitLarge8BitMask,
94     iitHuge1BitMask,
95     iitHuge8BitMask,
96     iitThumbnail8BitMask,
97     // alpha icons
98     iit256PixelDataARGB,
99     iit512PixelDataARGB
100   );
101 
102   TicnsIconTypes = set of TicnsIconType;
103 
104   TicnsIconInfo = record
105     Width: Integer;
106     Height: Integer;
107     Depth: Integer;
108   end;
109 
110 const
111   icnsDataTypes =
112     [
113       iitMini4BitData, iitMini8BitData, iitSmall4BitData, iitSmall8BitData,
114       iitSmall32BitData, iitLarge4BitData, iitLarge8BitData, iitLarge32BitData,
115       iitHuge4BitData, iitHuge8BitData, iitHuge32BitData, iitThumbnail32BitData
116     ];
117   icnsMaskTypes =
118     [
119       iitMini1BitMask, iitSmall1BitMask, iitSmall8BitMask, iitLarge1BitMask,
120       iitLarge8BitMask, iitHuge1BitMask, iitHuge8BitMask, iitThumbnail8BitMask
121     ];
122   icnsRGB =
123     [
124       iitSmall32BitData, iitLarge32BitData, iitHuge32BitData, iitThumbnail32BitData
125     ];
126   icnsWithAlpha =
127     [
128       iit256PixelDataARGB, iit512PixelDataARGB
129     ];
130 
131   icnsIconTypeInfo: array[TicnsIconType] of TicnsIconInfo =
132   (
133  { iitNone               } (Width: 000; Height: 000; Depth: 00),
134  { iitMini4BitData       } (Width: 016; Height: 012; Depth: 04),
135  { iitMini8BitData       } (Width: 016; Height: 012; Depth: 08),
136  { iitSmall4BitData      } (Width: 016; Height: 016; Depth: 04),
137  { iitSmall8BitData      } (Width: 016; Height: 016; Depth: 08),
138  { iitSmall32BitData     } (Width: 016; Height: 016; Depth: 32),
139  { iitLarge4BitData      } (Width: 032; Height: 032; Depth: 04),
140  { iitLarge8BitData      } (Width: 032; Height: 032; Depth: 08),
141  { iitLarge32BitData     } (Width: 032; Height: 032; Depth: 32),
142  { iitHuge4BitData       } (Width: 048; Height: 048; Depth: 04),
143  { iitHuge8BitData       } (Width: 048; Height: 048; Depth: 08),
144  { iitHuge32BitData      } (Width: 048; Height: 048; Depth: 32),
145  { iitThumbnail32BitData } (Width: 128; Height: 128; Depth: 32),
146  { iitMini1BitMask       } (Width: 016; Height: 012; Depth: 01),
147  { iitSmall1BitMask      } (Width: 016; Height: 016; Depth: 01),
148  { iitSmall8BitMask      } (Width: 016; Height: 016; Depth: 08),
149  { iitLarge1BitMask      } (Width: 032; Height: 032; Depth: 01),
150  { iitLarge8BitMask      } (Width: 032; Height: 032; Depth: 08),
151  { iitHuge1BitMask       } (Width: 048; Height: 048; Depth: 01),
152  { iitHuge8BitMask       } (Width: 048; Height: 048; Depth: 08),
153  { iitThumbnail8BitMask  } (Width: 128; Height: 128; Depth: 08),
154  { iit256PixelDataARGB   } (Width: 256; Height: 256; Depth: 32),
155  { iit512PixelDataARGB   } (Width: 512; Height: 512; Depth: 32)
156   );
157 
158   icnsMaskToImageMap: array[iitMini1BitMask..iitThumbnail8BitMask] of TicnsIconTypes =
159   (
160  { iitMini1BitMask       } [iitMini4BitData, iitMini8BitData],
161  { iitSmall1BitMask      } [iitSmall4BitData, iitSmall8BitData, iitSmall32BitData],
162  { iitSmall8BitMask      } [iitSmall4BitData, iitSmall8BitData, iitSmall32BitData],
163  { iitLarge1BitMask      } [iitLarge4BitData, iitLarge8BitData, iitLarge32BitData],
164  { iitLarge8BitMask      } [iitLarge4BitData, iitLarge8BitData, iitLarge32BitData],
165  { iitHuge1BitMask       } [iitHuge4BitData, iitHuge8BitData, iitHuge32BitData],
166  { iitHuge8BitMask       } [iitHuge4BitData, iitHuge8BitData, iitHuge32BitData],
167  { iitThumbnail8BitMask  } [iitThumbnail32BitData]
168   );
169 
GetIcnsIconTypenull170 function GetIcnsIconType(const StrIconType: FourCharCode): TicnsIconType;
171 
172 // Returns proper TicnsIconType, or iitNone, if Width/Height is incorrect
GetDataTypeRGBnull173 function GetDataTypeRGB(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
GetMaskType8bitnull174 function GetMaskType8bit(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
175 
176 implementation
177 
GetDataTypeRGBnull178 function GetDataTypeRGB(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
179 begin
180   Result := iitNone;
181   if Width <> Height then Exit;
182 
183   case Width of
184     16: begin
185       Result := iitSmall32BitData;
186       FourChar := kSmall32BitData;
187     end;
188     32: begin
189       Result := iitLarge32BitData;
190       FourChar := kLarge32BitData;
191     end;
192     48: begin
193       Result := iitHuge32BitData;
194       FourChar := kHuge32BitData;
195     end;
196     128: begin
197       Result := iitThumbnail32BitData;
198       FourChar := kThumbnail32BitData;
199     end;
200     256: begin
201       Result := iit256PixelDataARGB;
202       FourChar :=  kIconServices256PixelDataARGB;
203     end;
204     512: begin
205       Result := iit512PixelDataARGB;
206       FourChar := kIconServices512PixelDataARGB;
207     end;
208   end;
209 end;
210 
GetMaskType8bitnull211 function GetMaskType8bit(Width, Height: Integer; var FourChar: FourCharCode): TicnsIconType;
212 begin
213   Result := iitNone;
214   if Width <> Height then Exit;
215 
216   case Width of
217     16: begin
218       Result := iitSmall8BitMask;
219       FourChar := kSmall8BitMask;
220     end;
221     32: begin
222       Result := iitLarge8BitMask;
223       FourChar := kLarge8BitMask;
224     end;
225     48: begin
226       Result := iitHuge8BitMask;
227       FourChar := kHuge8BitMask;
228     end;
229     128: begin
230       Result := iitThumbnail8BitMask;
231       FourChar := kThumbnail8BitMask;
232     end;
233   end;
234 end;
235 
GetIcnsIconTypenull236 function GetIcnsIconType(const StrIconType: FourCharCode): TicnsIconType;
237 begin
238   Result := iitNone;
239 
240   if StrIconType = kMini4BitData then
241     exit(iitMini4BitData);
242 
243   if StrIconType = kMini8BitData then
244     exit(iitMini8BitData);
245 
246   if StrIconType = kSmall4BitData then
247     exit(iitSmall4BitData);
248 
249   if StrIconType = kSmall8BitData then
250     exit(iitSmall8BitData);
251 
252   if StrIconType = kSmall32BitData then
253     exit(iitSmall32BitData);
254 
255   if StrIconType = kLarge4BitData then
256     exit(iitLarge4BitData);
257 
258   if StrIconType = kLarge8BitData then
259     exit(iitLarge8BitData);
260 
261   if StrIconType = kLarge32BitData then
262     exit(iitLarge32BitData);
263 
264   if StrIconType = kHuge4BitData then
265     exit(iitHuge4BitData);
266 
267   if StrIconType = kHuge8BitData then
268     exit(iitHuge8BitData);
269 
270   if StrIconType = kHuge32BitData then
271     exit(iitHuge32BitData);
272 
273   if StrIconType = kThumbnail32BitData then
274     exit(iitThumbnail32BitData);
275 
276   if StrIconType = kMini1BitMask then
277     exit(iitMini1BitMask);
278 
279   if StrIconType = kSmall1BitMask then
280     exit(iitSmall1BitMask);
281 
282   if StrIconType = kSmall8BitMask then
283     exit(iitSmall8BitMask);
284 
285   if StrIconType = kLarge1BitMask then
286     exit(iitLarge1BitMask);
287 
288   if StrIconType = kLarge8BitMask then
289     exit(iitLarge8BitMask);
290 
291   if StrIconType = kHuge1BitMask then
292     exit(iitHuge1BitMask);
293 
294   if StrIconType = kHuge8BitMask then
295     exit(iitHuge8BitMask);
296 
297   if StrIconType = kThumbnail8BitMask then
298     exit(iitThumbnail8BitMask);
299 
300   if StrIconType = kIconServices256PixelDataARGB then
301     exit(iit256PixelDataARGB);
302 
303   if StrIconType = kIconServices512PixelDataARGB then
304     exit(iit512PixelDataARGB);
305 end;
306 
307 end.
308 
309