Rev 527 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
373 | daniel-mar | 1 | #!/usr/bin/php |
2 | <?php |
||
3 | |||
378 | daniel-mar | 4 | /* |
5 | This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop |
||
536 | daniel-mar | 6 | Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.net |
488 | daniel-mar | 7 | Copyright (C) 2018-2022 Daniel Marschall, ViaThinkSoft |
378 | daniel-mar | 8 | |
9 | This program is free software; you can redistribute it and/or modify |
||
10 | it under the terms of the GNU General Public License as published by |
||
11 | the Free Software Foundation; either version 2 of the License, or |
||
12 | (at your option) any later version. |
||
13 | |||
14 | This program is distributed in the hope that it will be useful, |
||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
17 | GNU General Public License for more details. |
||
18 | |||
19 | You should have received a copy of the GNU General Public License |
||
20 | along with this program; if not, write to the Free Software |
||
21 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
22 | */ |
||
23 | |||
24 | // This script generates the documentation file os_types.md |
||
25 | |||
527 | daniel-mar | 26 | define('DESC_WIDTH', 60); |
373 | daniel-mar | 27 | define('VENDOR_WIDTH', 15); |
28 | |||
29 | ob_start(); |
||
30 | |||
31 | echo "OSTypes used in Filter Foundry\n"; |
||
32 | echo "==============================\n"; |
||
33 | echo "\n"; |
||
34 | |||
35 | echo "Note: According to the Photoshop API guide:\n"; |
||
36 | echo "- All IDs starting with an uppercase letter are reserved by Adobe.\n"; |
||
37 | echo "- All IDs that are all uppercase are reserved by Apple.\n"; |
||
38 | echo "- All IDs that are all lowercase are reserved by Apple.\n"; |
||
39 | echo "- This leaves all IDs that begin with a lowercase letter and have at least\n"; |
||
40 | echo " one uppercase letter for you and other plug-in developers.\n"; |
||
41 | echo "\n"; |
||
42 | |||
43 | # ------------------------------------------------------------------------------ |
||
44 | |||
45 | ostype_header("AppleScript related"); |
||
46 | ostype_info('tELE', 'Plugin Suite ID', 'Telegraphics'); |
||
47 | ostype_info('Fltr', 'Class ID "Filter" (PITerminology.h:eventFilter)', 'Adobe'); |
||
527 | daniel-mar | 48 | ostype_info('fiFo', 'Event ID (for non-standalone filters*)', 'Telegraphics'); |
49 | ostype_info('xprR', 'Expression "red channel" (for non-standalone filters*)', 'Telegraphics'); |
||
50 | ostype_info('xprG', 'Expression "green channel" (for non-standalone filters*)', 'Telegraphics'); |
||
51 | ostype_info('xprB', 'Expression "blue channel" (for non-standalone filters*)', 'Telegraphics'); |
||
52 | ostype_info('xprA', 'Expression "alpha channel" (for non-standalone filters*)', 'Telegraphics'); |
||
53 | ostype_info('cTl0', 'Slider 0 (for non-standalone filters*)', 'Telegraphics'); |
||
54 | ostype_info('cTl1', 'Slider 1 (for non-standalone filters*)', 'Telegraphics'); |
||
55 | ostype_info('cTl2', 'Slider 2 (for non-standalone filters*)', 'Telegraphics'); |
||
56 | ostype_info('cTl3', 'Slider 3 (for non-standalone filters*)', 'Telegraphics'); |
||
57 | ostype_info('cTl4', 'Slider 4 (for non-standalone filters*)', 'Telegraphics'); |
||
58 | ostype_info('cTl5', 'Slider 5 (for non-standalone filters*)', 'Telegraphics'); |
||
59 | ostype_info('cTl6', 'Slider 6 (for non-standalone filters*)', 'Telegraphics'); |
||
60 | ostype_info('cTl7', 'Slider 7 (for non-standalone filters*)', 'Telegraphics'); |
||
526 | daniel-mar | 61 | ostype_info('long', 'Data type integer', 'Apple'); |
62 | ostype_info('TEXT', 'Data type string', 'Apple'); |
||
63 | ostype_info('null', 'noReply', 'Apple'); |
||
64 | ostype_info('#ImR', 'typeImageReference', 'Adobe'); |
||
373 | daniel-mar | 65 | ostype_footer(); |
66 | |||
527 | daniel-mar | 67 | echo "Note: For standalone plugins, these FourCC codes marked with * will be replaced "; |
68 | echo "by different hashes based on the category and title of the standalone "; |
||
69 | echo "filter (except `tELE` and `Fltr`).\n\n"; |
||
375 | daniel-mar | 70 | |
71 | // TODO: also display Windows types, e.g. RT_RCDATA = 'DATA' ? |
||
72 | ostype_header("Resource fork types"); |
||
374 | daniel-mar | 73 | ostype_info('aete', 'Apple Event Terminology', 'Apple'); // https://developer.apple.com/library/archive/documentation/mac/pdf/Interapplication_Communication/AE_Term_Resources.pdf |
375 | daniel-mar | 74 | //ostype_info('PiMI', 'Plug-in Meta Information', 'Adobe'); |
75 | ostype_info('PiPL', 'PlugIn Property List', 'Adobe'); |
||
76 | ostype_info('DATA', 'Generic data (replaced by `tpLT` and `obFS`)', '?'); |
||
488 | daniel-mar | 77 | ostype_info('tpLT', 'Template for standalone filter resources', 'ViaThinkSoft'); |
78 | ostype_info('obFS', 'Filter Foundry obfuscated data', 'ViaThinkSoft'); |
||
373 | daniel-mar | 79 | ostype_info('PARM', 'Filter Factory parameter data (PARM.h)', 'Adobe'); |
375 | daniel-mar | 80 | // https://developer.apple.com/library/archive/documentation/mac/pdf/ResEditReference.pdf |
373 | daniel-mar | 81 | // https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf |
375 | daniel-mar | 82 | ostype_info('ALRT', 'Alert (only Macintosh build)', 'Apple'); |
83 | ostype_info('DITL', 'Dialog template (only Macintosh build)', 'Apple'); |
||
84 | ostype_info('CNTL', 'Control (only Macintosh build)', 'Apple'); |
||
85 | ostype_info('DLOG', 'Dialog (only Macintosh build)', 'Apple'); |
||
86 | ostype_info('dlgx', 'Extended Dialog (only Macintosh build)', 'Apple'); |
||
87 | ostype_info('dftb', 'Dialog Font Table (only Macintosh build)', 'Apple'); |
||
88 | ostype_info('PICT', 'Picture (only Macintosh build)', 'Apple'); |
||
89 | ostype_info('CURS', 'Cursor (only Macintosh build)', 'Apple'); |
||
90 | ostype_info('vers', 'Version number (only Macintosh build)', 'Apple'); |
||
373 | daniel-mar | 91 | ostype_footer(); |
92 | |||
519 | daniel-mar | 93 | ostype_header("File type"); |
94 | ostype_info('8BFM', 'Adobe Filter module (used in `kind` PiPL property)', 'Adobe'); |
||
95 | ostype_info('TEXT', 'Text file', 'Apple'); |
||
96 | ostype_footer(); |
||
97 | |||
375 | daniel-mar | 98 | ostype_header("Creator codes"); |
99 | ostype_info('8BIM', 'Adobe Photoshop', 'Adobe'); |
||
519 | daniel-mar | 100 | ostype_info('ttxt', 'Text file', 'Apple'); |
101 | ostype_info('pled', 'Property List Editor', 'Apple'); |
||
527 | daniel-mar | 102 | //ostype_info('ViaT', 'ViaThinkSoft', 'ViaThinkSoft'); |
375 | daniel-mar | 103 | ostype_footer(); |
373 | daniel-mar | 104 | |
375 | daniel-mar | 105 | pipl_property_header("PlugIn Property List (PiPL) properties"); |
106 | pipl_property_info('8BIM', 'catg', 'PiPL property "Category"', 'Adobe'); |
||
107 | pipl_property_info('8BIM', 'name', 'PiPL property "Name"', 'Adobe'); |
||
519 | daniel-mar | 108 | pipl_property_info('8BIM', 'cmpt', 'PiPL property "Component" (PIPL.r)', 'Adobe'); |
109 | pipl_property_info('8BIM', 'hstm', 'PiPL property "HasTerminology" (PIPL.r)', 'Adobe'); |
||
375 | daniel-mar | 110 | pipl_property_info('8BIM', 'wx86', 'PiPL property PIWin32X86CodeProperty (PIGeneral.h)', 'Adobe'); |
111 | pipl_property_info('8BIM', '8664', 'PiPL property PIWin64X86CodeProperty (PIGeneral.h)', 'Adobe'); |
||
112 | pipl_property_info('8BIM', 'kind', 'PiPL property "Kind" (PIPL.r)', 'Adobe'); |
||
519 | daniel-mar | 113 | pipl_property_info('8BIM', 'prty', 'PiPL property "Priority" (PIPL.r)', 'Adobe'); |
375 | daniel-mar | 114 | pipl_property_info('8BIM', 'vers', 'PiPL property "Version" (PIPL.r)', 'Adobe'); |
115 | pipl_property_info('8BIM', 'mode', 'PiPL property "SupportedModes" (PIPL.r)', 'Adobe'); |
||
116 | pipl_property_info('8BIM', 'ms32', 'PiPL property "PlugInMaxSize" (PIPL.r)', 'Adobe'); |
||
519 | daniel-mar | 117 | pipl_property_info('8BIM', 'host', 'PiPL property "RequiredHost" (PIPL.r)', 'Adobe'); |
118 | pipl_property_info('8BIM', 'flly', 'PiPL property "FilterLayerSupport" (PIPL.r)', 'Adobe'); |
||
119 | pipl_property_info('8BIM', 'enbl', 'PiPL property "EnableInfo" (PIPL.r)', 'Adobe'); |
||
120 | pipl_property_info('8BIM', 'pmsa', 'PiPL property "MonitorScalingAware" (PIPL.r)', 'Adobe'); |
||
375 | daniel-mar | 121 | pipl_property_info('8BIM', 'fici', 'PiPL property "FilterCaseInfo" (PIPL.r)', 'Adobe'); |
515 | daniel-mar | 122 | pipl_property_info('ViaT', 'ObId', 'PiPL property "Object Identifier"', 'ViaThinkSoft'); |
375 | daniel-mar | 123 | pipl_property_footer(); |
124 | |||
488 | daniel-mar | 125 | ostype_header("Host signatures"); |
519 | daniel-mar | 126 | ostype_info('8BIM', 'Adobe Photoshop', 'Adobe'); |
127 | ostype_info('8BIM', 'PluginCommander', 'Other'); |
||
128 | ostype_info('8BIM', 'Serif Photoplus', 'Other'); |
||
129 | ostype_info('8B)M', 'Adobe Premiere', 'Adobe'); |
||
130 | ostype_info('PMIG', 'GIMP', 'Other', true); |
||
131 | ostype_info('UP20', 'IrfanView', 'Other', true); |
||
132 | ostype_info('PSP9', 'JASC PaintShop Pro X', 'Other', true); |
||
133 | ostype_info('NDP.', 'Paint.net', 'Other', true); |
||
134 | ostype_info(' ', 'Any host', 'Adobe', true); |
||
488 | daniel-mar | 135 | ostype_footer(); |
136 | |||
137 | ostype_header("Miscellaneous / internal use"); |
||
491 | daniel-mar | 138 | ostype_info('bNUL', 'No Nuffer Suite (BUFVERSION_NULL)', 'ViaThinkSoft'); |
139 | ostype_info('bST1', 'Standard Buffer Suite 32bit (BUFVERSION_STD32)', 'ViaThinkSoft'); |
||
140 | ostype_info('bST2', 'Standard Buffer Suite 64bit (BUFVERSION_STD64)', 'ViaThinkSoft'); |
||
141 | ostype_info('bSU1', 'PICA Buffer Suite 1.0 (BUFVERSION_SUITE32)', 'ViaThinkSoft'); |
||
142 | ostype_info('bSU2', 'PICA Buffer Suite 2.0 (BUFVERSION_SUITE64)', 'ViaThinkSoft'); |
||
143 | ostype_info('hNUL', 'No Handle Suite (HDLVERSION_NULL)', 'ViaThinkSoft'); |
||
144 | ostype_info('hSTD', 'Standard Handle Suite (HDLVERSION_STANDARD)', 'ViaThinkSoft'); |
||
145 | ostype_info('hSU1', 'PICA Handle Suite 1.0 (HDLVERSION_SUITE1)', 'ViaThinkSoft'); |
||
146 | ostype_info('hSU2', 'PICA Handle Suite 2.0 (HDLVERSION_SUITE2)', 'ViaThinkSoft'); |
||
147 | ostype_info('tDRW', 'Initial preview timer (IDT_TIMER_INITPREVIEW_DRAW)', 'ViaThinkSoft'); |
||
488 | daniel-mar | 148 | ostype_footer(); |
149 | |||
373 | daniel-mar | 150 | # ------------------------------------------------------------------------------ |
151 | |||
152 | $out = ob_get_contents(); |
||
153 | ob_end_clean(); |
||
154 | |||
155 | echo $out; |
||
156 | |||
157 | file_put_contents(__DIR__.'/os_types.md', $out); |
||
158 | |||
159 | # ------------------------------------------------------------------------------ |
||
160 | |||
488 | daniel-mar | 161 | function ostype_info($type, $desc, $vendor, $no_legality_check=false) { |
373 | daniel-mar | 162 | $dec = 0; |
163 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
||
164 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
||
465 | daniel-mar | 165 | $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
373 | daniel-mar | 166 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
167 | |||
375 | daniel-mar | 168 | $illegal = false; |
373 | daniel-mar | 169 | if ($vendor != '?') { |
170 | $is_all_uppercase = strtoupper($type) == $type; |
||
171 | $is_all_lowercase = strtolower($type) == $type; |
||
172 | $starts_with_uppercase = strtoupper($type[0]) == $type[0]; |
||
375 | daniel-mar | 173 | if (($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') === false)) $illegal = true; |
174 | else if (!($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') !== false)) $illegal = true; |
||
175 | else if ($starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') === false)) $illegal = true; |
||
176 | else if (!$starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') !== false)) $illegal = true; |
||
373 | daniel-mar | 177 | } |
375 | daniel-mar | 178 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
179 | // Note: "8B" sounds like "Adobe" |
||
180 | if ((substr($type,0,2) === '8B') && (strpos($vendor,'Adobe') !== false)) $illegal = false; |
||
373 | daniel-mar | 181 | |
488 | daniel-mar | 182 | if ($no_legality_check) $illegal = false; |
183 | |||
375 | daniel-mar | 184 | if ($illegal) $vendor .= ' (illegal)'; |
373 | daniel-mar | 185 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
186 | |||
187 | echo "| `$type` | $dec | $hex | $desc | $vendor |\n"; |
||
188 | } |
||
189 | |||
190 | function ostype_footer() { |
||
191 | echo "\n"; |
||
192 | } |
||
193 | |||
194 | function ostype_header($title) { |
||
195 | echo "$title\n"; |
||
196 | echo str_repeat('-',strlen($title))."\n"; |
||
197 | echo "\n"; |
||
198 | echo "| Type | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
||
199 | echo "|--------|------------|------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
||
375 | daniel-mar | 200 | } |
373 | daniel-mar | 201 | |
375 | daniel-mar | 202 | # ------------------------------------------------------------------------------ |
203 | |||
204 | function pipl_property_info($ven, $type, $desc, $vendor) { |
||
205 | $vdec = 0; |
||
206 | for ($i=0;$i<4;$i++) $vdec = ($vdec<<8) + ord($ven[$i]); |
||
207 | $vhex = "0x".str_pad(dechex($vdec), 8, "0", STR_PAD_LEFT); |
||
465 | daniel-mar | 208 | $vdec = str_pad((string)$vdec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
375 | daniel-mar | 209 | |
210 | $dec = 0; |
||
211 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
||
212 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
||
465 | daniel-mar | 213 | $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
375 | daniel-mar | 214 | |
215 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
||
216 | |||
217 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
||
218 | // Note: "8B" sounds like "Adobe" |
||
219 | $illegal = (substr($ven,0,2) === '8B') != (strpos($vendor,'Adobe') !== false); |
||
220 | |||
221 | if ($illegal) $vendor .= ' (illegal)'; |
||
222 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
||
223 | |||
224 | echo "| `$ven` | `$type` | $vdec $dec | $vhex $hex | $desc | $vendor |\n"; |
||
373 | daniel-mar | 225 | } |
375 | daniel-mar | 226 | |
227 | function pipl_property_footer() { |
||
228 | echo "\n"; |
||
229 | } |
||
230 | |||
231 | function pipl_property_header($title) { |
||
232 | echo "$title\n"; |
||
233 | echo str_repeat('-',strlen($title))."\n"; |
||
234 | echo "\n"; |
||
235 | echo "| C.code | Prpty. | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
||
236 | echo "|--------|--------|-----------------------|-----------------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
||
237 | } |