home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / icon_tools / iconian296 / sources / chunkyimage.e next >
Text File  |  1995-10-04  |  11KB  |  388 lines

  1. /*
  2. *  When making chunkyimages, if the width is a multiple of 8, WritePixelArray()
  3. *  is used.  This speeds up things ALOT for larger images!!!
  4. */
  5.  
  6. OPT PREPROCESS
  7. LIBRARY 'chunkyimage.class',2,0,'chunkyiclass 2.0 (4.10.95)' IS init_chunkyiclass,free_chunkyiclass
  8.  
  9. MODULE    'amigalib/boopsi'
  10. MODULE    'tools/installhook'
  11. MODULE    'exec/memory'
  12. MODULE    'graphics/gfxbase','graphics/scale','graphics/gfx','graphics/rastport','graphics/view'
  13. MODULE    'utility'
  14. MODULE    'exec/types'
  15. MODULE    'intuition/classes','intuition/imageclass','intuition/cghooks','intuition/classusr',
  16.                 'intuition/screens','intuition/intuition'
  17. MODULE    'utility/tagitem'
  18.  
  19. MODULE    'class/chunkyimage'
  20.  
  21. OBJECT rp_info 
  22.     width:INT
  23.     height:INT
  24.     rp:PTR TO rastport
  25. ENDOBJECT
  26.  
  27. OBJECT chunkyidata
  28.     screen:PTR TO screen
  29.     selected_bgpen:LONG
  30.     num_pens:LONG
  31.     shared_pens:LONG
  32.     def_pens:LONG
  33.     selected_data:LONG
  34.     normal_rpi:rp_info
  35.     selected_rpi:rp_info
  36.     precision:LONG
  37. ENDOBJECT
  38.  
  39. PROC free_rastport(rp:PTR TO rastport,width,height)
  40.     IF ((rp) AND (rp.bitmap))
  41.         FreeBitMap(rp.bitmap)
  42.     ENDIF
  43.     Dispose(rp)
  44. ENDPROC
  45.  
  46. PROC init_rastport(parent_rp:PTR TO rastport,width,height)
  47.     DEF    rp:PTR TO rastport
  48.     rp:=New(SIZEOF rastport)
  49.     InitRastPort(rp)
  50.     IF (rp)
  51.         rp.layer:=NIL
  52. ->        rp.bitmap:=AllocBitMap(width,height,parent_rp.bitmap.depth,BMF_CLEAR,parent_rp.bitmap)
  53.         rp.bitmap:=AllocBitMap(width,height,parent_rp.bitmap.depth,BMF_CLEAR,0)
  54.         IF (rp.bitmap=0)
  55.             free_rastport(rp,width,height)
  56.             rp:=NIL
  57.             DisplayBeep(0)
  58.         ENDIF
  59.     ENDIF
  60. ENDPROC rp
  61.         
  62.  
  63. PROC free_shared_pens(data:PTR TO chunkyidata)
  64.     DEF    n
  65.     IF (data.shared_pens)
  66.         FOR n:=0 TO data.num_pens-1
  67.             IF (Long(data.shared_pens+(n*4))<>-1)
  68.                 ReleasePen(data.screen.viewport.colormap,Long(data.shared_pens+(n*4)))
  69.             ENDIF
  70.         ENDFOR
  71.         Dispose(data.shared_pens)
  72.         data.shared_pens:=0
  73.     ENDIF
  74. ENDPROC
  75.  
  76. PROC init_shared_pens(data:PTR TO chunkyidata,palette)
  77.     DEF n
  78.     free_shared_pens(data)
  79.     IF (palette)    
  80.         data.num_pens:=Long(palette)
  81.         data.shared_pens:=New((data.num_pens*4)+64)
  82.     ENDIF
  83.     IF ((data.shared_pens) AND (data.screen))
  84.         FOR n:=0 TO (data.num_pens-1)
  85.             PutLong(data.shared_pens+(n*4),ObtainBestPenA(data.screen.viewport.colormap,
  86.                                                                                                     Long(palette+(n*12)+4),
  87.                                                                                                     Long(palette+(n*12)+8),
  88.                                                                                                     Long(palette+(n*12)+12),
  89.                                                                                                     [OBP_PRECISION,data.precision,TAG_DONE]:LONG))
  90.         ENDFOR
  91.     ENDIF
  92. ENDPROC
  93.  
  94. PROC free_image(rpi:PTR TO rp_info)
  95.     free_rastport(rpi.rp,rpi.width,rpi.height)
  96.     rpi.rp:=NIL
  97. ENDPROC
  98.  
  99. PROC init_image(parent_rp:PTR TO rastport,rpi:PTR TO rp_info,imagedata,shared_pens,def_pens,bgpen)
  100.     DEF x,y
  101.     DEF buffer,bufptr:PTR TO CHAR,pen
  102.     DEF undotmpras=NIL:PTR TO rastport
  103.     DEF undotmpbm=NIL:PTR TO bitmap
  104.     DEF char:PTR TO CHAR
  105.     DEF long:PTR TO LONG
  106.  
  107.     free_image(rpi)
  108.     IF ((imagedata) AND (parent_rp))
  109.         rpi.rp:=init_rastport(parent_rp,rpi.width,rpi.height)
  110.         IF (rpi.rp)
  111.             NEW undotmpras
  112.             CopyMem(rpi.rp,undotmpras,SIZEOF rastport)
  113.             undotmpbm:=AllocBitMap(1,rpi.width,8,BMF_STANDARD OR BMF_CLEAR,parent_rp)
  114.             undotmpras.bitmap:=undotmpbm
  115.             buffer:=New((rpi.width+16)*rpi.height)
  116.             bufptr:=buffer
  117.             IF (undotmpbm)
  118.           FOR y:=0 TO rpi.height-1
  119.                     FOR x:=0 TO rpi.width-1
  120.                         char:=imagedata+x+(y*rpi.width)
  121.                         IF (char[0]=0)
  122.                             pen:=bgpen
  123.                         ELSE
  124.                             char:=(imagedata+x+(y*rpi.width))
  125.                             long:=(shared_pens+(char[0]*4))
  126.                             IF ((shared_pens) AND ((long[0])<>-1))
  127.                                 long:=(shared_pens+((char[0])*4))
  128.                                 pen:=long[0]
  129.                             ELSE
  130.                                 IF (def_pens)
  131.                                     long:=(def_pens+(char[0]*4))
  132.                                     pen:=long[0]
  133.                                 ELSE
  134.                                     pen:=char[0]
  135.                                 ENDIF
  136.                             ENDIF
  137.                         ENDIF
  138.                         bufptr[0]:=pen
  139.                         bufptr:=bufptr+1
  140.                     ENDFOR
  141.                     WritePixelLine8(rpi.rp,0,y,rpi.width-1,buffer+(y*rpi.width),undotmpras)
  142.                 ENDFOR
  143.                 WaitBlit()
  144.                 Dispose(buffer)
  145.                 FreeBitMap(undotmpbm)
  146.                 END undotmpras
  147.             ENDIF            
  148.         ELSE
  149.             DisplayBeep(0)
  150.         ENDIF
  151.     ELSE
  152.         DisplayBeep(0)
  153.     ENDIF
  154. ENDPROC
  155.  
  156.  
  157. PROC chunkyim_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  158.     DEF    data:PTR TO chunkyidata
  159.     DEF normal_data=0
  160.     DEF dri=0:PTR TO drawinfo
  161.     DEF bgpen
  162.     DEF fti
  163.     data:=INST_DATA(cl, obj)
  164.  
  165.     GetAttr(IA_DATA,obj,{normal_data})
  166.     IF (normal_data>0)
  167.         fti:=FindTagItem(IA_WIDTH,msg.attrlist)
  168.         IF (fti=0) THEN obj::image.width:=Long(normal_data)
  169.         fti:=FindTagItem(IA_HEIGHT,msg.attrlist)
  170.         IF (fti=0) THEN obj::image.height:=Long(normal_data+4)
  171.         data.shared_pens:=NIL
  172.         data.precision:=GetTagData(CHUNKYIA_PRECISION,PRECISION_IMAGE,msg.attrlist)
  173.         data.screen:=GetTagData(CHUNKYIA_SCREEN,NIL,msg.attrlist)
  174.         init_shared_pens(data,GetTagData(CHUNKYIA_PALETTE,NIL,msg.attrlist))
  175.         IF (data.screen)
  176.             dri:=GetScreenDrawInfo(data.screen)
  177.         ENDIF
  178.         IF (FindTagItem(IA_BGPEN,msg.attrlist)=0) THEN obj::image.planeonoff:=IF (dri) THEN dri.pens[BACKGROUNDPEN] ELSE 0
  179.         data.selected_bgpen:=GetTagData(CHUNKYIA_SELECTEDBGPEN,IF (dri) THEN dri.pens[FILLPEN] ELSE 0,msg.attrlist)
  180.         IF (dri) THEN FreeScreenDrawInfo(data.screen,dri)
  181.         data.selected_data:=GetTagData(CHUNKYIA_SELECTEDDATA,NIL,msg.attrlist)
  182.         GetAttr(IA_BGPEN,obj,{bgpen})
  183.         data.def_pens:=GetTagData(IA_PENS,NIL,msg.attrlist)
  184.         IF (data.screen)
  185.             IF (normal_data)
  186.                 data.normal_rpi.width:=Long(normal_data)
  187.                 data.normal_rpi.height:=Long(normal_data+4)
  188.                 init_image(data.screen.rastport,data.normal_rpi,normal_data+8,data.shared_pens,data.def_pens,bgpen)
  189.             ENDIF
  190.             IF (data.selected_data)
  191.                 data.selected_rpi.width:=Long(data.selected_data)
  192.         data.selected_rpi.height:=Long(data.selected_data+4)
  193.         init_image(data.screen.rastport,data.selected_rpi,data.selected_data+8,data.shared_pens,data.def_pens,data.selected_bgpen)
  194.             ENDIF
  195.         ENDIF
  196.     ENDIF
  197. ENDPROC
  198.  
  199. PROC chunkyim_dispose(cl:PTR TO iclass,obj:PTR TO object)
  200.     DEF data:PTR TO chunkyidata
  201.     data:=INST_DATA(cl, obj)
  202.     free_shared_pens(data)
  203.     free_image(data.normal_rpi)
  204.     free_image(data.selected_rpi)
  205. ENDPROC
  206.  
  207. PROC chunkyim_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  208.     DEF data:PTR TO chunkyidata
  209.     DEF retval=TRUE
  210.     DEF switch
  211.     data:=INST_DATA(cl, obj)
  212.     switch:=msg.attrid
  213.     SELECT switch
  214.     CASE IA_PENS;msg.storage:=data.def_pens
  215.     CASE CHUNKYIA_SELECTEDBGPEN;msg.storage:=data.selected_bgpen
  216.     CASE CHUNKYIA_SELECTEDDATA;msg.storage:=data.selected_data
  217.     CASE CHUNKYIA_SCREEN;msg.storage:=data.screen
  218.     DEFAULT;retval:=FALSE
  219.     ENDSELECT
  220. ENDPROC retval
  221.  
  222. PROC chunkyim_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  223.     DEF data:PTR TO chunkyidata
  224.     DEF ti:PTR TO tagitem
  225.     DEF tstate:PTR TO tagitem
  226.     DEF nimg_update=FALSE
  227.     DEF simg_update=FALSE
  228.     DEF normal_data=FALSE
  229.     DEF bgpen
  230.     DEF switch
  231.  
  232.     tstate:=msg.attrlist
  233.     data:=INST_DATA(cl, obj)
  234.  
  235.     WHILE (ti:=NextTagItem({tstate}))
  236.         switch:=ti.tag
  237.         SELECT switch
  238.         CASE IA_PENS;data.def_pens:=ti.data;nimg_update:=TRUE;simg_update:=TRUE
  239.         CASE IA_DATA;nimg_update:=TRUE
  240.         CASE CHUNKYIA_SELECTEDBGPEN;data.selected_bgpen:=ti.data;simg_update:=TRUE
  241.         CASE CHUNKYIA_SELECTEDDATA
  242.             data.selected_data:=ti.data
  243.             IF (ti.data)
  244.                 simg_update:=TRUE
  245.             ELSE
  246.                 free_image(data.selected_rpi)
  247.             ENDIF
  248.         CASE CHUNKYIA_PALETTE;init_shared_pens(data,ti.data);nimg_update:=TRUE;simg_update:=TRUE
  249.         ENDSELECT
  250.     ENDWHILE
  251.     GetAttr(IA_DATA,obj,{normal_data})
  252.     IF ((nimg_update) AND (data.screen) AND (normal_data))
  253.         GetAttr(IA_BGPEN,obj,{bgpen})
  254.         data.normal_rpi.width:=Long(normal_data)
  255.         data.normal_rpi.height:=Long(normal_data+4)
  256.         init_image(data.screen.rastport,data.normal_rpi,(normal_data+8),data.shared_pens,data.def_pens,bgpen)
  257.     ENDIF
  258.     IF ((simg_update) AND (data.screen) AND (data.selected_data))
  259.         data.selected_rpi.width:=Long(data.selected_data)
  260.         data.selected_rpi.height:=Long(data.selected_data+4)
  261.         init_image(data.screen.rastport,data.selected_rpi,(data.selected_data+8),data.shared_pens,data.def_pens,data.selected_bgpen)
  262.     ENDIF
  263. ENDPROC
  264.  
  265. PROC chunkyim_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO impdraw)
  266.     DEF data:PTR TO chunkyidata
  267.     DEF rpi:PTR TO rp_info
  268.     DEF left,top,width,height
  269.     DEF switch
  270.     DEF    bsa:PTR TO bitscaleargs
  271.   DEF    temp_rp:PTR TO rastport
  272.  
  273.     data:=INST_DATA(cl, obj)
  274.     switch:=msg.state
  275.     SELECT switch
  276.     CASE IDS_SELECTED;rpi:=data.selected_rpi
  277.     CASE IDS_INACTIVESELECTED;rpi:=data.selected_rpi
  278.     DEFAULT;rpi:=data.normal_rpi
  279.     ENDSELECT
  280.     IF (rpi.rp=0) THEN rpi:=data.normal_rpi
  281.     IF (rpi.rp)
  282.         GetAttr(IA_LEFT,obj,{left})
  283.         GetAttr(IA_TOP,obj,{top})
  284.         IF (msg.methodid=IM_DRAWFRAME)
  285.             width:=msg.dimensionswidth
  286.             height:=msg.dimensionsheight
  287.         ELSE
  288.             GetAttr(IA_WIDTH,obj,{width})
  289.             GetAttr(IA_HEIGHT,obj,{height})
  290.         ENDIF
  291.         left:=left+msg.offsetx
  292.         top:=top+msg.offsety
  293.         IF ((width=rpi.width) AND (height=rpi.height))
  294.             ClipBlit(rpi.rp,0,0,msg.rport,left,top,rpi.width,rpi.height,$C0)
  295.         ELSE
  296.             temp_rp:=init_rastport(msg.rport,width,height)
  297.             IF (temp_rp)
  298.                 NEW bsa
  299.                 bsa.srcx:=0
  300.                 bsa.srcy:=0
  301.                 bsa.srcwidth:=rpi.width
  302.                 bsa.srcheight:=rpi.height
  303.                 bsa.xsrcfactor:=rpi.width
  304.                 bsa.ysrcfactor:=rpi.height
  305.                 bsa.destx:=0
  306.                 bsa.desty:=0
  307.                 bsa.destwidth:=width
  308.                 bsa.destheight:=height
  309.                 bsa.xdestfactor:=width
  310.                 bsa.ydestfactor:=height
  311.                 bsa.srcbitmap:=rpi.rp.bitmap
  312.                 bsa.destbitmap:=temp_rp.bitmap
  313.                 bsa.flags:=0
  314.                 BitMapScale(bsa)
  315.                 ClipBlit(temp_rp,0,0,msg.rport,left,top,width,height,$C0)
  316.                 free_rastport(temp_rp,width,height)
  317.                 END bsa
  318.             ENDIF
  319.         ENDIF
  320.     ENDIF
  321. ENDPROC
  322.  
  323. PROC chunkyim_hitframe(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO imphittest)
  324.     DEF left,top
  325.  
  326.     GetAttr(IA_LEFT,obj,{left})
  327.     GetAttr(IA_TOP,obj,{top})
  328.     RETURN (msg.pointx>=left AND msg.pointy>=top AND msg.pointx<(left+msg.dimensionswidth) AND msg.pointy<(left+msg.dimensionsheight))
  329. ENDPROC
  330.  
  331. PROC chunkyim_eraseframe(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO imperase)
  332.     DEF left,top
  333.  
  334.     GetAttr(IA_LEFT,obj,{left})
  335.     GetAttr(IA_TOP,obj,{top})
  336.     left:=left+msg.offsetx
  337.     top:=top+msg.offsety
  338.     EraseRect(msg.rport,left,top,left+msg.dimensionswidth-1,top+msg.dimensionsheight-1)
  339. ENDPROC
  340.  
  341. PROC chunkyi_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  342.     DEF retval=0
  343.     DEF switch
  344.  
  345.     IF (utilitybase=0) THEN utilitybase:=OpenLibrary('utility.library',37)
  346.  
  347.     switch:=msg.methodid
  348.     SELECT switch
  349.     CASE OM_NEW
  350.         retval:=doSuperMethodA(cl,obj,msg)
  351.         IF retval
  352.             chunkyim_new(cl,retval,msg)
  353.         ENDIF
  354.     CASE OM_DISPOSE
  355.         chunkyim_dispose(cl,obj)
  356.         retval:=doSuperMethodA(cl,obj,msg)
  357.         CloseLibrary(utilitybase)
  358.         utilitybase:=0
  359.     CASE OM_GET
  360.         retval:=chunkyim_get(cl,obj,msg)
  361.         IF (retval=0) THEN retval:=doSuperMethodA(cl,obj,msg)
  362.     CASE OM_SET
  363.         retval:=1
  364.         doSuperMethodA(cl,obj,msg)
  365.         chunkyim_set(cl,obj,msg)
  366.     CASE IM_DRAW;chunkyim_draw(cl,obj,msg)
  367.     CASE IM_DRAWFRAME;chunkyim_draw(cl,obj,msg)
  368.     CASE IM_HITFRAME;retval:=chunkyim_hitframe(cl,obj,msg)
  369.     CASE IM_ERASEFRAME;chunkyim_eraseframe(cl,obj,msg)
  370.     DEFAULT;retval:=doSuperMethodA(cl,obj,msg)
  371.     ENDSELECT
  372. ENDPROC retval
  373.  
  374. PROC init_chunkyiclass()
  375.     DEF cl:PTR TO iclass
  376.  
  377.     IF cl:=MakeClass('chunkyiclass','imageclass',NIL,SIZEOF chunkyidata,0)
  378.         installhook(cl.dispatcher,{chunkyi_dispatcher})
  379.     ENDIF
  380. ENDPROC cl
  381.  
  382. PROC free_chunkyiclass(cl) IS FreeClass(cl)
  383.  
  384. PROC main() IS EMPTY
  385.  
  386. ver:
  387. CHAR 0, '$VER: chunkyimage.class 2.0 (4.10.95)', 0,0
  388.