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