Subversion Repositories filter_foundry

Rev

Rev 378 | Rev 488 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 378 Rev 465
1
#!/usr/bin/php
1
#!/usr/bin/php
2
<?php
2
<?php
3
 
3
 
4
/*
4
/*
5
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
5
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
6
    Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
6
    Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
7
    Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft
7
    Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft
8
 
8
 
9
    This program is free software; you can redistribute it and/or modify
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
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
11
    the Free Software Foundation; either version 2 of the License, or
12
    (at your option) any later version.
12
    (at your option) any later version.
13
 
13
 
14
    This program is distributed in the hope that it will be useful,
14
    This program is distributed in the hope that it will be useful,
15
    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
    but WITHOUT ANY WARRANTY; without even the implied warranty of
16
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
    GNU General Public License for more details.
17
    GNU General Public License for more details.
18
 
18
 
19
    You should have received a copy of the GNU General Public License
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
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
21
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
*/
22
*/
23
 
23
 
24
// This script generates the documentation file os_types.md
24
// This script generates the documentation file os_types.md
25
 
25
 
26
define('DESC_WIDTH', 55);
26
define('DESC_WIDTH', 55);
27
define('VENDOR_WIDTH', 15);
27
define('VENDOR_WIDTH', 15);
28
 
28
 
29
ob_start();
29
ob_start();
30
 
30
 
31
echo "OSTypes used in Filter Foundry\n";
31
echo "OSTypes used in Filter Foundry\n";
32
echo "==============================\n";
32
echo "==============================\n";
33
echo "\n";
33
echo "\n";
34
 
34
 
35
echo "Note: According to the Photoshop API guide:\n";
35
echo "Note: According to the Photoshop API guide:\n";
36
echo "- All IDs starting with an uppercase letter are reserved by Adobe.\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";
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";
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";
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";
40
echo "  one uppercase letter for you and other plug-in developers.\n";
41
echo "\n";
41
echo "\n";
42
 
42
 
43
# ------------------------------------------------------------------------------
43
# ------------------------------------------------------------------------------
44
 
44
 
45
ostype_header("AppleScript related");
45
ostype_header("AppleScript related");
46
ostype_info('tELE', 'Plugin Suite ID', 'Telegraphics');
46
ostype_info('tELE', 'Plugin Suite ID', 'Telegraphics');
47
ostype_info('Fltr', 'Class ID "Filter" (PITerminology.h:eventFilter)', 'Adobe');
47
ostype_info('Fltr', 'Class ID "Filter" (PITerminology.h:eventFilter)', 'Adobe');
48
ostype_info('fiFo', 'Event ID (for non-standalone filter)', 'Telegraphics');
48
ostype_info('fiFo', 'Event ID (for non-standalone filter)', 'Telegraphics');
49
ostype_info('xprR', 'Expression "red" channel (for non-standalone filter)', 'Telegraphics');
49
ostype_info('xprR', 'Expression "red" channel (for non-standalone filter)', 'Telegraphics');
50
ostype_info('xprG', 'Expression "green" channel (for non-standalone filter)', 'Telegraphics');
50
ostype_info('xprG', 'Expression "green" channel (for non-standalone filter)', 'Telegraphics');
51
ostype_info('xprB', 'Expression "blue" channel (for non-standalone filter)', 'Telegraphics');
51
ostype_info('xprB', 'Expression "blue" channel (for non-standalone filter)', 'Telegraphics');
52
ostype_info('xprA', 'Expression "alpha" channel (for non-standalone filter)', 'Telegraphics');
52
ostype_info('xprA', 'Expression "alpha" channel (for non-standalone filter)', 'Telegraphics');
53
ostype_info('cTl0', 'Slider 0 (for non-standalone filter)', 'Telegraphics');
53
ostype_info('cTl0', 'Slider 0 (for non-standalone filter)', 'Telegraphics');
54
ostype_info('cTl1', 'Slider 1 (for non-standalone filter)', 'Telegraphics');
54
ostype_info('cTl1', 'Slider 1 (for non-standalone filter)', 'Telegraphics');
55
ostype_info('cTl2', 'Slider 2 (for non-standalone filter)', 'Telegraphics');
55
ostype_info('cTl2', 'Slider 2 (for non-standalone filter)', 'Telegraphics');
56
ostype_info('cTl3', 'Slider 3 (for non-standalone filter)', 'Telegraphics');
56
ostype_info('cTl3', 'Slider 3 (for non-standalone filter)', 'Telegraphics');
57
ostype_info('cTl4', 'Slider 4 (for non-standalone filter)', 'Telegraphics');
57
ostype_info('cTl4', 'Slider 4 (for non-standalone filter)', 'Telegraphics');
58
ostype_info('cTl5', 'Slider 5 (for non-standalone filter)', 'Telegraphics');
58
ostype_info('cTl5', 'Slider 5 (for non-standalone filter)', 'Telegraphics');
59
ostype_info('cTl6', 'Slider 6 (for non-standalone filter)', 'Telegraphics');
59
ostype_info('cTl6', 'Slider 6 (for non-standalone filter)', 'Telegraphics');
60
ostype_info('cTl7', 'Slider 7 (for non-standalone filter)', 'Telegraphics');
60
ostype_info('cTl7', 'Slider 7 (for non-standalone filter)', 'Telegraphics');
61
ostype_footer();
61
ostype_footer();
62
 
62
 
63
echo "Note: For standalone plugins, all FourCC codes above will be replaced ";
63
echo "Note: For standalone plugins, all FourCC codes above will be replaced ";
64
echo "by different hashes based on the parameter data of the filter (except `tELE` and `Fltr`).\n\n";
64
echo "by different hashes based on the parameter data of the filter (except `tELE` and `Fltr`).\n\n";
65
 
65
 
66
// TODO: also display Windows types, e.g. RT_RCDATA = 'DATA' ?
66
// TODO: also display Windows types, e.g. RT_RCDATA = 'DATA' ?
67
ostype_header("Resource fork types");
67
ostype_header("Resource fork types");
68
ostype_info('aete', 'Apple Event Terminology', 'Apple'); // https://developer.apple.com/library/archive/documentation/mac/pdf/Interapplication_Communication/AE_Term_Resources.pdf
68
ostype_info('aete', 'Apple Event Terminology', 'Apple'); // https://developer.apple.com/library/archive/documentation/mac/pdf/Interapplication_Communication/AE_Term_Resources.pdf
69
//ostype_info('PiMI', 'Plug-in Meta Information', 'Adobe');
69
//ostype_info('PiMI', 'Plug-in Meta Information', 'Adobe');
70
ostype_info('PiPL', 'PlugIn Property List', 'Adobe');
70
ostype_info('PiPL', 'PlugIn Property List', 'Adobe');
71
ostype_info('DATA', 'Generic data (replaced by `tpLT` and `obFS`)', '?');
71
ostype_info('DATA', 'Generic data (replaced by `tpLT` and `obFS`)', '?');
72
ostype_info('tpLT', 'Template for standalone filter resources', 'Telegraphics'); // actually defined by ViaThinkSoft for Filter Foundry
72
ostype_info('tpLT', 'Template for standalone filter resources', 'Telegraphics'); // actually defined by ViaThinkSoft for Filter Foundry
73
ostype_info('obFS', 'Filter Foundry obfuscated data', 'Telegraphics'); // actually defined by ViaThinkSoft
73
ostype_info('obFS', 'Filter Foundry obfuscated data', 'Telegraphics'); // actually defined by ViaThinkSoft
74
ostype_info('PARM', 'Filter Factory parameter data (PARM.h)', 'Adobe');
74
ostype_info('PARM', 'Filter Factory parameter data (PARM.h)', 'Adobe');
75
// https://developer.apple.com/library/archive/documentation/mac/pdf/ResEditReference.pdf
75
// https://developer.apple.com/library/archive/documentation/mac/pdf/ResEditReference.pdf
76
// https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf
76
// https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf
77
ostype_info('ALRT', 'Alert (only Macintosh build)', 'Apple');
77
ostype_info('ALRT', 'Alert (only Macintosh build)', 'Apple');
78
ostype_info('DITL', 'Dialog template (only Macintosh build)', 'Apple');
78
ostype_info('DITL', 'Dialog template (only Macintosh build)', 'Apple');
79
ostype_info('CNTL', 'Control (only Macintosh build)', 'Apple');
79
ostype_info('CNTL', 'Control (only Macintosh build)', 'Apple');
80
ostype_info('DLOG', 'Dialog (only Macintosh build)', 'Apple');
80
ostype_info('DLOG', 'Dialog (only Macintosh build)', 'Apple');
81
ostype_info('dlgx', 'Extended Dialog (only Macintosh build)', 'Apple');
81
ostype_info('dlgx', 'Extended Dialog (only Macintosh build)', 'Apple');
82
ostype_info('dftb', 'Dialog Font Table (only Macintosh build)', 'Apple');
82
ostype_info('dftb', 'Dialog Font Table (only Macintosh build)', 'Apple');
83
ostype_info('PICT', 'Picture (only Macintosh build)', 'Apple');
83
ostype_info('PICT', 'Picture (only Macintosh build)', 'Apple');
84
ostype_info('CURS', 'Cursor (only Macintosh build)', 'Apple');
84
ostype_info('CURS', 'Cursor (only Macintosh build)', 'Apple');
85
ostype_info('vers', 'Version number (only Macintosh build)', 'Apple');
85
ostype_info('vers', 'Version number (only Macintosh build)', 'Apple');
86
ostype_footer();
86
ostype_footer();
87
 
87
 
88
ostype_header("Creator codes");
88
ostype_header("Creator codes");
89
ostype_info('8BIM', 'Adobe Photoshop', 'Adobe');
89
ostype_info('8BIM', 'Adobe Photoshop', 'Adobe');
90
ostype_info('8BFM', 'Adobe Filter module (used in `kind` PiPL property)', 'Adobe');
90
ostype_info('8BFM', 'Adobe Filter module (used in `kind` PiPL property)', 'Adobe');
91
ostype_footer();
91
ostype_footer();
92
 
92
 
93
pipl_property_header("PlugIn Property List (PiPL) properties");
93
pipl_property_header("PlugIn Property List (PiPL) properties");
94
pipl_property_info('8BIM', 'catg', 'PiPL property "Category"', 'Adobe');
94
pipl_property_info('8BIM', 'catg', 'PiPL property "Category"', 'Adobe');
95
pipl_property_info('8BIM', 'name', 'PiPL property "Name"', 'Adobe');
95
pipl_property_info('8BIM', 'name', 'PiPL property "Name"', 'Adobe');
96
pipl_property_info('8BIM', 'hstm', 'PiPL property "Has terminology"', 'Adobe');
96
pipl_property_info('8BIM', 'hstm', 'PiPL property "Has terminology"', 'Adobe');
97
pipl_property_info('8BIM', 'wx86', 'PiPL property PIWin32X86CodeProperty (PIGeneral.h)', 'Adobe');
97
pipl_property_info('8BIM', 'wx86', 'PiPL property PIWin32X86CodeProperty (PIGeneral.h)', 'Adobe');
98
pipl_property_info('8BIM', '8664', 'PiPL property PIWin64X86CodeProperty (PIGeneral.h)', 'Adobe');
98
pipl_property_info('8BIM', '8664', 'PiPL property PIWin64X86CodeProperty (PIGeneral.h)', 'Adobe');
99
pipl_property_info('8BIM', 'kind', 'PiPL property "Kind" (PIPL.r)', 'Adobe');
99
pipl_property_info('8BIM', 'kind', 'PiPL property "Kind" (PIPL.r)', 'Adobe');
100
pipl_property_info('8BIM', 'vers', 'PiPL property "Version" (PIPL.r)', 'Adobe');
100
pipl_property_info('8BIM', 'vers', 'PiPL property "Version" (PIPL.r)', 'Adobe');
101
pipl_property_info('8BIM', 'mode', 'PiPL property "SupportedModes" (PIPL.r)', 'Adobe');
101
pipl_property_info('8BIM', 'mode', 'PiPL property "SupportedModes" (PIPL.r)', 'Adobe');
102
pipl_property_info('8BIM', 'ms32', 'PiPL property "PlugInMaxSize" (PIPL.r)', 'Adobe');
102
pipl_property_info('8BIM', 'ms32', 'PiPL property "PlugInMaxSize" (PIPL.r)', 'Adobe');
103
pipl_property_info('8BIM', 'fici', 'PiPL property "FilterCaseInfo" (PIPL.r)', 'Adobe');
103
pipl_property_info('8BIM', 'fici', 'PiPL property "FilterCaseInfo" (PIPL.r)', 'Adobe');
104
pipl_property_footer();
104
pipl_property_footer();
105
 
105
 
106
# ------------------------------------------------------------------------------
106
# ------------------------------------------------------------------------------
107
 
107
 
108
$out = ob_get_contents();
108
$out = ob_get_contents();
109
ob_end_clean();
109
ob_end_clean();
110
 
110
 
111
echo $out;
111
echo $out;
112
 
112
 
113
file_put_contents(__DIR__.'/os_types.md', $out);
113
file_put_contents(__DIR__.'/os_types.md', $out);
114
 
114
 
115
# ------------------------------------------------------------------------------
115
# ------------------------------------------------------------------------------
116
 
116
 
117
function ostype_info($type, $desc, $vendor) {
117
function ostype_info($type, $desc, $vendor) {
118
        $dec = 0;
118
        $dec = 0;
119
        for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]);
119
        for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]);
120
        $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT);
120
        $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT);
121
        $dec = str_pad($dec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT);
121
        $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT);
122
        $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT);
122
        $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT);
123
 
123
 
124
        $illegal = false;
124
        $illegal = false;
125
        if ($vendor != '?') {
125
        if ($vendor != '?') {
126
                $is_all_uppercase = strtoupper($type) == $type;
126
                $is_all_uppercase = strtoupper($type) == $type;
127
                $is_all_lowercase = strtolower($type) == $type;
127
                $is_all_lowercase = strtolower($type) == $type;
128
                $starts_with_uppercase = strtoupper($type[0]) == $type[0];
128
                $starts_with_uppercase = strtoupper($type[0]) == $type[0];
129
                if (($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') === false)) $illegal = true;
129
                if (($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') === false)) $illegal = true;
130
                else if (!($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') !== false)) $illegal = true;
130
                else if (!($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') !== false)) $illegal = true;
131
                else if ($starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') === false)) $illegal = true;
131
                else if ($starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') === false)) $illegal = true;
132
                else if (!$starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') !== false)) $illegal = true;
132
                else if (!$starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') !== false)) $illegal = true;
133
        }
133
        }
134
        // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple
134
        // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple
135
        // Note: "8B" sounds like "Adobe"
135
        // Note: "8B" sounds like "Adobe"
136
        if ((substr($type,0,2) === '8B') && (strpos($vendor,'Adobe') !== false)) $illegal = false;
136
        if ((substr($type,0,2) === '8B') && (strpos($vendor,'Adobe') !== false)) $illegal = false;
137
 
137
 
138
        if ($illegal) $vendor .= ' (illegal)';
138
        if ($illegal) $vendor .= ' (illegal)';
139
        $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT);
139
        $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT);
140
 
140
 
141
        echo "| `$type` | $dec | $hex | $desc | $vendor |\n";
141
        echo "| `$type` | $dec | $hex | $desc | $vendor |\n";
142
}
142
}
143
 
143
 
144
function ostype_footer() {
144
function ostype_footer() {
145
        echo "\n";
145
        echo "\n";
146
}
146
}
147
 
147
 
148
function ostype_header($title) {
148
function ostype_header($title) {
149
        echo "$title\n";
149
        echo "$title\n";
150
        echo str_repeat('-',strlen($title))."\n";
150
        echo str_repeat('-',strlen($title))."\n";
151
        echo "\n";
151
        echo "\n";
152
        echo "| Type   | Dec        | Hex        | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n";
152
        echo "| Type   | Dec        | Hex        | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n";
153
        echo "|--------|------------|------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n";
153
        echo "|--------|------------|------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n";
154
}
154
}
155
 
155
 
156
# ------------------------------------------------------------------------------
156
# ------------------------------------------------------------------------------
157
 
157
 
158
function pipl_property_info($ven, $type, $desc, $vendor) {
158
function pipl_property_info($ven, $type, $desc, $vendor) {
159
        $vdec = 0;
159
        $vdec = 0;
160
        for ($i=0;$i<4;$i++) $vdec = ($vdec<<8) + ord($ven[$i]);
160
        for ($i=0;$i<4;$i++) $vdec = ($vdec<<8) + ord($ven[$i]);
161
        $vhex = "0x".str_pad(dechex($vdec), 8, "0", STR_PAD_LEFT);
161
        $vhex = "0x".str_pad(dechex($vdec), 8, "0", STR_PAD_LEFT);
162
        $vdec = str_pad($vdec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT);
162
        $vdec = str_pad((string)$vdec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT);
163
 
163
 
164
        $dec = 0;
164
        $dec = 0;
165
        for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]);
165
        for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]);
166
        $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT);
166
        $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT);
167
        $dec = str_pad($dec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT);
167
        $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT);
168
 
168
 
169
        $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT);
169
        $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT);
170
 
170
 
171
        // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple
171
        // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple
172
        // Note: "8B" sounds like "Adobe"
172
        // Note: "8B" sounds like "Adobe"
173
        $illegal = (substr($ven,0,2) === '8B') != (strpos($vendor,'Adobe') !== false);
173
        $illegal = (substr($ven,0,2) === '8B') != (strpos($vendor,'Adobe') !== false);
174
 
174
 
175
        if ($illegal) $vendor .= ' (illegal)';
175
        if ($illegal) $vendor .= ' (illegal)';
176
        $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT);
176
        $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT);
177
 
177
 
178
        echo "| `$ven` | `$type` | $vdec $dec | $vhex $hex | $desc | $vendor |\n";
178
        echo "| `$ven` | `$type` | $vdec $dec | $vhex $hex | $desc | $vendor |\n";
179
}
179
}
180
 
180
 
181
function pipl_property_footer() {
181
function pipl_property_footer() {
182
        echo "\n";
182
        echo "\n";
183
}
183
}
184
 
184
 
185
function pipl_property_header($title) {
185
function pipl_property_header($title) {
186
        echo "$title\n";
186
        echo "$title\n";
187
        echo str_repeat('-',strlen($title))."\n";
187
        echo str_repeat('-',strlen($title))."\n";
188
        echo "\n";
188
        echo "\n";
189
        echo "| C.code | Prpty. | Dec                   | Hex                   | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n";
189
        echo "| C.code | Prpty. | Dec                   | Hex                   | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n";
190
        echo "|--------|--------|-----------------------|-----------------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n";
190
        echo "|--------|--------|-----------------------|-----------------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n";
191
}
191
}
192
 
192