Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
  }
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
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);
}
Exemplo n.º 6
0
// 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;
}