home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Graphics / PPT / pluginsrc / transparency / transparency.c < prev   
C/C++ Source or Header  |  2000-02-06  |  39KB  |  1,019 lines

  1. /*----------------------------------------------------------------------*/
  2. /*
  3.     PROJECT: ppt effects
  4.     MODULE : Transparency
  5.  
  6.     PPT and this file are (C) Janne Jalkanen 1995-1999.
  7.  
  8.     $Id: transparency.c 3.0 2000/02/06 19:18:04 jj Exp jj $
  9.  
  10. */
  11. /*----------------------------------------------------------------------*/
  12.  
  13. #undef DEBUG_MODE
  14.  
  15. /// Definitions and includes
  16. /*----------------------------------------------------------------------*/
  17. /* Includes */
  18.  
  19. #include <pptplugin.h>
  20. #define GAD(x)  ((struct Gadget *)x)
  21.  
  22. #include <gadgets/colorwheel.h>
  23. #include <gadgets/gradientslider.h>
  24. #include <graphics/gfxbase.h>
  25. #include <libraries/gadtools.h>
  26.  
  27. #include <proto/colorwheel.h>
  28. #include <proto/graphics.h>
  29.  
  30. /*----------------------------------------------------------------------*/
  31. /* Defines */
  32.  
  33. /*
  34.     You should define this to your module name. Try to use something
  35.     short, as this is the name that is visible in the PPT filter listing.
  36. */
  37.  
  38. #define MYNAME      "Transparency"
  39.  
  40. #define GID_OK              1
  41. #define GID_CANCEL          2
  42. #define GID_TRANSPARENCY    3
  43. #define GID_TRANSPARENCYI   4
  44. #define GID_WHEEL           5
  45. #define GID_RED             6
  46. #define GID_REDI            7
  47. #define GID_GREEN           8
  48. #define GID_GREENI          9
  49. #define GID_BLUE            10
  50. #define GID_BLUEI           11
  51. #define GID_GRADIENTSLIDER  12
  52. #define GID_BLACK           13
  53. #define GID_WHITE           14
  54. #define GID_BACKGROUND      15
  55. #define GID_ALL             16
  56. #define GID_TOLERANCE       17
  57. #define GID_TOLERANCEI      18
  58.  
  59. #define GRADCOLORS          4
  60.  
  61. /*----------------------------------------------------------------------*/
  62. /* Internal type definitions */
  63.  
  64. /*
  65.     Contains also window pointers and library bases.
  66.  */
  67. struct Objects {
  68.     Object              *Win;
  69.     struct Window       *win;
  70.     Object              *Trans, *TransI, *Gradient, *RealGradient;
  71.     Object              *Wheel, *Red, *Green, *Blue;
  72.     Object              *RedI, *GreenI, *BlueI, *Cycle;
  73.     Object              *All, *Tolerance, *ToleranceI;
  74.     struct Library      *ColorWheelBase, *GradientSliderBase;
  75.     int                 numpens;
  76.     WORD                pens[GRADCOLORS+1];
  77.     char                wtitle[80];
  78. };
  79.  
  80. struct Values {
  81.     ULONG               transp;
  82.     ULONG               r,g,b;
  83.     ULONG               tolerance;
  84.     ULONG               mode;
  85.     struct IBox         window;
  86.     BOOL                background;
  87. };
  88.  
  89. #define MODE_ALL        0   /* All colors are set */
  90. #define MODE_EXACT      1   /* Only exact matches are allowed */
  91.  
  92. /*
  93.     For LoadRGB32()
  94.  */
  95.  
  96. struct load32 {
  97.         UWORD           l32_len;
  98.         UWORD           l32_pen;
  99.         ULONG           l32_red;
  100.         ULONG           l32_grn;
  101.         ULONG           l32_blu;
  102. };
  103.  
  104. /*----------------------------------------------------------------------*/
  105. /* Internal prototypes */
  106.  
  107.  
  108. ///
  109.  
  110. /*----------------------------------------------------------------------*/
  111. /* Global variables. Generally, you should keep these to the minimum,
  112.    as it may well be that two copies of this same code is run at
  113.    the same time. */
  114.  
  115. /*
  116.     Just a simple string describing this effect.
  117. */
  118.  
  119. const char infoblurb[] =
  120.     "Sets up transparency information.";
  121.  
  122. /*
  123.     This is the global array describing your effect. For a more detailed
  124.     description on how to interpret and use the tags, see docs/tags.doc.
  125. */
  126.  
  127. const struct TagItem MyTagArray[] = {
  128.     /*
  129.      *  Here are some pretty standard definitions. All filters should have
  130.      *  these defined.
  131.      */
  132.  
  133.     PPTX_Name,              (ULONG) MYNAME,
  134.  
  135.     /*
  136.      *  Other tags go here. These are not required, but very useful to have.
  137.      */
  138.  
  139.     PPTX_Author,            (ULONG)"Janne Jalkanen, 1997-2000",
  140.     PPTX_InfoTxt,           (ULONG)infoblurb,
  141.  
  142.     PPTX_RexxTemplate,      (ULONG)"R=RED/N,G=GREEN/N,B=BLUE/N,TRANS=T/N,BACKGROUND/S,ALL/S,TOLERANCE=TOL/N",
  143.  
  144.     PPTX_ColorSpaces,       CSF_RGB|CSF_ARGB,
  145.  
  146.     PPTX_SupportsGetArgs,   TRUE,
  147.  
  148.     PPTX_NoNewFrame,        TRUE,
  149.  
  150.     TAG_END, 0L
  151. };
  152.  
  153. const ULONG dpcol_sl2int[] = { SLIDER_Level, STRINGA_LongVal, TAG_END };
  154. const ULONG dpcol_int2sl[] = { STRINGA_LongVal, SLIDER_Level, TAG_END };
  155.  
  156. struct NewMenu mymenus[] = {
  157.     Title( "Project" ),
  158.         Item("Quit",        "Q",    GID_CANCEL ),
  159.     Title( "Presets" ),
  160.         Item("Black",       "1",     GID_BLACK ),
  161.         Item("White",       "2",     GID_WHITE ),
  162.         Item("Background",  "0",     GID_BACKGROUND ),
  163.         Item("All",         "A",     GID_ALL ),
  164.     End
  165. };
  166.  
  167. /*----------------------------------------------------------------------*/
  168. /* Code */
  169.  
  170. #ifdef __SASC
  171. /* Disable SAS/C control-c handling. */
  172. void __regargs __chkabort(void) {}
  173. void __regargs _CXBRK(void) {}
  174. #endif
  175.  
  176. /*
  177.     This routine is called upon the OpenLibrary() the software
  178.     makes.  You could use this to open up your own libraries
  179.     or stuff.
  180.  
  181.     Return 0 if everything went OK or something else if things
  182.     failed.
  183. */
  184.  
  185. LIBINIT
  186. {
  187.     return 0;
  188. }
  189.  
  190.  
  191. LIBCLEANUP
  192. {
  193. }
  194.  
  195. EFFECTINQUIRE(attr,PPTBase,EffectBase)
  196. {
  197.     return TagData( attr, MyTagArray );
  198. }
  199.  
  200. /// DoTransparency
  201. #define SQR(x) ((x)*(x))
  202.  
  203. FRAME *DoTransparency( FRAME *frame, struct Values *v, struct PPTBase *PPTBase)
  204. {
  205.     FRAME *newframe = NULL;
  206.     BOOL  hasalpha = FALSE;
  207.     ULONG tol;
  208.  
  209.     tol = SQR(v->tolerance);
  210.  
  211.     if( frame->pix->colorspace == CS_ARGB )
  212.         hasalpha = TRUE;
  213.  
  214.     // PDebug(MYNAME": Exec()\n");
  215.  
  216.     newframe = MakeFrame( frame );
  217.     if(newframe) {
  218.         newframe->pix->colorspace = CS_ARGB;
  219.         newframe->pix->components = 4;
  220.  
  221.         if( InitFrame( newframe ) == PERR_OK ) {
  222.             WORD row;
  223.  
  224.             InitProgress(frame,"Setting up transparency...",0,frame->pix->height);
  225.  
  226.             for( row = 0; row < frame->pix->height; row++ ) {
  227.                 RGBPixel *cp;
  228.                 ARGBPixel *dcp, *acp;
  229.                 WORD col;
  230.                 BOOL isin;
  231.  
  232.                 if( Progress(frame, row) ) {
  233.                     RemFrame(newframe);
  234.                     newframe = NULL;
  235.                     break;
  236.                 }
  237.  
  238.                 cp = (RGBPixel *)GetPixelRow( frame, row );
  239.                 acp = (ARGBPixel *)cp;
  240.                 dcp = (ARGBPixel *)GetPixelRow( newframe, row );
  241.  
  242.                 /*
  243.                  *  Loopety loop.  If the pixel to be set is exactly
  244.                  *  the color, then set the transparency.
  245.                  */
  246.  
  247.                 for( col = 0; col < frame->pix->width; col++ ) {
  248.                     ULONG dist;
  249.  
  250.                     /*
  251.                      *  Check if we're inside selbox
  252.                      */
  253.  
  254.                     if( row >= frame->selbox.MinY && row < frame->selbox.MaxY &&
  255.                         col >= frame->selbox.MinX && col < frame->selbox.MaxX ){
  256.                         isin = TRUE;
  257.                     } else {
  258.                         isin = FALSE;
  259.                     }
  260.  
  261.                     /*
  262.                      *  Set the alpha channel, if we're inside the selbox
  263.                      */
  264.                     if( hasalpha ) {
  265.                         dist = SQR((WORD)((WORD)acp->r - v->r))+
  266.                                SQR((WORD)((WORD)acp->g - v->g))+
  267.                                SQR((WORD)((WORD)acp->b - v->b));
  268.  
  269.                         if( (v->mode == MODE_ALL || dist <= tol) && isin)
  270.                         {
  271.                             dcp->a = (UBYTE) v->transp;
  272.                         } else {
  273.                             dcp->a = acp->a; /* Retain transparency */
  274.                         }
  275.                         dcp->r = acp->r;
  276.                         dcp->g = acp->g;
  277.                         dcp->b = acp->b;
  278.                         acp++;
  279.                         dcp++;
  280.                     } else {
  281.                         dist = SQR((WORD)((WORD)cp->r - v->r))+
  282.                                SQR((WORD)((WORD)cp->g - v->g))+
  283.                                SQR((WORD)((WORD)cp->b - v->b));
  284.  
  285.                         if( (v->mode == MODE_ALL || dist <= tol) && isin)
  286.                         {
  287.                             dcp->a = (UBYTE) v->transp;
  288.                         } else {
  289.                             dcp->a = 0; /* No transparency */
  290.                         }
  291.                         dcp->r = cp->r;
  292.                         dcp->g = cp->g;
  293.                         dcp->b = cp->b;
  294.                         cp++;
  295.                         dcp++;
  296.                     }
  297.                 }
  298.  
  299.                 PutPixelRow( newframe, row, dcp );
  300.             }
  301.  
  302.             FinishProgress(frame);
  303.  
  304.         } else {
  305.             RemFrame(newframe);
  306.             newframe = NULL;
  307.         }
  308.     }
  309.  
  310.     return newframe;
  311.  
  312. }
  313. ///
  314. /// DoGadgets
  315. VOID DoGadgets( FRAME *frame, struct Objects *o, struct Values *v, struct PPTBase *PPTBase)
  316. {
  317.     struct IntuitionBase *IntuitionBase = PPTBase->lb_Intuition;
  318.     ULONG tmp;
  319.  
  320.     GetAttr( SLIDER_Level, o->Trans, &v->transp);
  321.     GetAttr( SLIDER_Level, o->Red, &v->r);
  322.     GetAttr( SLIDER_Level, o->Green, &v->g);
  323.     GetAttr( SLIDER_Level, o->Blue, &v->b);
  324.     GetAttr( GA_Selected,  o->All, &tmp );
  325.     GetAttr( SLIDER_Level, o->Tolerance, &v->tolerance );
  326.     if( tmp ) v->mode = MODE_ALL; else v->mode = MODE_EXACT;
  327. }
  328. ///
  329. /// OpenGUI
  330. /*
  331.     The following cases apply:
  332.  
  333.     Make black transparent
  334.     Make white transparent
  335.     Make any color transparent
  336.     Make background transparent
  337.  */
  338. PERROR OpenGUI(FRAME *frame, struct Objects *o, struct Values *v, struct PPTBase *PPTBase)
  339. {
  340.     struct Library *BGUIBase = PPTBase->lb_BGUI;
  341.     struct Screen *scr = PPTBase->g->maindisp->scr;
  342.     struct Library *ColorWheelBase = o->ColorWheelBase;
  343.     struct GfxBase *GfxBase = PPTBase->lb_Gfx;
  344.     struct IntuitionBase *IntuitionBase = PPTBase->lb_Intuition;
  345.     BOOL   V39 = FALSE;
  346.     struct ColorWheelRGB rgb;
  347.     struct ColorWheelHSB hsb;
  348.  
  349.     sprintf(o->wtitle, MYNAME ": %s", frame->name );
  350.  
  351.     if( PPTBase->lb_Gfx->LibNode.lib_Version >= 39 ) {
  352.         int i;
  353.  
  354.         V39 = TRUE;
  355.         rgb.cw_Red   = 0;
  356.         rgb.cw_Green = 0;
  357.         rgb.cw_Blue  = 0;
  358.         ConvertRGBToHSB( &rgb, &hsb );
  359.  
  360.         for( i = 0; i < GRADCOLORS; i++ ) {
  361.             hsb.cw_Brightness = (ULONG)0xffffffff - (((ULONG)0xffffffff / GRADCOLORS ) * i );
  362.             ConvertHSBToRGB( &hsb, &rgb );
  363.             if( -1 == (o->pens[i] = ObtainBestPen( scr->ViewPort.ColorMap,
  364.                                                   rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue,
  365.                                                   TAG_DONE ) ) ) {
  366.                 break;
  367.             }
  368.         }
  369.         o->pens[i] = ~0;
  370.         o->numpens = i;
  371.  
  372.         o->Gradient = ExternalObject,
  373.             GA_ID,          GID_GRADIENTSLIDER,
  374.             EXT_MinWidth,   10,
  375.             EXT_MinHeight,  10,
  376.             EXT_ClassID,    "gradientslider.gadget",
  377.             EXT_NoRebuild,  TRUE,
  378.             GRAD_PenArray,  o->pens,
  379.             PGA_Freedom,    LORIENT_VERT,
  380.         EndObject;
  381.  
  382.         if( o->Gradient )
  383.             GetAttr( EXT_Object, o->Gradient, (ULONG *) &o->RealGradient );
  384.     }
  385.  
  386.     o->Win = WindowObject,
  387.         WINDOW_Screen,      scr,
  388.         WINDOW_Title,       o->wtitle,
  389.         WINDOW_ScreenTitle, "Transparency: Click on the image to choose a color",
  390.         v->window.Height ? TAG_IGNORE : TAG_SKIP, 1,
  391.         WINDOW_Bounds,      &v->window,
  392.  
  393.         WINDOW_ScaleWidth,  30,
  394.         WINDOW_NoBufferRP,  TRUE,
  395.         WINDOW_MenuStrip,   mymenus,
  396.         // WINDOW_HelpFile,    "Docs/effects.guide",
  397.         // WINDOW_HelpNode,    "Transparency",
  398.         // WINDOW_HelpText,    infoblurb,
  399.         WINDOW_CloseOnEsc,  TRUE,
  400.         WINDOW_MasterGroup,
  401.             VGroupObject, Spacing(4), HOffset(6), VOffset(4),
  402.                 StartMember,
  403.                     HGroupObject, Spacing(6),
  404.                         StartMember,
  405.                             VGroupObject, Spacing(4),
  406.                                 StartMember,
  407.                                     InfoObject,
  408.                                         INFO_TextFormat, ISEQ_C "Please, do select\n"
  409.                                                          "which color should be\n"
  410.                                                          "transparent:",
  411.                                         INFO_MinLines, 3,
  412.                                         ButtonFrame, FRM_Flags, FRF_RECESSED,
  413.                                     EndObject,
  414.                                     LGO_NoAlign, TRUE,
  415.                                 EndMember,
  416.                                 VarSpace(25),
  417.                                 StartMember,
  418.                                     VGroupObject,
  419.                                         StartMember,
  420.                                             HGroupObject, Spacing(3),
  421.                                                 StartMember,
  422.                                                     o->Red = SliderObject,
  423.                                                         GA_ID, GID_RED,
  424.                                                         Label("Red"), Place(PLACE_LEFT),
  425.                                                         SLIDER_Min, 0,
  426.                                                         SLIDER_Max, 255,
  427.                                                         SLIDER_Level, v->r,
  428.                                                     EndObject,
  429.                                                 EndMember,
  430.                                                 StartMember,
  431.                                                     o->RedI = StringObject,
  432.                                                         GA_ID, GID_REDI,
  433.                                                         STRINGA_MinCharsVisible,4,
  434.                                                         STRINGA_MaxChars, 3,
  435.                                                         STRINGA_IntegerMin, 0,
  436.                                                         STRINGA_IntegerMax, 255,
  437.                                                         STRINGA_LongVal, v->r,
  438.                                                     EndObject, Weight(1),
  439.                                                 EndMember,
  440.                                             EndObject, FixMinHeight,
  441.                                         EndMember,
  442.                                         StartMember,
  443.                                             HGroupObject, Spacing(3),
  444.                                                 StartMember,
  445.                                                     o->Green = SliderObject,
  446.                                                         GA_ID, GID_GREEN,
  447.                                                         Label("Green"), Place(PLACE_LEFT),
  448.                                                         SLIDER_Min, 0,
  449.                                                         SLIDER_Max, 255,
  450.                                                         SLIDER_Level, v->g,
  451.                                                     EndObject,
  452.                                                 EndMember,
  453.                                                 StartMember,
  454.                                                     o->GreenI = StringObject,
  455.                                                         GA_ID, GID_GREENI,
  456.                                                         STRINGA_MinCharsVisible,4,
  457.                                                         STRINGA_MaxChars, 3,
  458.                                                         STRINGA_IntegerMin, 0,
  459.                                                         STRINGA_IntegerMax, 255,
  460.                                                         STRINGA_LongVal, v->g,
  461.                                                     EndObject, Weight(1),
  462.                                                 EndMember,
  463.                                             EndObject, FixMinHeight,
  464.                                         EndMember,
  465.                                         StartMember,
  466.                                             HGroupObject, Spacing(3),
  467.                                                 StartMember,
  468.                                                     o->Blue = SliderObject,
  469.                                                         GA_ID, GID_BLUE,
  470.                                                         Label("Blue"), Place(PLACE_LEFT),
  471.                                                         SLIDER_Min, 0,
  472.                                                         SLIDER_Max, 255,
  473.                                                         SLIDER_Level, v->b,
  474.                                                     EndObject,
  475.                                                 EndMember,
  476.                                                 StartMember,
  477.                                                     o->BlueI = StringObject,
  478.                                                         GA_ID, GID_BLUEI,
  479.                                                         STRINGA_MinCharsVisible,4,
  480.                                                         STRINGA_MaxChars, 3,
  481.                                                         STRINGA_IntegerMin, 0,
  482.                                                         STRINGA_IntegerMax, 255,
  483.                                                         STRINGA_LongVal, v->b,
  484.                                                     EndObject, Weight(1),
  485.                                                 EndMember,
  486.                                             EndObject,  FixMinHeight,
  487.                                         EndMember,
  488.                                      EndObject,
  489.                                 EndMember,
  490.                                 VarSpace(25),
  491.                             EndObject,  LGO_NoAlign, TRUE,
  492.                         EndMember,
  493.                         (V39) ? TAG_IGNORE : TAG_SKIP, 2,
  494.                         StartMember,
  495.                             o->Wheel = ExternalObject,
  496.                                 EXT_MinWidth,           30,
  497.                                 EXT_MinHeight,          30,
  498.                                 EXT_ClassID,            "colorwheel.gadget",
  499.                                 WHEEL_Screen,           scr,
  500.                                 /*
  501.                                 **      Pass a pointer to the "real" gradient slider
  502.                                 **      here.
  503.                                 **/
  504.                                 WHEEL_GradientSlider,   o->RealGradient,
  505.                                 WHEEL_Red,              v->r * 0x01010101,
  506.                                 WHEEL_Green,            v->g * 0x01010101,
  507.                                 WHEEL_Blue,             v->b * 0x01010101,
  508.                                 GA_FollowMouse,         TRUE,
  509.                                 GA_ID,                  GID_WHEEL,
  510.                                 /*
  511.                                 **      These attributes of the colorwheel are
  512.                                 **      tracked and reset to the object after
  513.                                 **      it has been rebuild. This way the current
  514.                                 **      colorwheel internals will not be lost
  515.                                 **      after the object is re-build.
  516.                                 **/
  517.                                 EXT_TrackAttr,          WHEEL_Red,
  518.                                 EXT_TrackAttr,          WHEEL_Green,
  519.                                 EXT_TrackAttr,          WHEEL_Blue,
  520.                                 EXT_TrackAttr,          WHEEL_Hue,
  521.                                 EXT_TrackAttr,          WHEEL_Saturation,
  522.                                 EXT_TrackAttr,          WHEEL_Brightness,
  523.                             EndObject,
  524.                         EndMember,
  525.                         (V39) ? TAG_IGNORE : TAG_SKIP, 3,
  526.                         StartMember,
  527.                             o->Gradient, FixWidth(20),
  528.                         EndMember,
  529.                     EndObject, LGO_NoAlign, TRUE,
  530.                 EndMember,
  531.                 StartMember,
  532.                     HGroupObject,
  533.                         StartMember,
  534.                             o->Trans = SliderObject,
  535.                                 GA_ID, GID_TRANSPARENCY,
  536.                                 Label("Transparency:"), Place(PLACE_LEFT),
  537.                                 SLIDER_Min, 0,
  538.                                 SLIDER_Max, 255,
  539.                                 SLIDER_Level, v->transp,
  540.                             EndObject,
  541.                         EndMember,
  542.                         StartMember,
  543.                             o->TransI = StringObject,
  544.                                 GA_ID, GID_TRANSPARENCYI,
  545.                                 STRINGA_MinCharsVisible,4,
  546.                                 STRINGA_MaxChars, 3,
  547.                                 STRINGA_IntegerMin, 0,
  548.                                 STRINGA_IntegerMax, 255,
  549.                                 STRINGA_LongVal, v->transp,
  550.                             EndObject, Weight(1),
  551.                         EndMember,
  552.                     EndObject, FixMinHeight,
  553.                 EndMember,
  554.                 StartMember,
  555.                     HGroupObject, NormalSpacing,
  556.                         StartMember,
  557.                             o->All = CheckBoxObject,
  558.                                 GA_ID, GID_ALL,
  559.                                 Label("All colors?"),
  560.                                 GA_Selected, (v->mode == MODE_ALL) ? TRUE : FALSE,
  561.                             EndObject, Weight(1),
  562.                         EndMember,
  563.                         StartMember,
  564.                             o->Tolerance = SliderObject,
  565.                                 GA_ID, GID_TOLERANCE,
  566.                                 Label("Tolerance:"), Place(PLACE_LEFT),
  567.                                 SLIDER_Min, 0,
  568.                                 SLIDER_Max, 255,
  569.                                 SLIDER_Level, v->tolerance,
  570.                             EndObject,
  571.                         EndMember,
  572.                         StartMember,
  573.                             o->ToleranceI = StringObject,
  574.                                 GA_ID, GID_TOLERANCEI,
  575.                                 STRINGA_MinCharsVisible, 4,
  576.                                 STRINGA_MaxChars, 3,
  577.                                 STRINGA_IntegerMin, 0,
  578.                                 STRINGA_IntegerMax, 255,
  579.                                 STRINGA_LongVal, v->tolerance,
  580.                             EndObject, Weight(1),
  581.                         EndMember,
  582.                     EndObject, FixMinHeight,
  583.                 EndMember,
  584.                 StartMember,
  585.                     HorizSeparator,
  586.                 EndMember,
  587.                 StartMember,
  588.                     HGroupObject,
  589.                         StartMember,
  590.                             ButtonObject,
  591.                                 GA_ID, GID_OK,
  592.                                 Label("OK"), Place(PLACE_IN),
  593.                             EndObject,
  594.                         EndMember,
  595.                         VarSpace(DEFAULT_WEIGHT/2),
  596.                         StartMember,
  597.                             ButtonObject,
  598.                                 GA_ID, GID_CANCEL,
  599.                                 Label("Cancel"), Place(PLACE_IN),
  600.                             EndObject,
  601.                         EndMember,
  602.                     EndObject, FixMinHeight,
  603.                 EndMember,
  604.             EndObject,
  605.     EndObject;
  606.  
  607.     if( o->Win ) {
  608.  
  609.         /*
  610.          *  Attach the gadgets unto each other
  611.          */
  612.  
  613.         AddMap( o->Trans, o->TransI, dpcol_sl2int );
  614.         AddMap( o->TransI,o->Trans,  dpcol_int2sl );
  615.         AddMap( o->Red, o->RedI, dpcol_sl2int );
  616.         AddMap( o->RedI,o->Red,  dpcol_int2sl );
  617.         AddMap( o->Green, o->GreenI, dpcol_sl2int );
  618.         AddMap( o->GreenI,o->Green,  dpcol_int2sl );
  619.         AddMap( o->Blue, o->BlueI, dpcol_sl2int );
  620.         AddMap( o->BlueI,o->Blue,  dpcol_int2sl );
  621.         AddMap( o->Tolerance, o->ToleranceI, dpcol_sl2int );
  622.         AddMap( o->ToleranceI,o->Tolerance,  dpcol_int2sl );
  623.  
  624.         AddCondit( o->All, o->Red, GA_Selected, FALSE,
  625.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  626.         AddCondit( o->All, o->RedI, GA_Selected, FALSE,
  627.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  628.         AddCondit( o->All, o->Green, GA_Selected, FALSE,
  629.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  630.         AddCondit( o->All, o->GreenI, GA_Selected, FALSE,
  631.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  632.         AddCondit( o->All, o->Blue, GA_Selected, FALSE,
  633.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  634.         AddCondit( o->All, o->BlueI, GA_Selected, FALSE,
  635.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  636.         AddCondit( o->All, o->ToleranceI, GA_Selected, FALSE,
  637.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  638.         AddCondit( o->All, o->Tolerance, GA_Selected, FALSE,
  639.                    GA_Disabled, FALSE, GA_Disabled, TRUE );
  640.         if(V39) {
  641.             AddCondit( o->All, o->Wheel, GA_Selected, FALSE,
  642.                        GA_Disabled, FALSE, GA_Disabled, TRUE );
  643.             AddCondit( o->All, o->Gradient, GA_Selected, FALSE,
  644.                        GA_Disabled, FALSE, GA_Disabled, TRUE );
  645.         }
  646.  
  647.         if( o->win = WindowOpen(o->Win) ) {
  648.             /* This sets the other gadgets disabled or enabled */
  649.             SetGadgetAttrs( (struct Gadget *)o->All, o->win, NULL,
  650.                             GA_Selected, (v->mode == MODE_ALL) ? TRUE : FALSE, TAG_DONE );
  651.         } else {
  652.             DisposeObject(o->Win);
  653.         }
  654.     }
  655.  
  656.     return (BOOL)(o->win ? PERR_OK : PERR_WINDOWOPEN);
  657. }
  658. ///
  659. /// GetBackGround
  660. VOID GetBackGround( FRAME *frame, struct Values *v, struct PPTBase *PPTBase)
  661. {
  662.     if( frame->pix->colorspace == CS_RGB ) {
  663.         RGBPixel cp;
  664.         GetBackgroundColor(frame, (ROWPTR)&cp);
  665.         v->r = cp.r;
  666.         v->g = cp.g;
  667.         v->b = cp.b;
  668.     } else {
  669.         ARGBPixel cp;
  670.         GetBackgroundColor(frame, (ROWPTR)&cp);
  671.         v->r = cp.r;
  672.         v->g = cp.g;
  673.         v->b = cp.b;
  674.     }
  675.  
  676.     v->background = TRUE;
  677. }
  678. ///
  679. /// HandleIDMCP
  680. PERROR HandleIDCMP( FRAME *frame, struct Objects *o, struct Values *v, struct PPTBase *PPTBase )
  681. {
  682.     ULONG sig, sigmask, sigport = 0L;
  683.     struct Library *ColorWheelBase = o->ColorWheelBase;
  684.     struct IntuitionBase *IntuitionBase = PPTBase->lb_Intuition;
  685.     BOOL V39 = FALSE;
  686.  
  687.     if( PPTBase->lb_Gfx->LibNode.lib_Version >= 39 && ColorWheelBase )
  688.         V39 = TRUE;
  689.  
  690.     if(StartInput(frame, GINP_PICK_POINT, NULL) == PERR_OK)
  691.         sigport = (1 << PPTBase->mport->mp_SigBit);
  692.  
  693.     GetAttr( WINDOW_SigMask, o->Win, &sigmask );
  694.     for(;;) {
  695.  
  696.         sig = Wait( sigport|sigmask|SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F );
  697.  
  698.         if( sig & SIGBREAKF_CTRL_C ) {
  699.             SetErrorCode( frame, PERR_BREAK );
  700.             DisposeObject( o->Win );
  701.             StopInput(frame);
  702.             return PERR_BREAK;
  703.         }
  704.  
  705.         if( sig & SIGBREAKF_CTRL_F ) {
  706.             WindowToFront( o->win );
  707.             ActivateWindow( o->win );
  708.         }
  709.  
  710.         if( sig & sigport ) {
  711.             struct gPointMessage *gp;
  712.  
  713.             gp = (struct gPointMessage*)GetMsg(PPTBase->mport);
  714.  
  715.             /*
  716.              *  Ignore all other types of messages, except pickpoints.
  717.              */
  718.  
  719.             if( gp->msg.code == PPTMSG_PICK_POINT ) {
  720.                 D(bug("User picked point (%d,%d)\n",gp->x,gp->y));
  721.  
  722.                 if( frame->pix->colorspace == CS_RGB ) {
  723.                     RGBPixel *cp;
  724.  
  725.                     cp = (RGBPixel *)GetPixelRow( frame, gp->y );
  726.                     SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, cp[gp->x].r, TAG_DONE );
  727.                     SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, cp[gp->x].g, TAG_DONE );
  728.                     SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, cp[gp->x].b, TAG_DONE );
  729.                 } else {
  730.                     ARGBPixel *cp;
  731.  
  732.                     cp = (ARGBPixel *)GetPixelRow( frame, gp->y );
  733.                     SetGadgetAttrs( GAD(o->Trans), o->win, NULL, SLIDER_Level, cp[gp->x].a, TAG_DONE );
  734.                     SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, cp[gp->x].r, TAG_DONE );
  735.                     SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, cp[gp->x].g, TAG_DONE );
  736.                     SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, cp[gp->x].b, TAG_DONE );
  737.                 }
  738.  
  739.                 v->background = FALSE;
  740.             }
  741.  
  742.             ReplyMsg( (struct Message *)gp );
  743.         }
  744.  
  745.         if( sig & sigmask ) {
  746.             ULONG rc, tmp;
  747.             struct ColorWheelRGB rgb;
  748.             struct ColorWheelHSB hsb;
  749.  
  750.             while(( rc = HandleEvent( o->Win )) != WMHI_NOMORE ) {
  751.                 switch(rc) {
  752.                     case WMHI_CLOSEWINDOW:
  753.                     case GID_CANCEL:
  754.                         D(bug("User cancelled\n"));
  755.                         SetErrorCode( frame, PERR_CANCELED );
  756.                         DisposeObject( o->Win );
  757.                         StopInput(frame);
  758.                         return PERR_CANCELED;
  759.  
  760.                     /*
  761.                      *  Can't happen if running under <V39, but let's be
  762.                      *  sure anyway
  763.                      */
  764.  
  765.                     case GID_GRADIENTSLIDER:
  766.                         if( V39 ) {
  767.                             GetAttr(GRAD_CurVal, o->RealGradient, &tmp);
  768.                             // D(bug("New value: %d\n",tmp));
  769.                             GetAttr( WHEEL_HSB, o->Wheel, (ULONG *)&hsb );
  770.                             hsb.cw_Brightness = (0xFFFF - tmp) * 0x00010001;
  771.                             ConvertHSBToRGB( &hsb, &rgb );
  772.                             SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, rgb.cw_Red>>24, TAG_DONE );
  773.                             SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, rgb.cw_Green>>24, TAG_DONE );
  774.                             SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, rgb.cw_Blue>>24, TAG_DONE );
  775.                             v->background = FALSE;
  776.                         }
  777.                         break;
  778.  
  779.                     /*
  780.                      *  Ditto
  781.                      */
  782.  
  783.                     case GID_WHEEL:
  784.                         if( V39 ) {
  785.                             GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb );
  786.                             SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, rgb.cw_Red>>24, TAG_DONE );
  787.                             SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, rgb.cw_Green>>24, TAG_DONE );
  788.                             SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, rgb.cw_Blue>>24, TAG_DONE );
  789.                             v->background = FALSE;
  790.                         }
  791.                         break;
  792.  
  793.                     case GID_RED:
  794.                         if( V39 ) {
  795.                             GetAttr( SLIDER_Level, o->Red, (ULONG *)&tmp );
  796.                             GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb );
  797.                             rgb.cw_Red = tmp * 0x01010101;
  798.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  799.                             v->background = FALSE;
  800.                         }
  801.                         break;
  802.  
  803.                     case GID_GREEN:
  804.                         if( V39 ) {
  805.                             GetAttr( SLIDER_Level, o->Green, (ULONG *)&tmp );
  806.                             GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb );
  807.                             rgb.cw_Green = tmp * 0x01010101;
  808.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  809.                             v->background = FALSE;
  810.                         }
  811.                         break;
  812.  
  813.                     case GID_BLUE:
  814.                         if( V39 ) {
  815.                             GetAttr( SLIDER_Level, o->Blue, (ULONG *)&tmp );
  816.                             GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb );
  817.                             rgb.cw_Blue = tmp * 0x01010101;
  818.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  819.                             v->background = FALSE;
  820.                         }
  821.                         break;
  822.  
  823.                     case GID_BACKGROUND:
  824.                         GetBackGround( frame, v, PPTBase );
  825.  
  826.                         if( V39 ) {
  827.                             rgb.cw_Red   = v->r * 0x01010101;
  828.                             rgb.cw_Green = v->g * 0x01010101;
  829.                             rgb.cw_Blue  = v->b * 0x01010101;
  830.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  831.                             DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS?
  832.                         } else {
  833.                             SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,v->r, TAG_DONE );
  834.                             SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,v->g, TAG_DONE );
  835.                             SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,v->b, TAG_DONE );
  836.                         }
  837.  
  838.                         break;
  839.  
  840.                     case GID_BLACK:
  841.                         rgb.cw_Red = rgb.cw_Green = rgb.cw_Blue = 0L;
  842.                         if( V39 ) {
  843.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  844.                             DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS?
  845.                         } else {
  846.                             SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,rgb.cw_Red>>24, TAG_DONE );
  847.                             SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,rgb.cw_Green>>24, TAG_DONE );
  848.                             SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,rgb.cw_Blue>>24, TAG_DONE );
  849.                         }
  850.                         v->background = FALSE;
  851.                         break;
  852.  
  853.                     case GID_WHITE:
  854.                         rgb.cw_Red = rgb.cw_Green = rgb.cw_Blue = 0xFFFFFFFF;
  855.                         if (V39 ) {
  856.                             SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE );
  857.                             DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS?
  858.                         } else {
  859.                             SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,rgb.cw_Red>>24, TAG_DONE );
  860.                             SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,rgb.cw_Green>>24, TAG_DONE );
  861.                             SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,rgb.cw_Blue>>24, TAG_DONE );
  862.                         }
  863.                         v->background = FALSE;
  864.                         break;
  865.  
  866.                     case GID_OK:
  867.                         D(bug("User hit OK\n"));
  868.                         DoGadgets( frame, o, v, PPTBase );
  869.                         GetAttr( WINDOW_Bounds, o->Win, (ULONG *)&v->window );
  870.                         DisposeObject( o->Win );
  871.                         StopInput(frame);
  872.                         return PERR_OK;
  873.                 }
  874.             }
  875.         } /* if(sig&sigmask) */
  876.     }
  877. }
  878. ///
  879. /// SetDefaults
  880. VOID
  881. SetDefaults( FRAME *frame, struct Values *v, struct PPTBase *PPTBase )
  882. {
  883.     struct Values *opt;
  884.     struct Values defaults = {255, 255,255,255, 0, MODE_EXACT, FALSE };
  885.  
  886.     *v = defaults;
  887.  
  888.     if( opt = GetOptions( MYNAME ) )
  889.         *v = *opt;
  890. }
  891. ///
  892. /// SetRexxArgs
  893. PERROR
  894. SetRexxArgs( FRAME *frame, ULONG *args, struct Values *v, struct PPTBase *PPTBase )
  895. {
  896.     if( args[0] )
  897.         v->r = * ((ULONG *)args[0]);
  898.     else
  899.         v->r = 0;
  900.  
  901.     if( args[1] )
  902.         v->g = * ((ULONG *)args[1]);
  903.     else
  904.         v->g = 0;
  905.  
  906.     if( args[2] )
  907.         v->b = * ((ULONG *)args[2]);
  908.     else
  909.         v->b = 0;
  910.  
  911.     if( args[3] )
  912.         v->transp = * ((ULONG *)args[3]);
  913.     else
  914.         v->transp = 255;
  915.  
  916.     if( args[4] )
  917.         GetBackGround( frame, v, PPTBase );
  918.  
  919.     if( args[5] )
  920.         v->tolerance = * ((ULONG *)args[5]);
  921.     else
  922.         v->tolerance = 0;
  923.  
  924.     return PERR_OK;
  925. }
  926. ///
  927.  
  928. /// DoGUI
  929. PERROR DoGUI( FRAME *frame, struct Values *v, struct PPTBase *PPTBase )
  930. {
  931.     struct Objects o;
  932.     int i;
  933.     struct GfxBase *GfxBase = PPTBase->lb_Gfx;
  934.     PERROR res;
  935.  
  936.     o.GradientSliderBase = OpenLibrary("gadgets/gradientslider.gadget", 39L );
  937.     o.ColorWheelBase = OpenLibrary("gadgets/colorwheel.gadget", 39L );
  938.  
  939.     if( (res = OpenGUI(frame, &o, v, PPTBase)) == PERR_OK ) {
  940.         res = HandleIDCMP(frame, &o, v, PPTBase);
  941.     }
  942.  
  943.     if( o.GradientSliderBase ) CloseLibrary( o.GradientSliderBase );
  944.     if( o.ColorWheelBase ) CloseLibrary( o.ColorWheelBase );
  945.  
  946.     if( GfxBase->LibNode.lib_Version >= 39 ) {
  947.         for( i = 0; i < o.numpens; i++ )
  948.             ReleasePen( PPTBase->g->maindisp->scr->ViewPort.ColorMap, o.pens[i] );
  949.     }
  950.  
  951.     return res;
  952. }
  953. ///
  954. /// EffectExec
  955. EFFECTEXEC(frame,tags,PPTBase,EffectBase)
  956. {
  957.     ULONG *args;
  958.     FRAME *newframe = NULL;
  959.     struct Values  v;
  960.  
  961.     SetDefaults( frame, &v, PPTBase );
  962.  
  963.     if( args = (ULONG *)TagData( PPTX_RexxArgs, tags ) ) {
  964.         SetRexxArgs( frame, args, &v, PPTBase );
  965.         newframe = DoTransparency( frame, &v, PPTBase );
  966.     } else {
  967.  
  968.         if( DoGUI(frame, &v, PPTBase) == PERR_OK ) {
  969.            newframe = DoTransparency( frame, &v, PPTBase );
  970.         }
  971.  
  972.     }
  973.  
  974.     PutOptions( MYNAME, &v, sizeof(v) );
  975.  
  976.     return newframe;
  977. }
  978. ///
  979. /// EffectGetArgs
  980. EFFECTGETARGS(frame, tags, PPTBase, EffectBase)
  981. {
  982.     ULONG *args;
  983.     STRPTR buffer;
  984.     struct Values v;
  985.     PERROR res;
  986.  
  987.     SetDefaults( frame, &v, PPTBase );
  988.  
  989.     if( args = (ULONG *)TagData( PPTX_RexxArgs, tags ) ) {
  990.         SetRexxArgs( frame, args, &v, PPTBase );
  991.     }
  992.  
  993.     buffer = (STRPTR)TagData(PPTX_ArgBuffer,tags);
  994.  
  995.     if( args = (ULONG *)TagData( PPTX_RexxArgs, tags ) ) {
  996.         SetRexxArgs( frame, args, &v, PPTBase );
  997.     }
  998.  
  999.     /* BUG: For some reason, loses background information here. */
  1000.  
  1001.     if( (res = DoGUI(frame, &v, PPTBase)) == PERR_OK ) {
  1002.         SPrintF(buffer,"RED %d GREEN %d BLUE %d TRANS %d %s %s TOLERANCE %d",
  1003.                         v.r, v.g, v.b, v.transp,
  1004.                         v.background ? "BACKGROUND" : "",
  1005.                         v.mode == MODE_ALL ? "ALL" : "",
  1006.                         v.tolerance );
  1007.     }
  1008.  
  1009.     PutOptions( MYNAME, &v, sizeof(v) );
  1010.  
  1011.     return res;
  1012. }
  1013. ///
  1014.  
  1015. /*----------------------------------------------------------------------*/
  1016. /*                            END OF CODE                               */
  1017. /*----------------------------------------------------------------------*/
  1018.  
  1019.