home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The AGA Experience 2
/
agavol2.iso
/
software
/
utilities
/
icon_tools
/
iconian296
/
sources
/
chunkyimage.e
next >
Wrap
Text File
|
1995-10-04
|
11KB
|
388 lines
/*
* When making chunkyimages, if the width is a multiple of 8, WritePixelArray()
* is used. This speeds up things ALOT for larger images!!!
*/
OPT PREPROCESS
LIBRARY 'chunkyimage.class',2,0,'chunkyiclass 2.0 (4.10.95)' IS init_chunkyiclass,free_chunkyiclass
MODULE 'amigalib/boopsi'
MODULE 'tools/installhook'
MODULE 'exec/memory'
MODULE 'graphics/gfxbase','graphics/scale','graphics/gfx','graphics/rastport','graphics/view'
MODULE 'utility'
MODULE 'exec/types'
MODULE 'intuition/classes','intuition/imageclass','intuition/cghooks','intuition/classusr',
'intuition/screens','intuition/intuition'
MODULE 'utility/tagitem'
MODULE 'class/chunkyimage'
OBJECT rp_info
width:INT
height:INT
rp:PTR TO rastport
ENDOBJECT
OBJECT chunkyidata
screen:PTR TO screen
selected_bgpen:LONG
num_pens:LONG
shared_pens:LONG
def_pens:LONG
selected_data:LONG
normal_rpi:rp_info
selected_rpi:rp_info
precision:LONG
ENDOBJECT
PROC free_rastport(rp:PTR TO rastport,width,height)
IF ((rp) AND (rp.bitmap))
FreeBitMap(rp.bitmap)
ENDIF
Dispose(rp)
ENDPROC
PROC init_rastport(parent_rp:PTR TO rastport,width,height)
DEF rp:PTR TO rastport
rp:=New(SIZEOF rastport)
InitRastPort(rp)
IF (rp)
rp.layer:=NIL
-> rp.bitmap:=AllocBitMap(width,height,parent_rp.bitmap.depth,BMF_CLEAR,parent_rp.bitmap)
rp.bitmap:=AllocBitMap(width,height,parent_rp.bitmap.depth,BMF_CLEAR,0)
IF (rp.bitmap=0)
free_rastport(rp,width,height)
rp:=NIL
DisplayBeep(0)
ENDIF
ENDIF
ENDPROC rp
PROC free_shared_pens(data:PTR TO chunkyidata)
DEF n
IF (data.shared_pens)
FOR n:=0 TO data.num_pens-1
IF (Long(data.shared_pens+(n*4))<>-1)
ReleasePen(data.screen.viewport.colormap,Long(data.shared_pens+(n*4)))
ENDIF
ENDFOR
Dispose(data.shared_pens)
data.shared_pens:=0
ENDIF
ENDPROC
PROC init_shared_pens(data:PTR TO chunkyidata,palette)
DEF n
free_shared_pens(data)
IF (palette)
data.num_pens:=Long(palette)
data.shared_pens:=New((data.num_pens*4)+64)
ENDIF
IF ((data.shared_pens) AND (data.screen))
FOR n:=0 TO (data.num_pens-1)
PutLong(data.shared_pens+(n*4),ObtainBestPenA(data.screen.viewport.colormap,
Long(palette+(n*12)+4),
Long(palette+(n*12)+8),
Long(palette+(n*12)+12),
[OBP_PRECISION,data.precision,TAG_DONE]:LONG))
ENDFOR
ENDIF
ENDPROC
PROC free_image(rpi:PTR TO rp_info)
free_rastport(rpi.rp,rpi.width,rpi.height)
rpi.rp:=NIL
ENDPROC
PROC init_image(parent_rp:PTR TO rastport,rpi:PTR TO rp_info,imagedata,shared_pens,def_pens,bgpen)
DEF x,y
DEF buffer,bufptr:PTR TO CHAR,pen
DEF undotmpras=NIL:PTR TO rastport
DEF undotmpbm=NIL:PTR TO bitmap
DEF char:PTR TO CHAR
DEF long:PTR TO LONG
free_image(rpi)
IF ((imagedata) AND (parent_rp))
rpi.rp:=init_rastport(parent_rp,rpi.width,rpi.height)
IF (rpi.rp)
NEW undotmpras
CopyMem(rpi.rp,undotmpras,SIZEOF rastport)
undotmpbm:=AllocBitMap(1,rpi.width,8,BMF_STANDARD OR BMF_CLEAR,parent_rp)
undotmpras.bitmap:=undotmpbm
buffer:=New((rpi.width+16)*rpi.height)
bufptr:=buffer
IF (undotmpbm)
FOR y:=0 TO rpi.height-1
FOR x:=0 TO rpi.width-1
char:=imagedata+x+(y*rpi.width)
IF (char[0]=0)
pen:=bgpen
ELSE
char:=(imagedata+x+(y*rpi.width))
long:=(shared_pens+(char[0]*4))
IF ((shared_pens) AND ((long[0])<>-1))
long:=(shared_pens+((char[0])*4))
pen:=long[0]
ELSE
IF (def_pens)
long:=(def_pens+(char[0]*4))
pen:=long[0]
ELSE
pen:=char[0]
ENDIF
ENDIF
ENDIF
bufptr[0]:=pen
bufptr:=bufptr+1
ENDFOR
WritePixelLine8(rpi.rp,0,y,rpi.width-1,buffer+(y*rpi.width),undotmpras)
ENDFOR
WaitBlit()
Dispose(buffer)
FreeBitMap(undotmpbm)
END undotmpras
ENDIF
ELSE
DisplayBeep(0)
ENDIF
ELSE
DisplayBeep(0)
ENDIF
ENDPROC
PROC chunkyim_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
DEF data:PTR TO chunkyidata
DEF normal_data=0
DEF dri=0:PTR TO drawinfo
DEF bgpen
DEF fti
data:=INST_DATA(cl, obj)
GetAttr(IA_DATA,obj,{normal_data})
IF (normal_data>0)
fti:=FindTagItem(IA_WIDTH,msg.attrlist)
IF (fti=0) THEN obj::image.width:=Long(normal_data)
fti:=FindTagItem(IA_HEIGHT,msg.attrlist)
IF (fti=0) THEN obj::image.height:=Long(normal_data+4)
data.shared_pens:=NIL
data.precision:=GetTagData(CHUNKYIA_PRECISION,PRECISION_IMAGE,msg.attrlist)
data.screen:=GetTagData(CHUNKYIA_SCREEN,NIL,msg.attrlist)
init_shared_pens(data,GetTagData(CHUNKYIA_PALETTE,NIL,msg.attrlist))
IF (data.screen)
dri:=GetScreenDrawInfo(data.screen)
ENDIF
IF (FindTagItem(IA_BGPEN,msg.attrlist)=0) THEN obj::image.planeonoff:=IF (dri) THEN dri.pens[BACKGROUNDPEN] ELSE 0
data.selected_bgpen:=GetTagData(CHUNKYIA_SELECTEDBGPEN,IF (dri) THEN dri.pens[FILLPEN] ELSE 0,msg.attrlist)
IF (dri) THEN FreeScreenDrawInfo(data.screen,dri)
data.selected_data:=GetTagData(CHUNKYIA_SELECTEDDATA,NIL,msg.attrlist)
GetAttr(IA_BGPEN,obj,{bgpen})
data.def_pens:=GetTagData(IA_PENS,NIL,msg.attrlist)
IF (data.screen)
IF (normal_data)
data.normal_rpi.width:=Long(normal_data)
data.normal_rpi.height:=Long(normal_data+4)
init_image(data.screen.rastport,data.normal_rpi,normal_data+8,data.shared_pens,data.def_pens,bgpen)
ENDIF
IF (data.selected_data)
data.selected_rpi.width:=Long(data.selected_data)
data.selected_rpi.height:=Long(data.selected_data+4)
init_image(data.screen.rastport,data.selected_rpi,data.selected_data+8,data.shared_pens,data.def_pens,data.selected_bgpen)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC chunkyim_dispose(cl:PTR TO iclass,obj:PTR TO object)
DEF data:PTR TO chunkyidata
data:=INST_DATA(cl, obj)
free_shared_pens(data)
free_image(data.normal_rpi)
free_image(data.selected_rpi)
ENDPROC
PROC chunkyim_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
DEF data:PTR TO chunkyidata
DEF retval=TRUE
DEF switch
data:=INST_DATA(cl, obj)
switch:=msg.attrid
SELECT switch
CASE IA_PENS;msg.storage:=data.def_pens
CASE CHUNKYIA_SELECTEDBGPEN;msg.storage:=data.selected_bgpen
CASE CHUNKYIA_SELECTEDDATA;msg.storage:=data.selected_data
CASE CHUNKYIA_SCREEN;msg.storage:=data.screen
DEFAULT;retval:=FALSE
ENDSELECT
ENDPROC retval
PROC chunkyim_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
DEF data:PTR TO chunkyidata
DEF ti:PTR TO tagitem
DEF tstate:PTR TO tagitem
DEF nimg_update=FALSE
DEF simg_update=FALSE
DEF normal_data=FALSE
DEF bgpen
DEF switch
tstate:=msg.attrlist
data:=INST_DATA(cl, obj)
WHILE (ti:=NextTagItem({tstate}))
switch:=ti.tag
SELECT switch
CASE IA_PENS;data.def_pens:=ti.data;nimg_update:=TRUE;simg_update:=TRUE
CASE IA_DATA;nimg_update:=TRUE
CASE CHUNKYIA_SELECTEDBGPEN;data.selected_bgpen:=ti.data;simg_update:=TRUE
CASE CHUNKYIA_SELECTEDDATA
data.selected_data:=ti.data
IF (ti.data)
simg_update:=TRUE
ELSE
free_image(data.selected_rpi)
ENDIF
CASE CHUNKYIA_PALETTE;init_shared_pens(data,ti.data);nimg_update:=TRUE;simg_update:=TRUE
ENDSELECT
ENDWHILE
GetAttr(IA_DATA,obj,{normal_data})
IF ((nimg_update) AND (data.screen) AND (normal_data))
GetAttr(IA_BGPEN,obj,{bgpen})
data.normal_rpi.width:=Long(normal_data)
data.normal_rpi.height:=Long(normal_data+4)
init_image(data.screen.rastport,data.normal_rpi,(normal_data+8),data.shared_pens,data.def_pens,bgpen)
ENDIF
IF ((simg_update) AND (data.screen) AND (data.selected_data))
data.selected_rpi.width:=Long(data.selected_data)
data.selected_rpi.height:=Long(data.selected_data+4)
init_image(data.screen.rastport,data.selected_rpi,(data.selected_data+8),data.shared_pens,data.def_pens,data.selected_bgpen)
ENDIF
ENDPROC
PROC chunkyim_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO impdraw)
DEF data:PTR TO chunkyidata
DEF rpi:PTR TO rp_info
DEF left,top,width,height
DEF switch
DEF bsa:PTR TO bitscaleargs
DEF temp_rp:PTR TO rastport
data:=INST_DATA(cl, obj)
switch:=msg.state
SELECT switch
CASE IDS_SELECTED;rpi:=data.selected_rpi
CASE IDS_INACTIVESELECTED;rpi:=data.selected_rpi
DEFAULT;rpi:=data.normal_rpi
ENDSELECT
IF (rpi.rp=0) THEN rpi:=data.normal_rpi
IF (rpi.rp)
GetAttr(IA_LEFT,obj,{left})
GetAttr(IA_TOP,obj,{top})
IF (msg.methodid=IM_DRAWFRAME)
width:=msg.dimensionswidth
height:=msg.dimensionsheight
ELSE
GetAttr(IA_WIDTH,obj,{width})
GetAttr(IA_HEIGHT,obj,{height})
ENDIF
left:=left+msg.offsetx
top:=top+msg.offsety
IF ((width=rpi.width) AND (height=rpi.height))
ClipBlit(rpi.rp,0,0,msg.rport,left,top,rpi.width,rpi.height,$C0)
ELSE
temp_rp:=init_rastport(msg.rport,width,height)
IF (temp_rp)
NEW bsa
bsa.srcx:=0
bsa.srcy:=0
bsa.srcwidth:=rpi.width
bsa.srcheight:=rpi.height
bsa.xsrcfactor:=rpi.width
bsa.ysrcfactor:=rpi.height
bsa.destx:=0
bsa.desty:=0
bsa.destwidth:=width
bsa.destheight:=height
bsa.xdestfactor:=width
bsa.ydestfactor:=height
bsa.srcbitmap:=rpi.rp.bitmap
bsa.destbitmap:=temp_rp.bitmap
bsa.flags:=0
BitMapScale(bsa)
ClipBlit(temp_rp,0,0,msg.rport,left,top,width,height,$C0)
free_rastport(temp_rp,width,height)
END bsa
ENDIF
ENDIF
ENDIF
ENDPROC
PROC chunkyim_hitframe(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO imphittest)
DEF left,top
GetAttr(IA_LEFT,obj,{left})
GetAttr(IA_TOP,obj,{top})
RETURN (msg.pointx>=left AND msg.pointy>=top AND msg.pointx<(left+msg.dimensionswidth) AND msg.pointy<(left+msg.dimensionsheight))
ENDPROC
PROC chunkyim_eraseframe(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO imperase)
DEF left,top
GetAttr(IA_LEFT,obj,{left})
GetAttr(IA_TOP,obj,{top})
left:=left+msg.offsetx
top:=top+msg.offsety
EraseRect(msg.rport,left,top,left+msg.dimensionswidth-1,top+msg.dimensionsheight-1)
ENDPROC
PROC chunkyi_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
DEF retval=0
DEF switch
IF (utilitybase=0) THEN utilitybase:=OpenLibrary('utility.library',37)
switch:=msg.methodid
SELECT switch
CASE OM_NEW
retval:=doSuperMethodA(cl,obj,msg)
IF retval
chunkyim_new(cl,retval,msg)
ENDIF
CASE OM_DISPOSE
chunkyim_dispose(cl,obj)
retval:=doSuperMethodA(cl,obj,msg)
CloseLibrary(utilitybase)
utilitybase:=0
CASE OM_GET
retval:=chunkyim_get(cl,obj,msg)
IF (retval=0) THEN retval:=doSuperMethodA(cl,obj,msg)
CASE OM_SET
retval:=1
doSuperMethodA(cl,obj,msg)
chunkyim_set(cl,obj,msg)
CASE IM_DRAW;chunkyim_draw(cl,obj,msg)
CASE IM_DRAWFRAME;chunkyim_draw(cl,obj,msg)
CASE IM_HITFRAME;retval:=chunkyim_hitframe(cl,obj,msg)
CASE IM_ERASEFRAME;chunkyim_eraseframe(cl,obj,msg)
DEFAULT;retval:=doSuperMethodA(cl,obj,msg)
ENDSELECT
ENDPROC retval
PROC init_chunkyiclass()
DEF cl:PTR TO iclass
IF cl:=MakeClass('chunkyiclass','imageclass',NIL,SIZEOF chunkyidata,0)
installhook(cl.dispatcher,{chunkyi_dispatcher})
ENDIF
ENDPROC cl
PROC free_chunkyiclass(cl) IS FreeClass(cl)
PROC main() IS EMPTY
ver:
CHAR 0, '$VER: chunkyimage.class 2.0 (4.10.95)', 0,0