Subversion Repositories filter_foundry

Rev

Rev 145 | Rev 149 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
  3.     Copyright (C) 2003-7 Toby Thain, toby@telegraphics.com.au
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. */
  19.  
  20. #include "ff.h"
  21.  
  22. #include "file_compat.h"
  23.  
  24. enum{
  25.         BUFSIZE = 4L<<10,
  26.         MAXLINE = 0x200,
  27. };
  28.  
  29. Boolean readparams(Handle h,Boolean alerts,char **reason){
  30.         Boolean res = false;
  31.         char linebuf[MAXLINE+1],curexpr[MAXEXPR+1],*p,*dataend,*q;
  32.         int c,linecnt,lineptr,exprcnt;
  33.  
  34.         if(!h){
  35.                 *reason = "readparams: Null parameter handle.";
  36.                 return false;
  37.         }
  38.  
  39.         p = PILOCKHANDLE(h,false);
  40.         dataend = p + PIGETHANDLESIZE(h);
  41.  
  42.         q = curexpr;
  43.         linecnt = exprcnt = lineptr = 0;
  44.  
  45.         *reason = "File was too short.";
  46.         while(p < dataend){
  47.  
  48.                 c = *p++;
  49.  
  50.                 if(c==CR || c==LF){ /* detected end of line */
  51.  
  52.                         /* look ahead to see if we need to skip a line feed (DOS EOL convention) */
  53.                         if(c == CR && *p == LF && p < dataend)
  54.                                 ++p;
  55.  
  56.                         linebuf[lineptr] = 0; /* add terminating NUL to line buffer */
  57.  
  58.                         /* process complete line */
  59.                         if(linecnt==0){
  60.                                 if(strcmp(linebuf,"%RGB-1.0")){
  61.                                         if(alerts)
  62.                                                 *reason = "This doesn't look like a Filter Factory file (first line is not \"%RGB-1.0\").";
  63.                                         break;
  64.                                 }
  65.                         }else if(linecnt<=8){
  66.                                 slider[linecnt-1] = atoi(linebuf);
  67.                         }else{
  68.                                 if(lineptr){
  69.                                         /* it's not an empty line; append it to current expr string */
  70.                                         if( q+lineptr > curexpr+MAXEXPR ){
  71.                                                 *reason = "Found an expression longer than 1024 characters.";
  72.                                                 break;
  73.                                         }
  74.                                         q = cat(q,linebuf);
  75.                                 }else{
  76.                                         /* it's an empty line: we've completed the expr string */
  77.                                         if(expr[exprcnt])
  78.                                                 free(expr[exprcnt]);
  79.                                         *q = 0;
  80.                                         if(!(expr[exprcnt] = my_strdup(curexpr))){
  81.                                                 *reason = "Could not get memory for expression.";
  82.                                                 break;
  83.                                         }
  84.  
  85.                                         if(++exprcnt == 4){
  86.                                                 res = true;
  87.                                                 break; /* got everything we want */
  88.                                         }
  89.  
  90.                                         q = curexpr; /* empty current expr, ready for next one */
  91.                                 }
  92.                         }
  93.  
  94.                         ++linecnt;
  95.                         lineptr = 0;
  96.                 }else{
  97.                         /* store character */
  98.                         if(c=='\\'){ /* escape sequence */
  99.                                 if(p < dataend){
  100.                                         c = *p++;
  101.                                         switch(c){
  102.                                         case 'r': c = CR;
  103.                                         case '\\': break;
  104.                                         default:
  105.                                                 if(alerts) alertuser("Warning:","Unknown escape sequence in input.");
  106.                                         }
  107.                                 }//else if(alerts) alertuser("Warning:","truncated escape sequence ends input");
  108.                         }
  109.  
  110.                         if(lineptr < MAXLINE)
  111.                                 linebuf[lineptr++] = c;
  112.                 }
  113.         }
  114.  
  115.         PIUNLOCKHANDLE(h);
  116.  
  117.         return res;
  118. }
  119.  
  120. void convert_premiere_to_photoshop(PARM_T* photoshop, PARM_T_PREMIERE* premiere) {
  121.         int i;
  122.  
  123.         photoshop->cbSize = sizeof(PARM_T);
  124.         photoshop->standalone = premiere->standalone;
  125.         for (i=0;i<8;++i)
  126.           photoshop->val[i] = premiere->val[i];
  127.         photoshop->popDialog = premiere->popDialog;
  128.         photoshop->unknown1 = premiere->unknown1;
  129.         photoshop->unknown2 = premiere->unknown2;
  130.         photoshop->unknown3 = premiere->unknown3;
  131.         for (i=0;i<4;++i)
  132.           photoshop->map_used[i] = premiere->map_used[i];
  133.         for (i=0;i<8;++i)
  134.           photoshop->ctl_used[i] = premiere->ctl_used[i];
  135.         memcpy((void*)photoshop->category, (void*)premiere->category, sizeof(photoshop->category));
  136.         photoshop->iProtected = premiere->iProtected;
  137.         memcpy((void*)photoshop->title, (void*)premiere->title, sizeof(photoshop->title));
  138.         memcpy((void*)photoshop->copyright, (void*)premiere->copyright, sizeof(photoshop->copyright));
  139.         memcpy((void*)photoshop->author, (void*)premiere->author, sizeof(photoshop->author));
  140.         for (i=0;i<4;++i)
  141.           memcpy((void*)photoshop->map[i], (void*)premiere->map[i], sizeof(photoshop->map[i]));
  142.         for (i=0;i<8;++i)
  143.           memcpy((void*)photoshop->ctl[i], (void*)premiere->ctl[i], sizeof(photoshop->ctl[i]));
  144.  
  145.         if (premiere->singleExpression) {
  146.                 memcpy((void*)photoshop->formula[0], (void*)premiere->formula[3], sizeof(photoshop->formula[3]));
  147.                 memcpy((void*)photoshop->formula[1], (void*)premiere->formula[3], sizeof(photoshop->formula[3]));
  148.                 memcpy((void*)photoshop->formula[2], (void*)premiere->formula[3], sizeof(photoshop->formula[3]));
  149.                 memcpy((void*)photoshop->formula[3], (void*)premiere->formula[3], sizeof(photoshop->formula[3]));
  150.         } else {
  151.                 memcpy((void*)photoshop->formula[0], (void*)premiere->formula[2], sizeof(photoshop->formula[2]));
  152.                 memcpy((void*)photoshop->formula[1], (void*)premiere->formula[1], sizeof(photoshop->formula[1]));
  153.                 memcpy((void*)photoshop->formula[2], (void*)premiere->formula[0], sizeof(photoshop->formula[0]));
  154.                 memcpy((void*)photoshop->formula[3], (void*)premiere->formula[3], sizeof(photoshop->formula[3]));
  155.         }
  156. }
  157.  
  158. Boolean readPARM(Ptr p,PARM_T *pparm,char **reasonstr,int fromwin){
  159.         int i;
  160.  
  161.         if (*((unsigned int*)p) == PARM_SIZE_PREMIERE) {
  162.                 convert_premiere_to_photoshop(pparm, (PARM_T_PREMIERE*)p);
  163.         } else {
  164.                 // Assume it is Photoshop. Signature either PARM_SIZE (0x2068) or 0x1C68
  165.                 memcpy(pparm,p,sizeof(PARM_T));
  166.         }
  167.  
  168.         if(fromwin){
  169.                 /* Windows PARM resource stores C strings - convert to Pascal strings  */
  170.                 myc2pstr((char*)pparm->category);
  171.                 myc2pstr((char*)pparm->title);
  172.                 myc2pstr((char*)pparm->copyright);
  173.                 myc2pstr((char*)pparm->author);
  174.                 for(i = 0; i < 4; ++i)
  175.                         myc2pstr((char*)pparm->map[i]);
  176.                 for(i = 0; i < 8; ++i)
  177.                         myc2pstr((char*)pparm->ctl[i]);
  178.         }
  179.  
  180.         for(i = 0; i < 4; ++i){
  181.                 if(expr[i]) free(expr[i]);
  182.                 expr[i] = my_strdup(pparm->formula[i]);
  183.         }
  184.  
  185.         for(i = 0; i < 8; ++i)
  186.                 slider[i] = pparm->val[i];
  187.  
  188.         return true;
  189. }
  190.  
  191. Handle readfileintohandle(FILEREF r){
  192.         long n;
  193.         Handle h;
  194.         Ptr p;
  195.  
  196.         if( !GetEOF(r,&n) && (h = PINEWHANDLE(n)) ){
  197.                 p = PILOCKHANDLE(h,false);
  198.                 if(!SetFPos(r,fsFromStart,0) && !FSRead(r,&n,p)){
  199.                         PIUNLOCKHANDLE(h);
  200.                         return h;
  201.                 }
  202.                 PIDISPOSEHANDLE(h);
  203.         }
  204.         return NULL;
  205. }
  206.  
  207. Boolean readfile(StandardFileReply *sfr,char **reason){
  208.         FILEREF r;
  209.         Handle h;
  210.         Boolean res = false;
  211.  
  212.         if(!FSpOpenDF(&sfr->sfFile,fsRdPerm,&r)){
  213.                 if( (h = readfileintohandle(r)) ){
  214.                         if( (res = readparams(h,true,reason)) )
  215.                                 gdata->standalone = false; // so metadata fields will default, if user chooses Make...
  216.  
  217.                         if (!strcasecmp((char*)sfr->sfFile.name + 1 + sfr->nFileExtension,"pff")) {
  218.                                 char* tmp;
  219.                                 tmp = my_strdup(expr[0]);
  220.                                 memcpy((void*)expr[0], (void*)expr[2], sizeof(expr[0]));
  221.                                 memcpy((void*)expr[2], (void*)tmp, sizeof(expr[2]));
  222.                                 free(tmp);
  223.                         }
  224.  
  225.                         PIDISPOSEHANDLE(h);
  226.                 }
  227.                 FSClose(r);
  228.         }else
  229.                 *reason = "Could not open the file.";
  230.  
  231.         return res;
  232. }
  233.