IPTR Colorfield__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) { struct Colorfield_DATA *data = INST_DATA(cl,obj); DoSuperMethodA(cl,obj,(Msg)msg); if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) return FALSE; if (data->flags & FLAG_NO_PEN) { static UWORD pat[] = {0x1111,0x2222,0x4444,0x8888}; SetAfPt(_rp(obj), pat, 2); SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], _pens(obj)[MPEN_BACKGROUND],JAM2); } else { SetABPenDrMd(_rp(obj), data->pen, 0,JAM1); } RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); SetAfPt(_rp(obj), NULL, 0); return 0; }
static VOID DrawGhosted(struct TB_Element *tool, struct Toolbar_Data *data, Object *obj, BOOL selected) { switch(data->GhostEffect) { case GHOST_LIGHT: case GHOST_HEAVY: { DrawButton(tool, data, obj, selected, !data->ToolImages); if(data->ToolImages) { struct RastPort *rport = &data->RP; USHORT ditherData[2]; if(data->GhostEffect == GHOST_LIGHT) { ditherData[0] = 0x8888; ditherData[1] = 0x2222; } else { ditherData[0] = 0x5555; ditherData[1] = 0xAAAA; } SetAPen(rport, _pens(obj)[MPEN_SHADOW]); SetAfPt(rport, ditherData, 1); RectFill(rport, tool->DstX, tool->DstY, tool->DstX+data->ButtonWidth-1, tool->DstY + data->ButtonHeight-1); SetAfPt(rport, NULL, 0); } } break; case GHOST_SUPERLIGHT: { DrawButton(tool, data, obj, selected, THREE_D); if(data->ToolImages) { struct RastPort *rport = &data->RP; USHORT ditherData[] = {0x5555, 0xAAAA}; SetAPen(rport, _pens(obj)[MPEN_HALFSHINE]); SetAfPt(rport, ditherData, 1); RectFill(rport, tool->DstX+2, tool->DstY+2, tool->DstX+data->ButtonWidth-3, tool->DstY+1+data->InnerSpace+data->IconHeight); SetAfPt(rport, NULL, 0); } } break; case GHOST_BITMAP: // case GHOST_DIMMED: { DrawButton(tool, data, obj, selected, THREE_D); } break; } }
IPTR FillRectClass__IM_DRAW(Class *cl, Object *obj, struct impDraw *msg) { struct FillRectData *data = INST_DATA(cl, obj); struct RastPort rp; WORD x1, y1, x2, y2; if (!((struct impDraw *)msg)->imp_RPort) return 0; memcpy(&rp,((struct impDraw *)msg)->imp_RPort,sizeof (struct RastPort)); SetABPenDrMd(&rp, IM_FGPEN((struct Image *)obj), IM_BGPEN((struct Image *)obj), data->mode); SetAfPt(&rp, (APTR)((struct Image *)obj)->ImageData, data->apatsize); x1 = ((struct Image *)obj)->LeftEdge + ((struct impDraw *)msg)->imp_Offset.X; y1 = ((struct Image *)obj)->TopEdge + ((struct impDraw *)msg)->imp_Offset.Y; if (msg->MethodID == IM_DRAW) { x2 = x1 + ((struct Image *)obj)->Width - 1; y2 = y1 + ((struct Image *)obj)->Height - 1; } else { x2 = x1 + msg->imp_Dimensions.Width - 1; y2 = y1 + msg->imp_Dimensions.Height - 1; } RectFill(&rp, x1, y1, x2, y2); return 0; }
IPTR Pendisplay__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) { struct Pendisplay_DATA *data = INST_DATA(cl,obj); LONG color; DoSuperMethodA(cl,obj,(Msg)msg); if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) return FALSE; if (data->refobj) { IPTR val; get(data->refobj, MUIA_Pendisplay_Pen, &val); color = (LONG)val; } else { color = data->pen; } if (color == -1) { static UWORD pat[] = {0x1111,0x2222,0x4444,0x8888}; SetAfPt(_rp(obj), pat, 2); SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], _pens(obj)[MPEN_BACKGROUND],JAM2); } else { SetABPenDrMd(_rp(obj), MUIPEN(color), 0,JAM1); } RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); SetAfPt(_rp(obj), NULL, 0); return 0; }
// Render listview void listview_render( Class *cl, struct Gadget *gadget, ListViewData *data, struct gpRender *render) { struct RastPort *rp; UWORD *pens; // Get rastport to use rp=(render->MethodID==GM_RENDER)?render->gpr_RPort:ObtainGIRPort(render->gpr_GInfo); // Get pen array pens=render->gpr_GInfo->gi_DrInfo->dri_Pens; // Set font SetFont(rp,data->list_font); // Look at render type switch (render->gpr_Redraw) { // Draw the whole gadget? case GREDRAW_REDRAW: { struct TagItem tags[4]; short a; // Valid title? if (data->title[0]) { short y,x,len; // Get title length len=strlen(data->title); // Get x and y position for title if (data->layout_flags&PLACETEXT_LEFT) { x=gadget->LeftEdge-TextLength(rp,data->title,len)-8; y=gadget->TopEdge+2+rp->TxBaseline; } else { x=gadget->LeftEdge; y=(gadget->TopEdge-1-rp->TxHeight)+rp->TxBaseline; } // Draw title SetAPen(rp,pens[TEXTPEN]); SetDrMd(rp,JAM1); Move(rp,x,y); Text(rp,data->title,len); // Underscore? if (data->title_uscore>-1) { int pos,len; // Get position and length of underscore pos=TextLength(rp,data->title,data->title_uscore); len=TextLength(rp,data->title+data->title_uscore,1); // Draw it Move(rp,x+pos,y+1); Draw(rp,x+pos+len-1,y+1); } // Reset draw mode SetDrMd(rp,JAM2); } // Draw border around the list listview_border( cl, rp, pens, &data->list_dims, (data->flags&LVF_READ_ONLY)?IDS_SELECTED:IDS_NORMAL, (data->flags&LVF_THIN_BORDER)?THIN:THICK); // Draw scroller border if (data->scroller) { listview_border( cl, rp, pens, &data->scroller_dims, IDS_NORMAL, (data->flags&LVF_THIN_BORDER)?THIN:THICK); // Draw blank area inside scroller border SetAPen(rp,pens[BACKGROUNDPEN]); if (0 && data->flags&LVF_DISABLE_CHANGE) { RectFill(rp, data->scroller_dims.Left+((data->flags&LVF_THIN_BORDER)?1:2), data->scroller_dims.Top+1, data->scroller_dims.Left+data->scroller_dims.Width-((data->flags&LVF_THIN_BORDER)?2:3), data->scroller_dims.Top+data->scroller_dims.Height-2); data->flags&=~LVF_DISABLE_CHANGE; } else { if (data->flags&LVF_THIN_BORDER) { Move(rp, data->scroller_dims.Left+1, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+1, data->scroller_dims.Top+data->scroller_dims.Height-2); Move(rp, data->scroller_dims.Left+data->scroller_dims.Width-2, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+data->scroller_dims.Width-2, data->scroller_dims.Top+data->scroller_dims.Height-2); } Move(rp, data->scroller_dims.Left+2, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+data->scroller_dims.Width-3, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+data->scroller_dims.Width-3, data->scroller_dims.Top+data->scroller_dims.Height-2); Draw(rp, data->scroller_dims.Left+2, data->scroller_dims.Top+data->scroller_dims.Height-2); Draw(rp, data->scroller_dims.Left+2, data->scroller_dims.Top+1); Move(rp, data->scroller_dims.Left+3, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+3, data->scroller_dims.Top+data->scroller_dims.Height-2); Move(rp, data->scroller_dims.Left+data->scroller_dims.Width-4, data->scroller_dims.Top+1); Draw(rp, data->scroller_dims.Left+data->scroller_dims.Width-4, data->scroller_dims.Top+data->scroller_dims.Height-2); } } // Draw list listview_draw_items(cl,gadget,rp,render->gpr_GInfo->gi_DrInfo,data,-1); // Fill out scroller tags if (data->scroller) { tags[0].ti_Tag=PGA_Total; tags[0].ti_Data=data->count; tags[1].ti_Tag=PGA_Visible; tags[1].ti_Data=data->lines; tags[2].ti_Tag=PGA_Top; tags[2].ti_Data=data->top; tags[3].ti_Tag=TAG_END; // Update scroller DoMethod( (Object *)data->scroller, OM_SET, tags, render->gpr_GInfo); // Refresh arrows for (a=0;a<2;a++) DoMethod( (Object *)data->arrows[a], GM_RENDER, render->gpr_GInfo, rp, GREDRAW_REDRAW); // Refresh scroller DoMethod( (Object *)data->scroller, GM_RENDER, render->gpr_GInfo, rp, GREDRAW_REDRAW); } // Disabled? if (gadget->Flags&GFLG_DISABLED) { unsigned short ghost[2]; // Set ghosting pattern ghost[0]=0x8888; ghost[1]=0x2222; SetAfPt(rp,ghost,1); SetAPen(rp,pens[SHADOWPEN]); SetDrMd(rp,JAM1); // Fill with ghosting pattern RectFill(rp, data->dims.Left, data->dims.Top, data->dims.Left+data->dims.Width-1, data->dims.Top+data->dims.Height-1); // Clear ghosting pattern SetAfPt(rp,0,0); } // Otherwise, clear any gap between text area and gadget else { SetAPen(rp,pens[BACKGROUNDPEN]); if (data->text_dims.Top>data->dims.Top+1) { RectFill(rp, data->text_dims.Left, data->dims.Top+1, data->text_dims.Left+data->text_dims.Width-1, data->text_dims.Top-1); } if (data->text_dims.Top+data->text_dims.Height-1< data->dims.Top+data->dims.Height-2) { RectFill(rp, data->text_dims.Left, data->text_dims.Top+data->text_dims.Height, data->text_dims.Left+data->text_dims.Width-1, data->dims.Top+data->dims.Height-2); } } } break; // Just refresh items case GREDRAW_UPDATE: { // Draw list listview_draw_items(cl,gadget,rp,render->gpr_GInfo->gi_DrInfo,data,data->last_sel); // Refresh scroller? if (data->last_sel==-1 && data->scroller) { struct TagItem tags[2]; // Fill out scroller tags tags[0].ti_Tag=PGA_Top; tags[0].ti_Data=data->top; tags[1].ti_Tag=TAG_END; // Update scroller DoMethod( (Object *)data->scroller, OM_SET, tags, render->gpr_GInfo); } } break; } // Do we need to free the rastport? if (render->MethodID!=GM_RENDER) ReleaseGIRPort(rp); }
// Load a backfill pattern; pattern must be locked exclusively void GetPattern(PatternData *pattern,struct Screen *screen,ULONG border_col) { // Initially make invalid pattern->valid=FALSE; pattern->border_pen=0; // Set screen pointer pattern->screen=screen; // Check for invalid data if (!pattern->data) { // Update border pen GetPatternBorder(pattern,screen,border_col); return; } // Bitmap pattern? if (pattern->prefs.wbp_Flags&WBPF_PATTERN) { UWORD *ptr,*planes[MAXDEPTH]; short num,row,col,pen; // Get plane pointers for (num=0;num<pattern->prefs.wbp_Depth;num++) { planes[num]=((UWORD *)pattern->data)+(PAT_HEIGHT*num); } pattern->fill_plane_key=0; // Clear fill initially for (num=0,ptr=pattern->fill[0];num<128;num++,ptr++) *ptr=0; // Under 37 use fill pattern as supplied if (((struct Library *)GfxBase)->lib_Version<39) { for (num=0;num<pattern->prefs.wbp_Depth;num++) { CopyMem( (char *)planes[num], (char *)pattern->fill[num], PAT_HEIGHT*sizeof(UWORD)); } pattern->fill_plane_key=pattern->prefs.wbp_Depth; } // Otherwise, we need to remap else { // Go through pattern rows for (row=0;row<PAT_HEIGHT;row++) { // Go through bits for (col=0;col<PAT_WIDTH;col++) { // Clear pen pen=0; // Calculate pixel colour for (num=0;num<pattern->prefs.wbp_Depth;num++) { // Is bit set in this bitplane? if (planes[num][row]&(1<<col)) pen|=(1<<num); } // Pixel set? if (pen) { // Map pens 4-7 to top four colours if (pen>=4 && screen->RastPort.BitMap->Depth<=8) { pen=(1<<screen->RastPort.BitMap->Depth)-(8-pen); } // Remap for (num=0;num<8;num++) { // Want this bit? if (pen&(1<<num)) { // Set bit pattern->fill[num][row]|=1<<col; if (num>=pattern->fill_plane_key) pattern->fill_plane_key=num+1; } } } } } } // Any data? if (pattern->fill_plane_key>0) { short depth; // Get depth for bitmap if (((struct Library *)GfxBase)->lib_Version>=39) depth=GetBitMapAttr(screen->RastPort.BitMap,BMA_DEPTH); else depth=screen->RastPort.BitMap->Depth; // Check its not too deep if (depth>8) depth=8; // Allocate bitmap for pattern if ((pattern->pattern_bitmap= NewBitMap( PATTILE_SIZE, PATTILE_SIZE, depth, BMF_CLEAR, 0))) { struct RastPort rp; struct BitMap *bitmap; // Initialise dummy rastport InitRastPort(&rp); rp.BitMap=pattern->pattern_bitmap; // Set fill pattern SetAfPt(&rp,pattern->fill[0],-4); // Fill bitmap SetRast(&rp,0); RectFill(&rp,0,0,PATTILE_SIZE-1,PATTILE_SIZE-1); // Is the screen a non-standard bitmap? if (((struct Library *)GfxBase)->lib_Version>=39 && !(GetBitMapAttr(screen->RastPort.BitMap,BMA_FLAGS)&BMF_STANDARD)) { // Try and allocate friend bitmap if ((bitmap= NewBitMap( PATTILE_SIZE, PATTILE_SIZE, depth, BMF_CLEAR, screen->RastPort.BitMap))) { // Copy to friend bitmap BltBitMap( pattern->pattern_bitmap,0,0, bitmap,0,0, PATTILE_SIZE,PATTILE_SIZE, 0xc0,0xff,0); // Free original bitmap DisposeBitMap(pattern->pattern_bitmap); // Use new bitmap pointer pattern->pattern_bitmap=bitmap; } } // Get bitmap pointer pattern->bitmap=pattern->pattern_bitmap; // Get pattern size pattern->width=PATTILE_SIZE; pattern->height=PATTILE_SIZE; } } } // Picture; must have datatypes else if (DataTypesBase) { short len; BOOL remap=1; long precision=PRECISION_IMAGE; char name[256]; long ver=0; struct Library *pdt; #ifdef PATCH_OK APTR patchhandle=0; #endif // Check picture datatype version if ((pdt=OpenLibrary("sys:classes/datatypes/picture.datatype",0)) || (pdt=OpenLibrary("picture.datatype",0))) { // Get version ver=pdt->lib_Version; CloseLibrary(pdt); } // No remap? if ((len=strlen(pattern->data))>8 && stricmp(pattern->data+len-8,".noremap")==0) remap=0; // Precision? if (len>6 && stricmp(pattern->data+len-6,".exact")==0) precision=PRECISION_EXACT; // Specified in prefs? else if (pattern->precision) { if (pattern->precision==-1) remap=0; else if (pattern->precision==1) precision=PRECISION_ICON; else if (pattern->precision==2) precision=PRECISION_GUI; else if (pattern->precision==3) precision=PRECISION_EXACT; } #ifdef PATCH_OK // If we've got v43 of the datatype, we don't need the fastram patch if (ver<43) { // Add this task to the patchlist for allocbitmap patchhandle=AddAllocBitmapPatch(FindTask(0),screen); } #endif // Turn back on requesters ((struct Process *)FindTask(0))->pr_WindowPtr=GUI->window; // Check for random pictures, and then load picture if (pattern_check_random(pattern,name) && (pattern->object= NewDTObject(name, DTA_GroupID,GID_PICTURE, PDTA_Screen,screen, PDTA_FreeSourceBitMap,TRUE, (ver>42)?PDTA_DestMode:TAG_IGNORE,MODE_V43, (ver>42)?PDTA_UseFriendBitMap:TAG_IGNORE,TRUE, TAG_END))) { struct BitMapHeader *header; struct BitMap *bitmap; D_S(struct FileInfoBlock, fib) // Get file information if (GetFileInfo(name,fib) && strnicmp(fib->fib_Comment,"dopus ",6)==0) { char *args=fib->fib_Comment+6; short val; rexx_skip_space(&args); while ((val=rexx_match_keyword(&args,background_key,0))!=-1) { // Tile/center/stretch if (val==3) pattern->flags&=~(PATF_CENTER|PATF_STRETCH); else if (val==4) { pattern->flags|=PATF_CENTER; pattern->flags&=~PATF_STRETCH; } else if (val==5 && pattern->prefs.wbp_Which==0) { pattern->flags|=PATF_STRETCH; pattern->flags&=~PATF_CENTER; } // Precision else if (val==6) { // Get precision rexx_skip_space(&args); if ((val=rexx_match_keyword(&args,precision_key,0))>-1) { if (val==0) remap=0; else if (val==1) precision=PRECISION_GUI; else if (val==2) precision=PRECISION_ICON; else if (val==3) precision=PRECISION_IMAGE; else if (val==4) precision=PRECISION_EXACT; } } // Border else if (val==8) { // Off? rexx_skip_space(&args); if (rexx_match_keyword(&args,on_off_strings2,0)==0) border_col&=~ENVBF_USE_COLOUR; else { border_col=ENVBF_USE_COLOUR; border_col|=Atoh(args,-1)<<8; } } } } // Layout picture (should check for success) SetDTAttrs(pattern->object,0,0, OBP_Precision,precision, PDTA_Remap,remap, TAG_END); DoMethod(pattern->object,DTM_PROCLAYOUT,0,1); // Get bitmap pointer and header GetDTAttrs(pattern->object, PDTA_BitMap,&bitmap, PDTA_DestBitMap,&pattern->bitmap, PDTA_BitMapHeader,&header, TAG_END); // No dest bitmap? if (!pattern->bitmap) pattern->bitmap=bitmap; // Valid bitmap? if (pattern->bitmap) { // Get width and height pattern->width=header->bmh_Width; pattern->height=header->bmh_Height; } } // Turn off requesters ((struct Process *)FindTask(0))->pr_WindowPtr=(APTR)-1; #ifdef PATCH_OK // Remove this task from the patchlist for allocbitmap if (patchhandle) RemAllocBitmapPatch(patchhandle); #endif // Got bitmap? if (pattern->bitmap) { // Stretch? if (pattern->flags&PATF_STRETCH) { // Not the size of the screen? if (pattern->width!=screen->Width || pattern->height!=screen->Height) { // Allocate a bitmap for the stretched picture if ((pattern->pattern_bitmap= NewBitMap( screen->Width, screen->Height, GetBitMapAttr(pattern->bitmap,BMA_DEPTH), BMF_CLEAR, screen->RastPort.BitMap))) { struct BitScaleArgs scale; // Scale bitmap scale.bsa_SrcX=0; scale.bsa_SrcY=0; scale.bsa_SrcWidth=pattern->width; scale.bsa_SrcHeight=pattern->height; scale.bsa_DestX=0; scale.bsa_DestY=0; scale.bsa_DestWidth=screen->Width; scale.bsa_DestHeight=screen->Height; scale.bsa_XSrcFactor=scale.bsa_SrcWidth; scale.bsa_XDestFactor=scale.bsa_DestWidth; scale.bsa_YSrcFactor=scale.bsa_SrcHeight; scale.bsa_YDestFactor=scale.bsa_DestHeight; scale.bsa_SrcBitMap=pattern->bitmap; scale.bsa_DestBitMap=pattern->pattern_bitmap; scale.bsa_Flags=0; BitMapScale(&scale); // Get pointer to scaled bitmap pattern->bitmap=pattern->pattern_bitmap; pattern->width=screen->Width; pattern->height=screen->Height; } } } } // Update border pen GetPatternBorder(pattern,screen,border_col); } // Pattern ok now pattern->valid=TRUE; }