 Include "equ.h"
 Include "impequ.h"


 SECTION MACPAINT,CODE,PUBLIC

***************************************************
***						***
***************************************************
dumbentry:
	clr.l	d0
	rts

	dc.l	"IMPP"		; magik number for pic import
	dc.w	200
	dc.l	0

table:	dc.l	0
	dc.l	name,special,check,macp


***************************************
**   Is it really a MacPaint file?   **
***************************************
check:	move.l	table,a0
	move.l	buff1(a0),a1
        move.l  (a1),a1
	add.l   #65,a1
        lea     test,a0
        moveq	#3,d0
ck0:    cmp.b   (a1)+,(a0)+
        bne     never
        dbf     d0,ck0
        bra     right

***************************************
**                                   **
***************************************
macp:   move.l	sp,savesp
	
        move.l	table,a0
	move.l	flen(a0),a0
	move.l	(a0),piclength
	
        move.l  table,a0
	move.l	f_openr(a0),a0
	jsr	(a0)
	beq	rrts

	move.l	table,a0
	move.l	spclnum(a0),a0
	cmp.w	#1,(a0)
	beq	impobj


***************************************
**                                   **
***************************************
imppic:	move.l	table,a0
	move.l	p_open(a0),a0
	jsr	(a0)
	beq	rrts

	bsr	getpicinfo

	move.l	table,a4
	move.l	cwptr(a4),a4		;ptr to window handle
	move.l	(a4),a4			;window handle
	move.l	(a4),a4			;ptr to window structure

	lea	pic,a0
	move.w	pc_Type(a0),pi_Type(a4)
	move.w	pc_SFreq(a0),pi_SFreq(a4)
	move.w	pc_SAngle(a0),pi_SAngle(a4)
	move.w	pc_SSpot(a0),pi_SSpot(a4)
	move.l	pc_SMap(a0),pi_SMap(a4)
	move.l	pc_SMap+4(a0),pi_SMap+4(a4)
	move.w	pc_XDpi(a0),pi_XDpi(a4)
	move.w	pc_YDpi(a0),pi_YDpi(a4)
	move.w	pc_W(a0),pi_W(a4)
	move.w	pc_H(a0),pi_H(a4)
	move.w	pc_Width(a0),pi_Width(a4)
	move.w	pc_BitPln(a0),pi_BitPln(a4)
	move.w	pc_Palet(a0),pi_Palet(a4)

	move.w	pi_Palet(a4),d1
	mulu	#pl_Sizeof,d1
	move.w	pi_Width(a4),d0
	mulu	pi_BitPln(a4),d0
	mulu	pi_H(a4),d0
	add.l	d1,d0		;size of bitmap +( 4 words * #colors)

	clr.w	d1
	clr.w	d2
	move.l	table,a0
	move.l	m_alloc(a0),a0
	jsr	(a0)
	beq	abortpic

	move.l	table,a3
	move.l	cwptr(a3),a3
	move.l	(a3),a3
	move.l	(a3),a3
	move.l	a0,pi_Ptr(a3)
	move.l	(a0),a4
	move.l	a4,picptr

	bsr	putpic

	move.l	table,a0
	move.l	p_close(a0),a0
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)


abortpic:
	bsr	purgepic

	move.l	table,a0
	move.l	p_abort(a0),a0
	jsr	(a0)

abort0:	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)


***************************************
**                                   **
***************************************
impobj:	move.l	table,a0
	move.l	o_open(a0),a0
	jsr	(a0)
	beq	abort0

	bsr	getpicinfo

	move.b	#tpic,object+ob_Type
	clr.l	object+ob_Left
	clr.l	object+ob_Top

	move.w	pic+pc_W,d1
	move.l	#7200,d0
	bsr	Mulu1632
	move.w	pic+pc_XDpi,d2
	bsr	Divu1648
	move.l	d0,object+ob_Right

	move.w	pic+pc_H,d1
	move.l	#7200,d0
	bsr	Mulu1632
	move.w	pic+pc_YDpi,d2
	bsr	Divu1648
	move.l	d0,object+ob_Bottom

	clr.b	object+ob_Flag
	clr.w	object+ob_Slant
	clr.w	object+ob_Twist
	move.w	#50,object+ob_LWidth		;1 point line
	clr.b	object+ob_LType			;no line
	move.b	#1,object+ob_LColor		;black line
	clr.b	object+ob_FType			;no fill
	move.b	#1,object+ob_FColor		;black fill
	clr.b	object+ob_LBegin
	clr.b	object+ob_LEnd
	move.w	#900,object+ob_HStandOff	;1/8 inch
	move.w	#900,object+ob_VStandOff	;1/8 inch
*
*
	move.l	table,a1
	move.l	o_obj(a1),a1
	lea	object,a0
	jsr	(a1)
	beq	abortobj

	move.w	pic+pc_Width,d0
	mulu	pic+pc_BitPln,d0
	mulu	pic+pc_H,d0
	move.w	pic+pc_Palet,d1
	mulu	#pl_Sizeof,d1
	add.l	d1,d0
	add.l	#pc_Sizeof,d0

	move.l	table,a0
	move.l	o_malloc(a0),a0
	jsr	(a0)
	beq	abortobj

	lea	pic,a1
	clr.l	pc_DPtr(a1)
	clr.w	pc_DScale(a1)
	move.w	pc_Palet(a1),d0
	mulu	#pl_Sizeof,d0
	add.l	#pc_Sizeof,d0
	move.l	d0,pc_Ptr(a1)

	move.w	#pc_Sizeof/2-1,d0
oppic1:	move.w	(a1)+,(a0)+
	dbf	d0,oppic1
	move.l	a0,picptr

	bsr	putpic

	move.l	table,a0
	move.l	o_close(a0),a0
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)

abortobj:
	bsr	purgepic

	move.l	table,a0
	move.l	o_abort(a0),a0
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)


*******************************************
***	        			***
*******************************************
getpicinfo:
	lea	pic,a0
	move.w	#pc_Sizeof-1,d0
gpi1:	clr.b	(a0)+
	dbra	d0,gpi1

	clr.l	picture
	move.l	table,a1
	move.l	piclength,d0
	clr.w	d1
	clr.w	d2
	move.l	m_alloc(a1),a1
	jsr	(a1)			;allocate memory for the picture
	move.l	a0,picture
	clr.l	picoffset

	move.l	(a0),a0                 ;read in the entire picture
	move.l	piclength,d0
	move.l	table,a1
	move.l	f_getr(a1),a1
	jsr	(a1)
	beq	errrts

gpi2:   lea	pic,a0
        clr.l   d0
	move.b	#PC_BW,d0
	move.w	d0,pc_Type(a0)
	move.w	#-1,pc_SFreq(a0)
	move.w	#-1,pc_SAngle(a0)
	move.w	#0,pc_SSpot(a0)
	move.l	#0,pc_SMap(a0)
	move.l	#0,pc_SMap+4(a0)
	move.w	#72,pc_XDpi(a0)
	move.w	#72,pc_YDpi(a0)
        move.w  #576,pc_W(a0)           ;always this width
        move.w  #720,pc_H(a0)           ;always this height
	move.w	#72,pc_Width(a0)        ;bytes per row
	move.w	#1,pc_BitPln(a0)
	move.w	#0,pc_Palet(a0)

	rts


*******************************************
***					***
*******************************************
putpic:
	clr.l	picoffset
        
        move.w	pic+pc_Width,d0         ;set amiga bitmap to all white ($ff)
	mulu	pic+pc_BitPln,d0
	mulu	pic+pc_H,d0
	move.l	d0,d1
	swap	d1
	move.l	picptr,a0
	bra	pp2
pp1:	move.b	#$00,(a0)+
pp2:	dbf	d0,pp1
	dbf	d1,pp1

	move.l	picture,a0
	move.l	(a0),a0
	add.l	#640,a0         ;push a0 ahead to the pict data
        
        bsr     pckcomp
        
	bra	purgepic

**********************************
**                              **
**********************************
pckcomp:
        clr.l   d6
        clr.l   d0
        
        move.w  #720,d5         ;always 720 rows tall

        move.w  pic+pc_W,d6      ;d6 = number of bytes in row
        add.w   #7,d6
        lsr.w   #3,d6
        move.w  d6,d0           ;d0 = save d6
	bra	pk8

pk1:	move.w	d0,d6           ;reset d6 to number of bytes in row
	move.l	picptr,a1       ;a1 = adress in amiga bitmap

pk2:    clr.l   d1
        move.b  (a0)+,d1        ;d1 = one byte code
        cmp.b   #128,d1
        beq.s   pk2             ;code 128 = do nothing, so get next byte
        
        btst    #7,d1           ;check the high bit
        beq     op2             ;if 0 copy the next d1+1 bytes as is
    
op1:    neg.b   d1              ;else copy the next byte -d1+1 times
        sub.b   d1,d6           ;decrement row byte count
        subq.w  #1,d6
        
        move.b  (a0)+,d2        ;get the byte to copy         
op12:   move.b  d2,(a1)+        ;copy the byte
        dbf   d1,op12         ;loop until done (d1=-1)        
        bra     pk6

op2:    sub.b   d1,d6           ;decrement row byte count
        subq.w  #1,d6

op22:   move.b  (a0)+,(a1)+
	dbf   d1,op22

pk6:    tst.w   d6              ;are we done with a row yet
        bne     pk2             ;no - keep going
        
        move.l  a1,d6
        btst    #0,d6           ;did we end on an odd address
        beq     pk7
        move.b  #0,(a1)+

pk7:	move.l	picptr,a1
	add.w	pic+pc_Width,a1
	move.l	a1,picptr
        
pk8:    dbf     d5,pk1
        rts


***********************************
***				***
***********************************
Mulu1632:
        move.l  table,a0
        move.l  mulu1632(a0),a0
        jmp     (a0)
        
***********************************
***				***
***********************************
Divu1648:
        move.l  table,a0
        move.l  divu1648(a0),a0
        jmp     (a0)

***********************************
***				***
***********************************
errrts:	bsr	purgepic
	move.l	savesp,sp
rrts:	rts

purgepic:
	tst.l	picture
	beq	rrts
	move.l	picture,a0
	move.l	table,a1
	move.l	m_delete(a1),a1
	jsr	(a1)
	rts

*******************************************************************
***	called when the import routine choosen finds something	***
***	wrong with the file loaded.				***
*******************************************************************
never:	clr.w	d0
	rts

maybe:	move.w	#1,d0
	rts

right:	move.w	#2,d0
	rts

*************************************************************
*************************************************************
 SECTION MACPAINT,DATA,PUBLIC

special:
	dc.w	2
	dc.l	spcl1,spcl2

vers:   dc.b    "$VER: "
name:	dc.b	"MacPaint  v2.0.2",0

spcl1:	dc.b	"Picture Window",0
spcl2:	dc.b	"Object",0

test:   dc.b    "PNTG",0

 SECTION MACPAINT,BSS,PUBLIC
temp:		ds.l	1
temp2:		ds.l	1
savesp:		ds.l	1
picptr:		ds.l	1
pptr:		ds.l	1
pic:		ds.w	pc_Sizeof/2
object:		ds.w	ob_SizeOf/2

picture:	ds.l	1
picoffset:	ds.l	1
piclength:	ds.l	1



****************************** CHANGES ************************************
;
;       version 2.0.2
;
;       - added a version string
;
;
;       version 2.0.1
;       
;       - changed the default pc_SFreq and pc_SAngle from 0 to -1
;
;       - now only checks the TYPE field for PNTG (not creator for MPNT)
;
;
;       version 2.0.0
;
;       - initial release (shipped with PgS v2.0)                   
