home *** CD-ROM | disk | FTP | other *** search
- /*
- Balance effect.
-
- Copyright © 1995-1996 Almathera Systems Ltd. All Rights Reserved
- */
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <dos/dos.h>
- #include <intuition/intuition.h>
- #include <intuition/gadgetclass.h>
- #include <libraries/gadtools.h>
-
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/gadtools_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/alib_protos.h>
-
- #include <pragmas/exec_pragmas.h>
- #include <pragmas/dos_pragmas.h>
- #include <pragmas/graphics_pragmas.h>
- #include <pragmas/intuition_pragmas.h>
- #include <pragmas/gadtools_pragmas.h>
-
- #include <photogenics/pgs_protos.h>
- #include <photogenics/pgsrexx_protos.h>
- #include <photogenics/parse.h>
-
- #include <pragmas/pgsrexx_pragmas.h>
- #include <pragmas/pgs_pragmas.h>
-
- #include <photogenics/gio.h>
- #include <photogenics/efx.h>
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
-
- #define DOSBase giodata->DOSBase
- #define PgsBase giodata->PgsBase
- #define GfxBase giodata->GfxBase
- #define IntuitionBase giodata->IntuitionBase
- #define GadToolsBase giodata->GadToolsBase
- #define PgsrexxBase giodata->PgsrexxBase
-
- __asm ULONG EfxInfo(void)
- {
- return(EFX_24BIT|EFX_NOOPTIONS);
- }
-
- WORD rval = 0;
- WORD gval = 0;
- WORD bval = 0;
-
- void handlemessages(struct GIOData *,struct Window *);
- void preview_balance(struct GIOData *,struct Window *);
- void apply_balance(struct GIOData *giodata);
-
- struct NewGadget ng;
- struct VisualInfo *vi;
-
- UBYTE *preview;
- UBYTE *preview2;
-
- struct Gadget *rnumgad,*bnumgad,*gnumgad,*rslidergad,*gslidergad,*bslidergad;
-
- LONG pointers[] = {0,0,0};
-
- __asm ULONG EfxRender(register __a0 struct GIOData *giodata)
- {
- struct Window *win;
- struct Screen *scn;
- struct Gadget *glist,*gad;
-
- giodata->Error = GIO_OK;
-
- preview = 0;
- preview2 = 0;
-
- if((giodata->ArexxString) && (PgsrexxBase))
- {
- LONG array[] = {3, (LONG) pointers,
- PARSETYPE_INT,-255,255,
- PARSETYPE_INT,-255,255,
- PARSETYPE_INT,-255,255};
-
- if(giodata->ArexxError = ParseTemplate(giodata->ArexxString,array))
- {
- giodata->Error = GIO_AREXXERROR;
- return(giodata->Error);
- }
-
- rval=pointers[0];
- gval=pointers[1];
- bval=pointers[2];
-
- apply_balance(giodata);
-
- } else {
-
- preview = CreatePreviewImage(giodata,64,64,0);
- if(!preview) goto err;
-
- preview2 = AllocVec(64*64*3,MEMF_CLEAR|MEMF_PUBLIC);
-
- memcpy(preview2,preview,64*64*3);
-
- scn = LockPubScreen("photogenics");
-
- if(!scn)
- {
- Error("Unable to lock public screen");
- return(giodata->Error = GIO_ABORTED);
- }
-
- gad = CreateContext(&glist);
-
- vi = GetVisualInfo(scn,TAG_END);
-
- if(!vi) return(giodata->Error = GIO_SYSERR);
-
- win = OpenWindowTags(0,
- WA_Left, 50,
- WA_Top, 50,
- WA_InnerWidth, 210+(scn->RastPort.TxWidth*13),
- WA_InnerHeight, 66+(scn->Font->ta_YSize*3),
- WA_CloseGadget, TRUE,
- WA_DepthGadget, TRUE,
- WA_DragBar, TRUE,
- WA_PubScreen, scn,
- WA_ReportMouse, -1,
-
- WA_SimpleRefresh, TRUE,
- WA_Activate, TRUE,
- WA_Title, "Colour Balance",
- WA_IDCMP, IDCMP_MOUSEMOVE|IDCMP_REFRESHWINDOW|IDCMP_CLOSEWINDOW|
- SLIDERIDCMP|BUTTONIDCMP|STRINGIDCMP,
- 0);
-
-
- ng.ng_LeftEdge = 2+win->BorderLeft;
- ng.ng_TopEdge = win->Height-win->BorderBottom-scn->Font->ta_YSize-8;
- ng.ng_Width = 80;
- ng.ng_Height = scn->Font->ta_YSize+6;
- ng.ng_GadgetText = "Accept";
- ng.ng_TextAttr = scn->Font;
- ng.ng_GadgetID = 0;
- ng.ng_Flags = 0;
- ng.ng_VisualInfo = vi;
-
- gad = CreateGadget(BUTTON_KIND,gad,&ng,TAG_END);
-
- ng.ng_LeftEdge = win->Width-win->BorderRight-82;
- ng.ng_GadgetText = "Cancel";
- ng.ng_GadgetID = 1;
-
- gad = CreateGadget(BUTTON_KIND,gad,&ng,TAG_END);
-
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize);
- ng.ng_LeftEdge = 2+win->BorderLeft+(scn->RastPort.TxWidth*7);
- ng.ng_GadgetID = 3;
- ng.ng_Width = 120;
- ng.ng_Height = scn->Font->ta_YSize + 6;
- ng.ng_GadgetText = "Red:";
-
- rslidergad = CreateGadget(SLIDER_KIND,gad,&ng,GTSL_Min,-255,GTSL_Max,255,GTSL_Level,rval,
- GA_Disabled,((giodata->Channels & 1)==0),
- 0);
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize*3);
- ng.ng_GadgetID = 4;
- ng.ng_GadgetText = "Green:";
-
- gslidergad = CreateGadget(SLIDER_KIND,rslidergad,&ng,GTSL_Min,-255,GTSL_Max,255,GTSL_Level,gval,
- GA_Disabled,((giodata->Channels & 2)==0),
- 0);
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize*5);
- ng.ng_GadgetID = 5;
- ng.ng_GadgetText = "Blue:";
-
- bslidergad = CreateGadget(SLIDER_KIND,gslidergad,&ng,GTSL_Min,-255,GTSL_Max,255,GTSL_Level,bval,
- GA_Disabled,((giodata->Channels & 4)==0),
- 0);
-
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize);
- ng.ng_LeftEdge = 126+win->BorderLeft+(scn->RastPort.TxWidth*7);
- ng.ng_GadgetID = 6;
- ng.ng_Width = (scn->RastPort.TxWidth*6);
-
- ng.ng_GadgetText = "";
-
- rnumgad = CreateGadget(INTEGER_KIND,bslidergad,&ng,GTIN_Number,rval,GTIN_MaxChars,4,
- GA_Disabled,((giodata->Channels & 1)==0),
- 0);
-
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize*3);
- ng.ng_GadgetID = 7;
- gnumgad = CreateGadget(INTEGER_KIND,rnumgad,&ng,GTIN_Number,gval,GTIN_MaxChars,4,
- GA_Disabled,((giodata->Channels & 2)==0),
- 0);
-
- ng.ng_TopEdge = win->BorderTop+6+(scn->Font->ta_YSize*5);
- ng.ng_GadgetID = 8;
- bnumgad = CreateGadget(INTEGER_KIND,gnumgad,&ng,GTIN_Number,bval,GTIN_MaxChars,4,
- GA_Disabled,((giodata->Channels & 4)==0),
- 0);
-
- AddGList(win,glist,0,-1,0);
- RefreshGList(glist,win,0,-1);
- GT_RefreshWindow(win,NULL);
-
- DrawBevelBox(win->RPort,134+win->BorderLeft+(scn->RastPort.TxWidth*13),
- win->BorderTop+6,68,66,GT_VisualInfo,vi);
-
- preview_balance(giodata,win);
-
- UnlockPubScreen(0,scn);
-
- if(!win)
- {
- Error("Unable to open histogram window!");
- return(giodata->Error = GIO_ABORTED);
- }
-
- handlemessages(giodata,win);
-
- CloseWindow(win);
-
- if(giodata->Error == GIO_OK) apply_balance(giodata);
-
- FreeGadgets(glist);
-
- FreeVisualInfo(vi);
-
- }
-
- err:
-
- if(preview) FreePreviewImage(giodata);
- if(preview2) FreeVec(preview2);
-
- return(giodata->Error);
- }
-
- __asm ULONG EfxPreRender(register __a0 struct GIOData *giodata)
- {
- return(0);
- }
-
- __asm ULONG EfxPrefs(register __a0 struct GIOData *giodata)
- {
- return(0);
- }
-
- void handlemessages(struct GIOData *giodata, struct Window *win)
- {
- struct IntuiMessage *msg;
- struct Gadget *gad;
- BOOL flag = TRUE;
- BOOL repreview = FALSE;
-
- while(flag)
- {
- WaitPort(win->UserPort);
- while(msg = GT_GetIMsg(win->UserPort))
- {
- switch(msg->Class)
- {
- case IDCMP_GADGETUP:
- gad = (struct Gadget *) msg->IAddress;
- switch(gad->GadgetID)
- {
- case 0: // Accept
- flag = FALSE;
- break;
- case 1: // cancel
-
- flag = FALSE;
- giodata->Error = GIO_ABORTED;
- break;
-
- case 3:
- rval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(rnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
- case 4:
- gval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(gnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
- case 5:
- bval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(bnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
-
- case 6:
- rval = ((struct StringInfo *) gad->SpecialInfo)->LongInt;
- repreview= TRUE;
- GT_SetGadgetAttrs(rslidergad,win,0,GTSL_Level,rval,TAG_DONE);
- break;
- case 7:
- gval = ((struct StringInfo *) gad->SpecialInfo)->LongInt;
- repreview= TRUE;
- GT_SetGadgetAttrs(gslidergad,win,0,GTSL_Level,gval,TAG_DONE);
- break;
- case 8:
- bval = ((struct StringInfo *) gad->SpecialInfo)->LongInt;
- repreview= TRUE;
- GT_SetGadgetAttrs(bslidergad,win,0,GTSL_Level,bval,TAG_DONE);
- break;
- }
- break;
- case IDCMP_CLOSEWINDOW:
- flag = FALSE;
- giodata->Error = GIO_ABORTED;
- break;
-
-
- case IDCMP_MOUSEMOVE:
- gad = (struct Gadget *) msg->IAddress;
- if(gad)
- {
- switch(gad->GadgetID) {
- case 3:
- rval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(rnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
- case 4:
- gval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(gnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
- case 5:
- bval = msg->Code;
- repreview= TRUE;
- GT_SetGadgetAttrs(bnumgad,win,0,GTIN_Number,(WORD) msg->Code,TAG_DONE);
- break;
- }
- }
- break;
-
- case IDCMP_REFRESHWINDOW:
- GT_BeginRefresh(win);
- GT_EndRefresh(win,TRUE);
- break;
- }
- GT_ReplyIMsg(msg);
-
- }
- if(repreview) {preview_balance(giodata,win); repreview = FALSE;}
-
- }
- }
-
-
- void apply_balance(struct GIOData *giodata)
- {
- UBYTE r,g,b;
- int x,y;
- int r2,g2,b2;
-
- SetProgress("Changing colour balance..",0);
-
- for(y=giodata->WindY;y<giodata->WindY+giodata->WindHeight;y++)
- {
-
- if(!(y%16)) SetProgress(0,(y-giodata->WindY)*100/giodata->WindHeight);
-
-
- for(x=giodata->WindX;x<giodata->WindX+giodata->WindWidth;x++)
- {
- GetSrcPixel(giodata,x,y,&r,&g,&b);
-
- if(rval)
- {
- r2 = r+rval;
- r2 = min(max(r2,0),255);
- } else r2 = r;
-
- if(gval)
- {
- g2 = g+gval;
- g2 = min(max(g2,0),255);
- } else g2 = g;
-
- if(bval)
- {
- b2 = b+bval;
- b2 = min(max(b2,0),255);
- } else b2 = b;
-
- PutDestPixel(giodata,x,y,r2,g2,b2);
- }
- }
- }
-
-
-
- void preview_balance(struct GIOData *giodata,struct Window *win)
- {
- UBYTE r,g,b;
- int x,y;
- int r2,g2,b2;
-
- for(y=0;y<64;y++)
- {
-
- for(x=0;x<64;x++)
- {
-
- r = preview[x*3+(y*192)];
- g = preview[x*3+(y*192)+1];
- b = preview[x*3+(y*192)+2];
-
- if(rval)
- { r2 = r+rval;
- r2 = min(max(r2,0),255);
- } else r2 = r;
-
- if(gval)
- {
- g2 = g+gval;
- g2 = min(max(g2,0),255);
- } else g2 = g;
-
- if(bval)
- {
- b2 = b+bval;
- b2 = min(max(b2,0),255);
- } else b2 = b;
-
- preview2[x*3+(y*192)] = r2;
- preview2[x*3+(y*192)+1] = g2;
- preview2[x*3+(y*192)+2] = b2;
- }
- }
-
- DrawPreviewImage(giodata,win->RPort,preview2,136+win->BorderLeft+(win->WScreen->RastPort.TxWidth*13),
- win->BorderTop+7,64,64);
- }
-