;/*************************************************************************
; ***                            KILLCOLOR.A              (JJB TEMPLAR) ***
; *** Date begun: 30/4/89                                               ***
; *** Last modified: 1/5/89                                             ***
; *************************************************************************/
                CSECT   text

                INCLUDE     "exec/types.i"
                INCLUDE     "graphics/gfx.i"

                XDEF        _killcolor
                XREF        _GfxBase

BltBitMap       EQU        -$001e

BLT_VANILLA:    EQU        -$40         ; $c0
BLT_INVERT:     EQU         $30
BLT_FLAT:       EQU        -$78         ; $88   B & C
BLT_PRE_INV:    EQU         $22         ;       !B & C
BLT_KILL:       EQU         $22         ;       !B & C
BLT_OR:         EQU        -$12         ; $ee   B | C

* storage offsets from a5
param_src:      EQU         8           ; source bitmap
param_col:      EQU         12          ; kill color
param_dst:      EQU         16          ; mask bitmap (only plane 0 used)
param_rep:      EQU         20          ; dye color
param_minx:     EQU         24          ; bounds
param_miny:     EQU         28          ;
param_maxx:     EQU         32          ;
param_maxy:     EQU         36          ;

local_tempBM:   EQU         -bm_SIZEOF  ; temporary BitMap
local_sizex:    EQU         local_tempBM-4
local_sizey:    EQU         local_sizex-4   ; dimensions (for BltBitMap)

localsize:      EQU         local_sizey     ; local storage requirements

_killcolor: link      a5,#localsize
            movea.l   _GfxBase(a4),a6       ; load library pointer
            movem.l   d2-d7/a2-a4,-(a7)     ; save a4 too
            movea.l   param_src(a5),a3      ; a3 = src
            movea.l   param_dst(a5),a2      ; a2 = dst

            move.w    param_col+2(a5),d7    ; d7.lo = col

    ; use d5 now to clear d5.hi before first call to doblit
            move.l    param_minx(a5),d2     ; d2 = minx
            move.l    param_maxx(a5),d5     ; d5 = maxx
            sub.l     d2,d5
            addq.l    #1,d5                 ; d5 = sizex
            move.w    d5,d4                 ; d4.lo = sizex
            swap      d4                    ; now d4.hi = sizex
            move.l    param_miny(a5),d3
            move.l    param_maxy(a5),d1
            sub.l     d3,d1
            addq.l    #1,d1                 ; d1 = sizey
            move.w    d1,d4                 ; now d4.lo = sizey

            movea.l   a3,a0                 ; tempMB = *src
            lea       local_tempBM(a5),a1
            movea.l   a1,a4                 ; this is what I use a4 for!
            moveq     #09,d0
tightloop:  move.l    (a0)+,(a1)+
            dbf       d0,tightloop
            move.b    #01,bm_Depth(a4)

            btst      #0000,d7
            beq.b     skip1
            moveq     #BLT_VANILLA,d6
            bra.b     skip2
skip1:      moveq     #BLT_INVERT,d6        ; d6 = minterm
skip2:
            movea.l   a4,a0                 ; srcBitMap = tempBM
            movea.l   a2,a1                 ; destBitMap = dst
            bsr       doblit

            moveq     #01,d5
firstloop:  moveq     #00,d0
            move.b    bm_Depth(a3),d0
            cmp.l     d0,d5
            bge.b     writeback

            move.l    d5,d0
            asl.l     #2,d0
            move.l    bm_Planes(a3,d0.l),bm_Planes(a4)

            moveq     #01,d1
            asl.l     d5,d1
            and.w     d7,d1
            beq.b     skip3
            moveq     #BLT_FLAT,d6
            bra.b     skip4
skip3:      moveq     #BLT_PRE_INV,d6
skip4:
            movea.l   a4,a0                 ; srcBitMap = tempBM
            movea.l   a2,a1                 ; destBitMap = dst
            bsr       doblit

            addq.l    #1,d5
            bra.b     firstloop

writeback:  moveq     #00,d5
            move.w    param_rep+2(a5),d7    ; d7.lo = rep
secndloop:  moveq     #00,d0
            move.b    bm_Depth(a3),d0
            cmp.l     d0,d5
            bge.b     finis

            move.l    d5,d0
            asl.l     #2,d0
            move.l    bm_Planes(a3,d0.l),bm_Planes(a4)

            moveq     #01,d1
            asl.l     d5,d1
            and.w     d7,d1
            beq.b     skip5
            moveq     #BLT_OR,d6
            bra.b     skip6
skip5:      moveq     #BLT_KILL,d6
skip6:
            movea.l   a2,a0                 ; srcBitMap = dst
            movea.l   a4,a1                 ; destBitMap = tempBM
            bsr       doblit

            addq.l    #1,d5
            bra.b     secndloop

finis:      movem.l   (a7)+,d2-d7/a2-a4     ; restore a4 too
            unlk      a5
            rts

*============= a0 and a1 should be preset.
doblit:     movem.l   d4-d5/d7/a2,-(a7)     ; save temporarily

            move.l    d2,d0                 ; srcX = minx
            move.l    d3,d1                 ; srcY = miny
                                            ; minx, miny already in d2/d3
            move.w    d4,d5                 ; d5.hi == 0
            swap      d4
            ext.l     d4                    ; make d4.hi 0
                                            ; minterm already in d6
            moveq     #1,d7                 ; mask = 1
            movea.l   #0,a2                 ; tempA = NULL

            jsr       BltBitMap(a6)         ; make the call
            movem.l   (a7)+,d4-d5/d7/a2     ; restore registers

            rts

            END
