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

		csect		str.o,0,0,1,2

		XDEF		_stretch

UPPER_SIDE	EQU		3
LOWER_SIDE	EQU		4
HORIZ_ONLY	EQU		6

RASTPORT	EQU		48
X_COORD		EQU		52
Y_COORD		EQU		56
WIDTH		EQU		60
HEIGHT		EQU		64
MODE		EQU		68

INNER_WIDTH	EQU		76
INNER_HEIGHT	EQU		80

_stretch	MOVEM.L		D2-D7/A2-A6,-(A7)
		MOVEA.L		RASTPORT(A7),A0
		MOVEA.L		rp_BitMap(A0),A0
		MOVE.W		bm_BytesPerRow(A0),D7
		MOVE.L		HEIGHT(A7),D6
		MOVE.W		D6,D2
		SUBQ.W		#1,D2
		MOVE.W		D2,D4
		CMPI.L		#HORIZ_ONLY,MODE(A7)
		BNE		upper_side
horiz_only	MOVE.W		D2,D3
		SUBQ.W		#1,D3
		MOVEQ		#-2,D0
		MOVEQ		#-2,D1
		BRA		counters_set
upper_side	MOVE.L		HEIGHT(A7),D6
		ASR.W		#1,D6
		CMPI.L		#LOWER_SIDE,MODE(A7)
		BEQ		lower_side
		CMPI.L		#UPPER_SIDE,MODE(A7)
		BNE		exit
		SUBQ.W		#1,D6
		MOVEQ		#-1,D0
		MOVEQ		#-2,D1
		BRA		sides
lower_side	MOVEQ		#1,D4
		MOVEQ		#1,D0
		MOVEQ		#2,D1
sides		MOVE.W		D6,D2
		MOVE.W		D2,D3
counters_set	MOVE.W		D4,D5
		SUBQ.W		#1,D5
		MOVE.L		Y_COORD(A7),D6
		ADD.W		D6,D2
		ADD.W		D6,D3
		ADD.W		D6,D4
		ADD.W		D6,D5
		MOVE.L		WIDTH(A7),D6
		ADD.L		X_COORD(A7),D6
		SUBQ.L		#1,D6
		MOVEA.W		D6,A6
		ASR.L		#3,D6
		MULS.W		D7,D2
		ADD.L		D6,D2
		MULS.W		D7,D3
		ADD.L		D6,D3
		MOVE.W		A6,D6
		ANDI.W		#7,D6
		MOVEA.W		#7,A6
		SUBA.W		D6,A6
		MOVE.W		A6,D6
		SWAP		D6
		MOVEA.L		D6,A6
		MOVE.L		WIDTH(A7),D6
		ASL.L		#1,D6
		ADD.L		X_COORD(A7),D6
		SUBQ.L		#1,D6
		MOVEA.W		D6,A6
		ASR.L		#3,D6
		MULS.W		D7,D4
		ADD.L		D6,D4
		MULS.W		D7,D5
		ADD.L		D6,D5
		MULS.W		D7,D0
		MULS.W		D7,D1
		MOVE.L		WIDTH(A7),D6
		ASR.L		#3,D6
		ADD.L		D6,D0
		ASL.L		#1,D6
		ADD.L		D6,D1
		MOVEQ		#0,D7
		MOVE.B		bm_Depth(A0),D7
		SUBQ.B		#1,D7
		ASL.B		#2,D7
plane_loop	MOVEA.L		bm_Planes(A0,D7.W),A1
		MOVEA.L		A1,A2
		ADDA.L		D2,A2
		MOVEA.L		A1,A3
		ADDA.L		D3,A3
		MOVEA.L		A1,A4
		ADDA.L		D4,A4
		MOVEA.L		A1,A5
		ADDA.L		D5,A5
		MOVEM.L		D2-D5,-(A7)
		MOVE.L		INNER_HEIGHT(A7),D3
		ASR.B		#1,D3
		SUBQ.B		#1,D3
line_loop	MOVE.L		INNER_WIDTH(A7),D2
		SUBQ.W		#1,D2
		MOVE.L		A6,D4
		ANDI.B		#7,D4
		MOVEQ		#7,D5
		SUB.B		D4,D5
		SWAP		D4
pixel_loop	BTST.B		D4,(A2)
		BEQ		reset_bit_1
		BSET.B		D5,(A4)
		ADDQ.B		#1,D5
		BSET.B		D5,(A4)
		BRA		bit_set_1
reset_bit_1	BCLR.B		D5,(A4)
		ADDQ.B		#1,D5
		BCLR.B		D5,(A4)
bit_set_1	SUBQ.B		#1,D5
		BTST.B		D4,(A3)
		BEQ		reset_bit_2
		BSET.B		D5,(A5)
		ADDQ.B		#1,D5
		BSET.B		D5,(A5)
		BRA		bit_set_2
reset_bit_2	BCLR.B		D5,(A5)
		ADDQ.B		#1,D5
		BCLR.B		D5,(A5)
bit_set_2	ADDQ.B		#1,D4
		ANDI.B		#7,D4
		BNE		no_next_source
		SUBA.L		#1,A2
		SUBA.L		#1,A3
no_next_source	ADDQ.B		#1,D5
		ANDI.B		#7,D5
		BNE		no_next_dest
		SUBA.L		#1,A4
		SUBA.L		#1,A5
no_next_dest	DBRA		D2,pixel_loop
		ADDA.L		D0,A2
		ADDA.L		D0,A3
		ADDA.L		D1,A4
		ADDA.L		D1,A5
		DBRA		D3,line_loop
		MOVEM.L		(A7)+,D2-D5
		SUBQ.B		#4,D7
		BPL		plane_loop
exit		MOVEM.L		(A7)+,D2-D7/A2-A6
		RTS

		END
