static void makegads(void) { struct ColorWheelRGB rgb; struct ColorWheelHSB hsb; Object *im; WORD sizeheight = 14; WORD gradx, grady, gradw, gradh; WORD wheelx, wheely, wheelw, wheelh; im = NewObject(NULL, SYSICLASS, SYSIA_DrawInfo, (IPTR)dri, SYSIA_Which, SIZEIMAGE, TAG_DONE); if (im) { sizeheight = ((struct Image *)im)->Height; DisposeObject(im); } wheelx = scr->WBorLeft + BORDERX; wheely = scr->WBorTop + scr->Font->ta_YSize + 1 + BORDERY; wheelw = -(scr->WBorLeft + scr->WBorRight + BORDERX * 2 + SPACINGX + GRADWIDTH); wheelh = -(scr->WBorTop + scr->Font->ta_YSize + 1 + sizeheight + BORDERY * 2); gradx = -(scr->WBorRight + BORDERX + GRADWIDTH) + 1; grady = scr->WBorTop + scr->Font->ta_YSize + 1 + BORDERY; gradw = GRADWIDTH; gradh = -(scr->WBorTop + scr->Font->ta_YSize + 1 + sizeheight + BORDERY * 2); gradgad = (struct Gadget *)NewObject(0, "gradientslider.gadget", GA_RelRight , gradx, GA_Top , grady, GA_Width , gradw, GA_RelHeight , gradh, GRAD_PenArray , (IPTR)pens, GRAD_KnobPixels , 10, PGA_Freedom , LORIENT_VERT, TAG_DONE); if (!gradgad) cleanup("Can't create gradientslider gadget!"); wheelgad = (struct Gadget *)NewObject(0, "colorwheel.gadget", GA_Left , wheelx, GA_Top , wheely, GA_RelWidth , wheelw, GA_RelHeight , wheelh, GA_RelVerify , TRUE, WHEEL_Screen , (IPTR)scr, WHEEL_BevelBox , TRUE, WHEEL_GradientSlider , (IPTR)gradgad, GA_Previous , (IPTR)gradgad, ICA_TARGET , ICTARGET_IDCMP, TAG_DONE); if (!wheelgad) cleanup("Can't create colorwheel gadget!"); GetAttr(WHEEL_HSB, (Object *)wheelgad, (IPTR *)&hsb); hsb.cw_Brightness = 0xFFFFFFFF; ConvertHSBToRGB(&hsb, &rgb); SetRGB32(vp, pen1, rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue); }
static void handleall(void) { struct IntuiMessage *msg; BOOL quitme = FALSE; while(!quitme) { WaitPort(win->UserPort); while ((msg = (struct IntuiMessage *)GetMsg(win->UserPort))) { switch(msg->Class) { case IDCMP_CLOSEWINDOW: quitme = TRUE; break; case IDCMP_IDCMPUPDATE: { struct ColorWheelRGB rgb; struct ColorWheelHSB hsb; struct TagItem *tags = (struct TagItem *)msg->IAddress; hsb.cw_Hue = GetTagData(WHEEL_Hue, 0, tags); hsb.cw_Saturation = GetTagData(WHEEL_Saturation, 0, tags); hsb.cw_Brightness = 0xFFFFFFFF; ConvertHSBToRGB(&hsb, &rgb); SetRGB32(vp, pen1, rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue); if (truecolor) { RefreshGList(gradgad, win, 0, 1); } } break; } /* switch(msg->Class) */ ReplyMsg((struct Message *)msg); } /* while ((msg = (struct IntuiMessage *)GetMsg(win->UserPort))) */ } /* while(!quitme) */ }
/// /// HandleIDMCP PERROR HandleIDCMP( FRAME *frame, struct Objects *o, struct Values *v, struct PPTBase *PPTBase ) { ULONG sig, sigmask, sigport = 0L; struct Library *ColorWheelBase = o->ColorWheelBase; struct IntuitionBase *IntuitionBase = PPTBase->lb_Intuition; BOOL V39 = FALSE; if( PPTBase->lb_Gfx->LibNode.lib_Version >= 39 && ColorWheelBase ) V39 = TRUE; if(StartInput(frame, GINP_PICK_POINT, NULL) == PERR_OK) sigport = (1 << PPTBase->mport->mp_SigBit); GetAttr( WINDOW_SigMask, o->Win, &sigmask ); for(;;) { sig = Wait( sigport|sigmask|SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F ); if( sig & SIGBREAKF_CTRL_C ) { SetErrorCode( frame, PERR_BREAK ); DisposeObject( o->Win ); StopInput(frame); return PERR_BREAK; } if( sig & SIGBREAKF_CTRL_F ) { WindowToFront( o->win ); ActivateWindow( o->win ); } if( sig & sigport ) { struct gPointMessage *gp; gp = (struct gPointMessage*)GetMsg(PPTBase->mport); /* * Ignore all other types of messages, except pickpoints. */ if( gp->msg.code == PPTMSG_PICK_POINT ) { D(bug("User picked point (%d,%d)\n",gp->x,gp->y)); if( frame->pix->colorspace == CS_RGB ) { RGBPixel *cp; cp = (RGBPixel *)GetPixelRow( frame, gp->y ); SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, cp[gp->x].r, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, cp[gp->x].g, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, cp[gp->x].b, TAG_DONE ); } else { ARGBPixel *cp; cp = (ARGBPixel *)GetPixelRow( frame, gp->y ); SetGadgetAttrs( GAD(o->Trans), o->win, NULL, SLIDER_Level, cp[gp->x].a, TAG_DONE ); SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, cp[gp->x].r, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, cp[gp->x].g, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, cp[gp->x].b, TAG_DONE ); } v->background = FALSE; } ReplyMsg( (struct Message *)gp ); } if( sig & sigmask ) { ULONG rc, tmp; struct ColorWheelRGB rgb; struct ColorWheelHSB hsb; while(( rc = HandleEvent( o->Win )) != WMHI_NOMORE ) { switch(rc) { case WMHI_CLOSEWINDOW: case GID_CANCEL: D(bug("User cancelled\n")); SetErrorCode( frame, PERR_CANCELED ); DisposeObject( o->Win ); StopInput(frame); return PERR_CANCELED; /* * Can't happen if running under <V39, but let's be * sure anyway */ case GID_GRADIENTSLIDER: if( V39 ) { GetAttr(GRAD_CurVal, o->RealGradient, &tmp); // D(bug("New value: %d\n",tmp)); GetAttr( WHEEL_HSB, o->Wheel, (ULONG *)&hsb ); hsb.cw_Brightness = (0xFFFF - tmp) * 0x00010001; ConvertHSBToRGB( &hsb, &rgb ); SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, rgb.cw_Red>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, rgb.cw_Green>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, rgb.cw_Blue>>24, TAG_DONE ); v->background = FALSE; } break; /* * Ditto */ case GID_WHEEL: if( V39 ) { GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb ); SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level, rgb.cw_Red>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level, rgb.cw_Green>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level, rgb.cw_Blue>>24, TAG_DONE ); v->background = FALSE; } break; case GID_RED: if( V39 ) { GetAttr( SLIDER_Level, o->Red, (ULONG *)&tmp ); GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb ); rgb.cw_Red = tmp * 0x01010101; SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); v->background = FALSE; } break; case GID_GREEN: if( V39 ) { GetAttr( SLIDER_Level, o->Green, (ULONG *)&tmp ); GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb ); rgb.cw_Green = tmp * 0x01010101; SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); v->background = FALSE; } break; case GID_BLUE: if( V39 ) { GetAttr( SLIDER_Level, o->Blue, (ULONG *)&tmp ); GetAttr( WHEEL_RGB, o->Wheel, (ULONG *) &rgb ); rgb.cw_Blue = tmp * 0x01010101; SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); v->background = FALSE; } break; case GID_BACKGROUND: GetBackGround( frame, v, PPTBase ); if( V39 ) { rgb.cw_Red = v->r * 0x01010101; rgb.cw_Green = v->g * 0x01010101; rgb.cw_Blue = v->b * 0x01010101; SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS? } else { SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,v->r, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,v->g, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,v->b, TAG_DONE ); } break; case GID_BLACK: rgb.cw_Red = rgb.cw_Green = rgb.cw_Blue = 0L; if( V39 ) { SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS? } else { SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,rgb.cw_Red>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,rgb.cw_Green>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,rgb.cw_Blue>>24, TAG_DONE ); } v->background = FALSE; break; case GID_WHITE: rgb.cw_Red = rgb.cw_Green = rgb.cw_Blue = 0xFFFFFFFF; if (V39 ) { SetGadgetAttrs( GAD(o->Wheel), o->win, NULL, WHEEL_RGB, &rgb, TAG_DONE ); DoMethod( o->Win, WM_REPORT_ID, GID_WHEEL, 0L ); // A bug in OS? } else { SetGadgetAttrs( GAD(o->Red), o->win, NULL, SLIDER_Level,rgb.cw_Red>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Green), o->win, NULL, SLIDER_Level,rgb.cw_Green>>24, TAG_DONE ); SetGadgetAttrs( GAD(o->Blue), o->win, NULL, SLIDER_Level,rgb.cw_Blue>>24, TAG_DONE ); } v->background = FALSE; break; case GID_OK: D(bug("User hit OK\n")); DoGadgets( frame, o, v, PPTBase ); GetAttr( WINDOW_Bounds, o->Win, (ULONG *)&v->window ); DisposeObject( o->Win ); StopInput(frame); return PERR_OK; } } } /* if(sig&sigmask) */ }
/* The following cases apply: Make black transparent Make white transparent Make any color transparent Make background transparent */ PERROR OpenGUI(FRAME *frame, struct Objects *o, struct Values *v, struct PPTBase *PPTBase) { struct Library *BGUIBase = PPTBase->lb_BGUI; struct Screen *scr = PPTBase->g->maindisp->scr; struct Library *ColorWheelBase = o->ColorWheelBase; struct GfxBase *GfxBase = PPTBase->lb_Gfx; struct IntuitionBase *IntuitionBase = PPTBase->lb_Intuition; BOOL V39 = FALSE; struct ColorWheelRGB rgb; struct ColorWheelHSB hsb; sprintf(o->wtitle, MYNAME ": %s", frame->name ); if( PPTBase->lb_Gfx->LibNode.lib_Version >= 39 ) { int i; V39 = TRUE; rgb.cw_Red = 0; rgb.cw_Green = 0; rgb.cw_Blue = 0; ConvertRGBToHSB( &rgb, &hsb ); for( i = 0; i < GRADCOLORS; i++ ) { hsb.cw_Brightness = (ULONG)0xffffffff - (((ULONG)0xffffffff / GRADCOLORS ) * i ); ConvertHSBToRGB( &hsb, &rgb ); if( -1 == (o->pens[i] = ObtainBestPen( scr->ViewPort.ColorMap, rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue, TAG_DONE ) ) ) { break; } } o->pens[i] = ~0; o->numpens = i; o->Gradient = ExternalObject, GA_ID, GID_GRADIENTSLIDER, EXT_MinWidth, 10, EXT_MinHeight, 10, EXT_ClassID, "gradientslider.gadget", EXT_NoRebuild, TRUE, GRAD_PenArray, o->pens, PGA_Freedom, LORIENT_VERT, EndObject; if( o->Gradient ) GetAttr( EXT_Object, o->Gradient, (ULONG *) &o->RealGradient ); } o->Win = WindowObject, WINDOW_Screen, scr, WINDOW_Title, o->wtitle, WINDOW_ScreenTitle, "Transparency: Click on the image to choose a color", v->window.Height ? TAG_IGNORE : TAG_SKIP, 1, WINDOW_Bounds, &v->window, WINDOW_ScaleWidth, 30, WINDOW_NoBufferRP, TRUE, WINDOW_MenuStrip, mymenus, // WINDOW_HelpFile, "Docs/effects.guide", // WINDOW_HelpNode, "Transparency", // WINDOW_HelpText, infoblurb, WINDOW_CloseOnEsc, TRUE, WINDOW_MasterGroup, VGroupObject, Spacing(4), HOffset(6), VOffset(4), StartMember, HGroupObject, Spacing(6), StartMember, VGroupObject, Spacing(4), StartMember, InfoObject, INFO_TextFormat, ISEQ_C "Please, do select\n" "which color should be\n" "transparent:", INFO_MinLines, 3, ButtonFrame, FRM_Flags, FRF_RECESSED, EndObject, LGO_NoAlign, TRUE, EndMember, VarSpace(25), StartMember, VGroupObject, StartMember, HGroupObject, Spacing(3), StartMember, o->Red = SliderObject, GA_ID, GID_RED, Label("Red"), Place(PLACE_LEFT), SLIDER_Min, 0, SLIDER_Max, 255, SLIDER_Level, v->r, EndObject, EndMember, StartMember, o->RedI = StringObject, GA_ID, GID_REDI, STRINGA_MinCharsVisible,4, STRINGA_MaxChars, 3, STRINGA_IntegerMin, 0, STRINGA_IntegerMax, 255, STRINGA_LongVal, v->r, EndObject, Weight(1), EndMember, EndObject, FixMinHeight, EndMember, StartMember, HGroupObject, Spacing(3), StartMember, o->Green = SliderObject, GA_ID, GID_GREEN, Label("Green"), Place(PLACE_LEFT), SLIDER_Min, 0, SLIDER_Max, 255, SLIDER_Level, v->g, EndObject, EndMember, StartMember, o->GreenI = StringObject, GA_ID, GID_GREENI, STRINGA_MinCharsVisible,4, STRINGA_MaxChars, 3, STRINGA_IntegerMin, 0, STRINGA_IntegerMax, 255, STRINGA_LongVal, v->g, EndObject, Weight(1), EndMember, EndObject, FixMinHeight, EndMember, StartMember, HGroupObject, Spacing(3), StartMember, o->Blue = SliderObject, GA_ID, GID_BLUE, Label("Blue"), Place(PLACE_LEFT), SLIDER_Min, 0, SLIDER_Max, 255, SLIDER_Level, v->b, EndObject, EndMember, StartMember, o->BlueI = StringObject, GA_ID, GID_BLUEI, STRINGA_MinCharsVisible,4, STRINGA_MaxChars, 3, STRINGA_IntegerMin, 0, STRINGA_IntegerMax, 255, STRINGA_LongVal, v->b, EndObject, Weight(1), EndMember, EndObject, FixMinHeight, EndMember, EndObject, EndMember, VarSpace(25), EndObject, LGO_NoAlign, TRUE, EndMember, (V39) ? TAG_IGNORE : TAG_SKIP, 2, StartMember, o->Wheel = ExternalObject, EXT_MinWidth, 30, EXT_MinHeight, 30, EXT_ClassID, "colorwheel.gadget", WHEEL_Screen, scr, /* ** Pass a pointer to the "real" gradient slider ** here. **/ WHEEL_GradientSlider, o->RealGradient, WHEEL_Red, v->r * 0x01010101, WHEEL_Green, v->g * 0x01010101, WHEEL_Blue, v->b * 0x01010101, GA_FollowMouse, TRUE, GA_ID, GID_WHEEL, /* ** These attributes of the colorwheel are ** tracked and reset to the object after ** it has been rebuild. This way the current ** colorwheel internals will not be lost ** after the object is re-build. **/ EXT_TrackAttr, WHEEL_Red, EXT_TrackAttr, WHEEL_Green, EXT_TrackAttr, WHEEL_Blue, EXT_TrackAttr, WHEEL_Hue, EXT_TrackAttr, WHEEL_Saturation, EXT_TrackAttr, WHEEL_Brightness, EndObject, EndMember, (V39) ? TAG_IGNORE : TAG_SKIP, 3, StartMember, o->Gradient, FixWidth(20), EndMember, EndObject, LGO_NoAlign, TRUE, EndMember, StartMember, HGroupObject, StartMember, o->Trans = SliderObject, GA_ID, GID_TRANSPARENCY, Label("Transparency:"), Place(PLACE_LEFT), SLIDER_Min, 0, SLIDER_Max, 255, SLIDER_Level, v->transp, EndObject, EndMember, StartMember, o->TransI = StringObject, GA_ID, GID_TRANSPARENCYI, STRINGA_MinCharsVisible,4, STRINGA_MaxChars, 3, STRINGA_IntegerMin, 0, STRINGA_IntegerMax, 255, STRINGA_LongVal, v->transp, EndObject, Weight(1), EndMember, EndObject, FixMinHeight, EndMember, StartMember, HGroupObject, NormalSpacing, StartMember, o->All = CheckBoxObject, GA_ID, GID_ALL, Label("All colors?"), GA_Selected, (v->mode == MODE_ALL) ? TRUE : FALSE, EndObject, Weight(1), EndMember, StartMember, o->Tolerance = SliderObject, GA_ID, GID_TOLERANCE, Label("Tolerance:"), Place(PLACE_LEFT), SLIDER_Min, 0, SLIDER_Max, 255, SLIDER_Level, v->tolerance, EndObject, EndMember, StartMember, o->ToleranceI = StringObject, GA_ID, GID_TOLERANCEI, STRINGA_MinCharsVisible, 4, STRINGA_MaxChars, 3, STRINGA_IntegerMin, 0, STRINGA_IntegerMax, 255, STRINGA_LongVal, v->tolerance, EndObject, Weight(1), EndMember, EndObject, FixMinHeight, EndMember, StartMember, HorizSeparator, EndMember, StartMember, HGroupObject, StartMember, ButtonObject, GA_ID, GID_OK, Label("OK"), Place(PLACE_IN), EndObject, EndMember, VarSpace(DEFAULT_WEIGHT/2), StartMember, ButtonObject, GA_ID, GID_CANCEL, Label("Cancel"), Place(PLACE_IN), EndObject, EndMember, EndObject, FixMinHeight, EndMember, EndObject, EndObject; if( o->Win ) { /* * Attach the gadgets unto each other */ AddMap( o->Trans, o->TransI, dpcol_sl2int ); AddMap( o->TransI,o->Trans, dpcol_int2sl ); AddMap( o->Red, o->RedI, dpcol_sl2int ); AddMap( o->RedI,o->Red, dpcol_int2sl ); AddMap( o->Green, o->GreenI, dpcol_sl2int ); AddMap( o->GreenI,o->Green, dpcol_int2sl ); AddMap( o->Blue, o->BlueI, dpcol_sl2int ); AddMap( o->BlueI,o->Blue, dpcol_int2sl ); AddMap( o->Tolerance, o->ToleranceI, dpcol_sl2int ); AddMap( o->ToleranceI,o->Tolerance, dpcol_int2sl ); AddCondit( o->All, o->Red, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->RedI, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->Green, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->GreenI, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->Blue, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->BlueI, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->ToleranceI, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->Tolerance, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); if(V39) { AddCondit( o->All, o->Wheel, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); AddCondit( o->All, o->Gradient, GA_Selected, FALSE, GA_Disabled, FALSE, GA_Disabled, TRUE ); } if( o->win = WindowOpen(o->Win) ) { /* This sets the other gadgets disabled or enabled */ SetGadgetAttrs( (struct Gadget *)o->All, o->win, NULL, GA_Selected, (v->mode == MODE_ALL) ? TRUE : FALSE, TAG_DONE ); } else { DisposeObject(o->Win); } } return (BOOL)(o->win ? PERR_OK : PERR_WINDOWOPEN); }