Subversion Repositories filter_foundry

Rev

Rev 512 | Rev 536 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
259 daniel-mar 1
/*
2
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
3
    Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
503 daniel-mar 4
    Copyright (C) 2018-2022 Daniel Marschall, ViaThinkSoft
259 daniel-mar 5
 
6
    This program is free software; you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation; either version 2 of the License, or
9
    (at your option) any later version.
10
 
11
    This program is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with this program; if not, write to the Free Software
18
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
*/
20
 
21
/* This is PLATFORM INDEPENDENT user interface code - mainly dialog logic */
22
 
23
#include "ff.h"
365 daniel-mar 24
#include "compat_string.h"
259 daniel-mar 25
 
26
int ctls[8],maps[4];
27
int checksliders_result;
28
 
29
/* one-time initialisation of dialog box */
30
 
31
void builddlginit(DIALOGREF dp){
32
        int i;
33
        char s[0x100];
34
 
35
        if(gdata->parmloaded){
511 daniel-mar 36
                SETCTLTEXT(dp,CATEGORYITEM, gdata->parm.szCategory);
37
                SETCTLTEXT(dp,TITLEITEM,    gdata->parm.szTitle);
38
                SETCTLTEXT(dp,COPYRIGHTITEM,gdata->parm.szCopyright);
39
                SETCTLTEXT(dp,AUTHORITEM,   gdata->parm.szAuthor);
259 daniel-mar 40
                for(i=0;i<4;++i){
511 daniel-mar 41
                        SETCTLTEXT(dp,FIRSTMAPNAMEITEM+i,gdata->parm.szMap[i]);
259 daniel-mar 42
                }
43
                for(i=0;i<8;++i){
511 daniel-mar 44
                        SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,gdata->parm.szCtl[i]);
259 daniel-mar 45
                }
46
        }else{
47
                /* strictly speaking this is not needed on the Mac,
48
                   we can set initial values statically in the rez description */
511 daniel-mar 49
                SETCTLTEXT(dp,CATEGORYITEM, "Filter Foundry");
50
                SETCTLTEXT(dp,TITLEITEM,    "Untitled");
51
                SETCTLTEXT(dp,COPYRIGHTITEM,""); //"Filter Foundry Copyright (C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall"
52
                SETCTLTEXT(dp,AUTHORITEM,   "Anonymous");
259 daniel-mar 53
                strcpy(s,"Map X");
54
                for(i = 0; i < 4; ++i){
456 daniel-mar 55
                        s[4] = (char)('0' + i);
511 daniel-mar 56
                        SETCTLTEXT(dp,FIRSTMAPNAMEITEM+i,s);
259 daniel-mar 57
                }
58
                strcpy(s,"ctl(X)");
59
                for(i = 0; i < 8; ++i){
456 daniel-mar 60
                        s[4] = (char)('0' + i);
511 daniel-mar 61
                        SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,s);
259 daniel-mar 62
                }
63
        }
64
 
65
        checksliders_result = checksliders(4,ctls,maps);
66
        for(i = 4; i--;){
67
                DISABLEDLGITEM(dp,FIRSTMAPCHECKITEM+i);
68
                if(maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
69
                        CHECKDLGBUTTON(dp,FIRSTMAPCHECKITEM+i,true);
70
                else
71
                        HideDialogItem(dp,FIRSTMAPNAMEITEM+i);
72
        }
73
        for(i = 8; i--;){
74
                DISABLEDLGITEM(dp,FIRSTCTLCHECKITEM+i);
75
                if((ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) &&
76
                   // When map() is activated, we don't need ctl labels,
77
                   // since the standalone filter will only show map labels
78
                   !maps[i/2] &&
79
                   (!(checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
80
                   )
81
                        CHECKDLGBUTTON(dp,FIRSTCTLCHECKITEM+i,true);
82
                else
83
                        HideDialogItem(dp,FIRSTCTLNAMEITEM+i);
84
        }
85
 
339 daniel-mar 86
        CHECKDLGBUTTON(dp, PROTECTITEM, 0); // TODO: should we remember the last setting?
87
 
259 daniel-mar 88
        SELECTDLGITEMTEXT(dp,TITLEITEM,0,-1);
89
}
90
 
518 daniel-mar 91
#define MAXFIELD 0x100
92
 
444 daniel-mar 93
Boolean containsUnicodeInput(DIALOGREF dp, int item) {
512 daniel-mar 94
        char sa[MAXFIELD + 1];
444 daniel-mar 95
        wchar_t sw[MAXFIELD + 1];
96
        size_t i;
259 daniel-mar 97
 
512 daniel-mar 98
        GetDlgItemTextA(dp, item, sa, MAXFIELD);
444 daniel-mar 99
        GetDlgItemTextW(dp, item, sw, MAXFIELD);
512 daniel-mar 100
        for (i = 0; i < strlen(sa); i++) {
101
                if (((wchar_t)sa[i] != sw[i]) && (sa[i] == '?')) {
444 daniel-mar 102
                        return true;
103
                }
104
        }
105
 
106
        return false;
107
}
108
 
109
Boolean containsExtCharset(DIALOGREF dp, int item) {
110
        char s[MAXFIELD + 1];
111
        size_t i;
112
 
113
        GetDlgItemTextA(dp, item, s, MAXFIELD);
114
        for (i = 0; i < strlen(s); i++) {
115
                if ((unsigned char)s[i] > (unsigned char)0x7F) {
116
                        return true;
117
                }
118
        }
119
 
120
        return false;
121
}
122
 
259 daniel-mar 123
/* process an item hit. return false if the dialog is finished; otherwise return true. */
124
 
125
Boolean builddlgitem(DIALOGREF dp,int item){
126
        char s[MAXFIELD+1];
127
        int i,needui;
444 daniel-mar 128
        TCHAR fname[MAX_PATH + 1];
365 daniel-mar 129
        StandardFileReply sfr;
130
        NavReplyRecord reply;
444 daniel-mar 131
        #ifdef UNICODE
132
        Boolean unicode;
133
        #endif
134
        Boolean extCharset;
259 daniel-mar 135
 
136
        switch(item){
363 daniel-mar 137
#ifdef MAC_ENV
138
        case ok:
139
#else
259 daniel-mar 140
        case IDOK:
363 daniel-mar 141
#endif
259 daniel-mar 142
                // Do a few checks first
444 daniel-mar 143
                GetDlgItemTextA(dp, CATEGORYITEM, s, MAXFIELD);
259 daniel-mar 144
                if (strlen(s) == 0) {
492 daniel-mar 145
                        simplealert_id(MSG_CATEGORY_EMPTY_ERR_ID);
363 daniel-mar 146
                        return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
259 daniel-mar 147
                }
444 daniel-mar 148
                GetDlgItemTextA(dp, TITLEITEM, s, MAXFIELD);
259 daniel-mar 149
                if (strlen(s) == 0) {
492 daniel-mar 150
                        simplealert_id(MSG_TITLE_EMPTY_ERR_ID);
363 daniel-mar 151
                        return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
259 daniel-mar 152
                }
153
 
444 daniel-mar 154
                // The PiPL and PARM structure does only define single byte charsets
155
                #ifdef UNICODE
156
                unicode =
157
                        containsUnicodeInput(dp, CATEGORYITEM) ||
158
                        containsUnicodeInput(dp, TITLEITEM) ||
159
                        containsUnicodeInput(dp, COPYRIGHTITEM) ||
160
                        containsUnicodeInput(dp, AUTHORITEM);
161
                #endif
162
                extCharset =
163
                        containsExtCharset(dp, CATEGORYITEM) ||
164
                        containsExtCharset(dp, TITLEITEM) ||
165
                        containsExtCharset(dp, COPYRIGHTITEM) ||
166
                        containsExtCharset(dp, AUTHORITEM);
167
 
168
                // The AETE structure does only define single byte charsets
169
                for (i = 0; i < 8; ++i) {
170
                        if (ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) {
171
                                #ifdef UNICODE
172
                                unicode |= containsUnicodeInput(dp, FIRSTCTLNAMEITEM + i);
173
                                #endif
174
                                extCharset |= containsExtCharset(dp, FIRSTCTLNAMEITEM + i);
175
                        }
176
                }
177
                for (i = 0; i < 4; ++i) {
178
                        if (maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS)) {
179
                                #ifdef UNICODE
180
                                unicode |= containsUnicodeInput(dp, FIRSTMAPNAMEITEM + i);
181
                                #endif
182
                                extCharset |= containsExtCharset(dp, FIRSTMAPNAMEITEM + i);
183
                        }
184
                }
185
 
186
                #ifdef UNICODE
187
                if (unicode) {
512 daniel-mar 188
                        // "unicode" means that there are characters that will be converted to "?" when converting wchar_t* => char*
189
                        // Note that this is might be not true if your the characters are mapped in your current default Ansi Charset (e.g. German Umlauts on a German computer)
492 daniel-mar 190
                        simplewarning_id(MSG_UNICODE_DATA_WARNING_ID);
444 daniel-mar 191
                }
192
                else
193
                #endif
194
                if (extCharset) {
492 daniel-mar 195
                        simplewarning_id(MSG_EXTCHARSET_DATA_WARNING_ID);
444 daniel-mar 196
                }
197
 
259 daniel-mar 198
                // Now begin
199
                memset(&gdata->parm,0,sizeof(PARM_T));
444 daniel-mar 200
                GetDlgItemTextA(dp,CATEGORYITEM,gdata->parm.szCategory,MAXFIELD-4/*ProtectFlag*/);
201
                GetDlgItemTextA(dp,TITLEITEM,gdata->parm.szTitle,MAXFIELD);
202
                GetDlgItemTextA(dp,COPYRIGHTITEM,gdata->parm.szCopyright,MAXFIELD);
203
                GetDlgItemTextA(dp,AUTHORITEM,gdata->parm.szAuthor,MAXFIELD);
259 daniel-mar 204
                gdata->parm.cbSize = PARM_SIZE;
205
                gdata->parm.standalone = 1;  //0=original FF, 1=standalone filter
206
                needui = 0;
376 daniel-mar 207
                // Sliders
259 daniel-mar 208
                for(i = 0; i < 8; ++i){
209
                        gdata->parm.val[i] = slider[i];
210
                        gdata->parm.ctl_used[i] = ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS);
211
                        needui |= gdata->parm.ctl_used[i];
444 daniel-mar 212
                        GetDlgItemTextA(dp,FIRSTCTLNAMEITEM+i, gdata->parm.szCtl[i],MAXFIELD);
259 daniel-mar 213
                }
376 daniel-mar 214
                // Maps
215
                for (i = 0; i < 4; ++i) {
259 daniel-mar 216
                        gdata->parm.map_used[i] = maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS);
217
                        needui |= gdata->parm.map_used[i];
444 daniel-mar 218
                        GetDlgItemTextA(dp, FIRSTMAPNAMEITEM + i, gdata->parm.szMap[i], MAXFIELD);
376 daniel-mar 219
                }
220
                // Expressions
221
                for (i = 0; i < 4; ++i) {
393 daniel-mar 222
                        if (strlen(expr[i]) >= sizeof(gdata->parm.szFormula[i])) {
368 daniel-mar 223
                                if (i == 0) {
492 daniel-mar 224
                                        simplealert_id(MSG_FORMULA_R_1023_TRUNCATED_ID);
368 daniel-mar 225
                                }
226
                                else if (i == 1) {
492 daniel-mar 227
                                        simplealert_id(MSG_FORMULA_G_1023_TRUNCATED_ID);
368 daniel-mar 228
                                }
229
                                else if (i == 2) {
492 daniel-mar 230
                                        simplealert_id(MSG_FORMULA_B_1023_TRUNCATED_ID);
368 daniel-mar 231
                                }
232
                                else if (i == 3) {
492 daniel-mar 233
                                        simplealert_id(MSG_FORMULA_A_1023_TRUNCATED_ID);
368 daniel-mar 234
                                }
393 daniel-mar 235
                                expr[i][sizeof(gdata->parm.szFormula[i]) - 1] = '\0';
368 daniel-mar 236
                        }
393 daniel-mar 237
                        strcpy(gdata->parm.szFormula[i], expr[i]);
259 daniel-mar 238
                }
239
                gdata->parm.popDialog = needui; //true if need to pop a parameter dialog
240
                gdata->parm.unknown1 = gdata->parm.unknown2 = gdata->parm.unknown3 = 0;
241
                gdata->parm.iProtected = ISDLGBUTTONCHECKED(dp,PROTECTITEM); // == 1 means protected
456 daniel-mar 242
                gdata->obfusc = (Boolean)ISDLGBUTTONCHECKED(dp,PROTECTITEM);
365 daniel-mar 243
 
444 daniel-mar 244
                GetDlgItemText(dp, TITLEITEM, fname, MAXFIELD);
245
 
493 daniel-mar 246
                {
496 daniel-mar 247
                        TCHAR* tmp1;
248
                        TCHAR* filters, *title;
249
                        Boolean makeDlgRet;
493 daniel-mar 250
 
496 daniel-mar 251
                        title = (TCHAR*)malloc(1024);
252
                        if (title == NULL) return false;
493 daniel-mar 253
 
496 daniel-mar 254
                        filters = (TCHAR*)malloc(4096);
255
                        if (filters == NULL) return false;
256
                        memset(filters, 0, 4096);
257
                        tmp1 = filters;
493 daniel-mar 258
 
496 daniel-mar 259
                        FF_GetMsg(title, MSG_MAKE_FILTER_SETTINGS_TITLE_ID);
493 daniel-mar 260
 
496 daniel-mar 261
                        strcpy_advance_id(&tmp1, MSG_MAKE_8BF_ID);
262
                        strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.8bf)")); tmp1++;
263
                        strcpy_advance(&tmp1, (TCHAR*)TEXT("*.8bf")); tmp1++;
264
 
265
                        strcpy_advance_id(&tmp1, MSG_ALL_FILES_ID);
266
                        strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.*)")); tmp1++;
267
                        strcpy_advance(&tmp1, (TCHAR*)TEXT("*.*")); tmp1++;
268
 
493 daniel-mar 269
                        #ifdef MACMACHO
270
                        strcat(fname, ".plugin");
271
                        #endif
496 daniel-mar 272
 
273
                        makeDlgRet = putfile(
274
#ifdef MAC_ENV
498 daniel-mar 275
                                "\pMake standalone filter", // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
276
                                myc2pstr(_strdup(fname)), // TODO: memory leak?
493 daniel-mar 277
                                PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
278
                                "8bf", &filters[0], 1
496 daniel-mar 279
#else
280
                                title,
493 daniel-mar 281
                                fname,
282
                                PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
283
                                TEXT("8bf"),
284
                                &filters[0], 1
285
                                , (HWND)dp
496 daniel-mar 286
#endif
287
                        );
288
 
289
                        free(filters);
290
                        free(title);
291
 
292
                        if (makeDlgRet) {
493 daniel-mar 293
                                make_standalone(&sfr);
294
                        }
295
                        else {
296
                                return true; // keep going. Let the user correct their input
297
                        }
365 daniel-mar 298
                }
299
 
381 daniel-mar 300
                return false; // end dialog
363 daniel-mar 301
#ifdef MAC_ENV
302
        case cancel:
303
#else
259 daniel-mar 304
        case IDCANCEL:
363 daniel-mar 305
#endif
259 daniel-mar 306
                return false; // end dialog
307
        case PROTECTITEM:
308
                CHECKDLGBUTTON(dp, item, ISDLGBUTTONCHECKED(dp,item) ^ 1);
309
                break;
310
        }
311
 
312
        return true; // keep going
313
}