** Example for a very simple Object-Class.
** It shows a sizeable picture
**
** (c) 1994 by Michael Friedrich
** All Rights Reserved.
**
** You may use parts of this code to create your own private TCLibs.
** You are also allowed to publish these TCLibs as long as I will get
** a copy them.
**

    include 'lvos.i'
    include 'tclib.i'

startall:
    moveq   #-13,d0     ; if user tries to start this lib!
    rts                 ;   (need -13 to identify TClibs!)
    dc.l 'TCLB'         ; TurboCalc-Lib - this field is used to identify
                        ;   TClibs and to link them in memory (i.e. that
                        ;   this entry is used and thus changed by TC
                        ;   to keep a list of all already loaded libs!)
    dc.l 'OBJT'
    dc.w 1,0            ; Version, Revision
    dc.l txt_name
    dc.l txt_ver
    dc.l txt_author
    dc.l 0              ; flags - reserved
    dc.l 0              ; reserved
    dc.l 0              ; reserved
* default-routines
    dc.l objclass_init  ; init
    dc.l 0  ; exit
    dc.l 0  ; flush
    dc.l 0
*
objclass_pic:
    dc.l 0
    dc.l objclass_picname
    dc.l 'LOGO'
    dc.b 0
    dc.b 1<<OBJCLASSFLAGS1_ACTIONTASK
    dc.b 0,0
    dc.l objpic_new
    dc.l objpic_duplicate
    dc.l objpic_free
    dc.l 0  ; for this example no edit-routine!
    dc.l objpic_draw
    dc.l objpic_load
    dc.l objpic_save
    dc.l objpic_action

objclass_picname: dc.b 'Iff-Logo (Example)',0

txt_name: dc.b '(Example) Logo-Objectclass',0
txt_ver: dc.b '$VER: Logo-Objectclass V1.0 (20.10.94)',0
txt_author: dc.b '© 1994 Michael Friedrich',0
 cnop 0,2




 STRUCTURE ObjPic,0

 WORD objpic_depth
 WORD objpic_width
 WORD objpic_height
 LABEL objpic_bitmap
* complete bitmap-structure
    WORD    objpicbm_BytesPerRow
    WORD    objpicbm_Rows
    BYTE    objpicbm_Flags
    BYTE    objpicbm_Depth
    WORD    objpicbm_Pad
    STRUCT  objpicbm_Planes,8*4
*
 LABEL ObjPic_SIZE

 STRUCTURE ObjPic_drawmem,0
 LABEL objpicdm_scalearg
    WORD   bsa_SrcX            ; source origin
    WORD   bsa_SrcY
    WORD   bsa_SrcWidth        ; source size
    WORD   bsa_SrcHeight
    WORD   bsa_XSrcFactor      ; scale factor denominators
    WORD   bsa_YSrcFactor
    WORD   bsa_DestX           ; destination origin
    WORD   bsa_DestY
    WORD   bsa_DestWidth       ; destination size result
    WORD   bsa_DestHeight
    WORD   bsa_XDestFactor     ; scale factor numerators
    WORD   bsa_YDestFactor
    LONG    bsa_SrcBitMap       ; source BitMap
    LONG    bsa_DestBitMap      ; destination BitMap
    LONG   bsa_Flags           ; reserved.  Must be zero!
    WORD   bsa_XDDA            ; reserved
    WORD   bsa_YDDA
    LONG    bsa_Reserved1
    LONG    bsa_Reserved2
 WORD objpicdm_tempwidth
 WORD objpicdm_tempheight
 LABEL objpicdm_bitmap2
    WORD    objpicbm2_BytesPerRow
    WORD    objpicbm2_Rows
    BYTE    objpicbm2_Flags
    BYTE    objpicbm2_Depth
    WORD    objpicbm2_Pad
    STRUCT  objpicbm2_Planes,8*4
 LABEL ObjPic_drawmem_SIZE


objclass_init:
* nothing to init, simply check if we are running with V36+
    GETGFX
    cmp.w   #36,$14(a6)
    bhs.s   10$
    moveq   #-1,d0
    rts
10$ moveq   #0,d0
    rts


**********************************

objpic_new:
    movem.l d2-d7/a2-a3,-(sp)
    moveq   #ObjPic_SIZE,d0
    XSR     AllocMemClear
    beq.s   90$
    move.l  a0,a3
*
    moveq   #2,d0   ; depth
    moveq   #$4b,d1 ; width
    moveq   #$20,d2 ; height
    movem.w d0-d2,objpic_depth(a3)
*
    lea     objpic_bitmap(a3),a0
    GETGFX
    CALL    _LVOInitBitMap
*
    lea     objpicbm_Planes(a3),a2
    move.l  #AppIcon_p,(a2)+
    move.l  #AppIcon_p+($50/8)*$20,(a2)
*
    move.l  a3,d0
    moveq   #0,d1   ; no _EDIT needed!
90$ movem.l (sp)+,d2-d7/a2-a3
    rts

objpic_duplicate
    move.l  a0,-(sp)
    moveq   #ObjPic_SIZE,d0
    XSR     AllocMemClear
    beq.s   90$
    move.l  (sp),a1
    move.l  a0,(sp)
    moveq   #ObjPic_SIZE/2-1,d0
21$ move.w  (a1)+,(a0)+
    dbra    d0,21$
    move.l  (sp),a0
    move.l  a0,d0
90$ addq.w  #4,sp
    rts
objpic_free
    XMP     FreeMem

objpic_draw
    movem.l d0-d7,-(sp)
    sub.l   d0,d2
    sub.l   d1,d3
    addq.l  #1,d2
    addq.l  #1,d3
    moveq   #0,d6
    cmp.w   #1000,d2    ; BlitScale fails, if with >1008
    blo.s   40$         ; so divide if it should be bigger
    move.l  d2,-(sp)
    divu    #1000,d2
    addq.w  #1,d2 ; divide in d2 pieces!!!
    move.w  d2,d6
    swap    d6
    move.l  (sp)+,d2
40$ moveq   #0,d7
    cmp.w   #1000,d3    ; for height this seems to work, but
    blo.s   50$         ; do it never the less for height, too.
    move.l  d3,-(sp)    ; first to be sure and second
    divu    #1000,d3    ; and second to limit temp-bitmap!!!)
    addq.w  #1,d3 ; divide in d3 pieces!!!
    move.w  d3,d7
    swap    d7
    move.l  (sp)+,d3
*** loop for all parts
50$ movem.l d0-d5/a0-a1,-(sp)
* d6/d7-1):
    move.l  d6,d4
    swap    d4
    tst.w   d4
    beq.s   51$
    divu    d4,d2
    move.l  d2,d5
    mulu    d6,d2
    add.l   d2,d0   ; add width/n * k
    moveq   #0,d2
    move.w  d5,d2
    subq.w  #1,d4
    cmp.w   d4,d6
    bne.s   51$
    swap    d5
    add.w   d5,d2   ; is last part, so add modula
51$ move.l  d7,d4
    swap    d4
    tst.w   d4
    beq.s   52$
    divu    d4,d3
    move.l  d3,d5
    mulu    d7,d3
    add.l   d3,d1   ; add height/n * k
    moveq   #0,d3
    move.w  d5,d3
    subq.w  #1,d4
    cmp.w   d4,d7
    bne.s   52$
    swap    d5
    add.w   d5,d3   ; is last part, so add modula
52$ movem.l 4*4(sp),d4/d5
*
    bsr.s   objpic_draw2
    movem.l (sp)+,d0-d5/a0-a1
    addq.w  #1,d6
    move.l  d6,d5
    swap    d5
    cmp.w   d5,d6
    blo.s   50$
*
    clr.w   d6
    addq.w  #1,d7
    move.l  d7,d5
    swap    d5
    cmp.w   d5,d7
    blo.s   50$
    movem.l (sp)+,d0-d7
    rts
* d0-d3: x/y/w/h, d6/d7: upper-word: #pieces, lower-word: piece-number (w/h)
objpic_draw2:
    movem.l d0-d7/a2-a4,-(sp)
    move.l  a0,a3

*** alloc second bitmap and blitscale-structure
    moveq   #ObjPic_drawmem_SIZE,d0
    XSR     AllocMemClear
    beq     90$
    move.l  a0,a4
*** fill blitscale-structure!
    lea     objpicdm_scalearg(a4),a1
    clr.l   (a1)+   ; source_x/y
    movem.w objpic_width(a3),d0-d1
* d6/d7-2):
    movem.l d4/d5,-(sp)
    move.l  d6,d4
    swap    d4
    tst.w   d4
    beq.s   21$
    divu    d4,d0
    move.l  d0,d5
    mulu    d6,d0
    move.w  d0,-4(a1)   ; new x-pos: width/n * k
    move.w  d5,d0
    subq.w  #1,d4
    cmp.w   d4,d6
    bne.s   21$
    swap    d5
    add.w   d5,d0       ; is last part, so add modula
21$ move.l  d7,d4
    swap    d4
    tst.w   d4
    beq.s   22$
    divu    d4,d1
    move.l  d1,d5
    mulu    d7,d1
    move.w  d1,-2(a1)   ; new y-pos: height/n * k
    move.w  d5,d1
    subq.w  #1,d4
    cmp.w   d4,d6
    bne.s   22$
    swap    d5
    add.w   d5,d1       ; is last part, so add modula
22$ movem.l (sp)+,d4/d5
*
    move.w  d0,(a1)+    ; source_width/height
    move.w  d1,(a1)+
    move.w  d0,(a1)+    ; source_factor
    move.w  d1,(a1)+
    clr.l   (a1)+       ; dest_x/y (are 0 for temp-bitmap!!!)
    clr.l   (a1)+       ; dest_w/h, is calculated by routine!
    move.w  d2,(a1)+    ; dest_factor
    move.w  d3,(a1)+    ; "
*
    lea     objpic_bitmap(a3),a0
    move.l  a0,(a1)+    ; source-bitmap
    lea     objpicdm_bitmap2(a4),a0
    move.l  a0,(a1)+    ; mid-bitmap
    clr.l   (a1)+   ; flags
*** init temp-bitmap!!!
* calc width
    lea     objpicdm_scalearg(a4),a0
    move.w  bsa_SrcWidth(a0),d0
    move.w  bsa_XDestFactor(a0),d1
    move.w  bsa_XSrcFactor(a0),d2
    CALL    -684    ; LVOScalerDiv
*
    move.l  d0,-(sp)
    lea     objpicdm_scalearg(a4),a0
    move.w  bsa_SrcHeight(a0),d0
    move.w  bsa_YDestFactor(a0),d1
    move.w  bsa_YSrcFactor(a0),d2
    CALL    -684    ; LVOScalerDiv
    move.l  d0,d2
    move.l  (sp)+,d1
    move.w  objpic_depth(a3),d0
* compare to dest-values and use higher ones!
    cmp.w   2+2*4(sp),d1
    bls.s   31$
    move.w  2+2*4(sp),d1
31$ cmp.w   2+3*4(sp),d2
    bls.s   32$
    move.w  2+3*4(sp),d2
32$ movem.w d1/d2,objpicdm_tempwidth(a4)
    lea     objpicdm_bitmap2(a4),a0
    movem.l d0-d2/a0,-(sp)
    CALL    _LVOInitBitMap
* alloc mem for temp-bitmap
    movem.l (sp)+,d0-d2/a0
    exg.l   d0,d1
    exg.l   d1,d2
    lea     8(a0),a0
35$ movem.l d0-d2/a0,-(sp)  ; x/y/w
    CALL    _LVOAllocRaster
    move.l  d0,d3
    movem.l (sp)+,d0-d2/a0
    move.l  d3,(a0)+
* well, no error checking here (but as this is only a test-objectclass
* i was too lazy :)
    subq.w  #1,d2
    bne.s   35$
*** blit & scale from first bitmap to temp-bitmap
    lea     objpicdm_scalearg(a4),a0
    CALL    -678    ; _LVOBitMapScale
*** blit temp to rastport
    lea     objpicdm_bitmap2(a4),a0
    move.l  a2,a1
    moveq   #0,d0   ; temp-x/y
    moveq   #0,d1
    movem.l (sp),d2-d5  ; dest-x/y/w/h
    move.w  #$c0,d6     ; copy!
    CALL    _LVOBltBitMapRastPort
*** free allocated structure(s) and end
* free raster
50$ moveq   #0,d2
    move.b  objpicbm2_Depth(a4),d2
    lea     objpicbm2_Planes(a4),a3
51$ move.l  (a3)+,a0
    movem.w objpicdm_tempwidth(a4),d0-d1
    CALL    _LVOFreeRaster
    subq.w  #1,d2
    bne.s   51$
** free temp-structure
    move.l  a4,a0
    XSR     FreeMem
90$ movem.l (sp)+,d0-d7/a2-a4
    rts


objpic_load
    tst.l   d0
    bne.s   10$
* d0=0: ask for 6 bytes to load!
    moveq   #6,d0
    suba.l  a0,a0
    rts
* d0=1, a0=*mem for the requested 6 bytes - there aren't used here!
10$ bsr     objpic_new
    move.l  d0,a0
    moveq   #0,d0   ; free the allocated mem!
    rts

objpic_save:
* normally you needn't save any data for this test-objectclass
* to show saving, depth, width and height of the picture are written
* a0 is set, needn't change
    moveq   #6,d0   , write first 6 bytes of a0
    moveq   #0,d1   ; do not free this mem
    rts

objpic_action:
* no action, simply return...
    moveq   #0,d0
    rts



 SECTION Graphic,DATA_C

AppIcon_p:
 dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
 dc.w $4040,$1002,$0040,$0801,$0040
 dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
 dc.w $4040,$0000,$0000,$0000,$0040
 dc.w $404b,$81c0,$36b5,$c000,$0040
 dc.w $404a,$01c0,$3e80,$0000,$0040
 dc.w $6a80,$0000,$0000,$0000,$0040
 dc.w $4040,$0000,$0000,$0000,$0040
 dc.w $4042,$8000,$7e00,$001c,$0040
 dc.w $4042,$8000,$7e00,$0014,$0040
 dc.w $5540,$0000,$0000,$0000,$0040
 dc.w $4040,$0000,$0000,$0000,$0040
 dc.w $4049,$0180,$3808,$8000,$0040
 dc.w $4049,$0180,$3808,$0000,$0040
 dc.w $6ac0,$0000,$0000,$0000,$0040
 dc.w $4046,$0000,$0000,$0000,$0040
 dc.w $4046,$0700,$001f,$ffff,$ffc0
 dc.w $4040,$0000,$001f,$ffff,$ffc0
 dc.w $5540,$0000,$0010,$0000,$0040
 dc.w $4040,$0000,$0011,$3800,$1c40
 dc.w $4040,$07a0,$1e11,$3800,$1c40
 dc.w $4040,$05e0,$0f11,$381c,$1c40
 dc.w $6ac0,$0000,$0011,$3f1c,$1c40
 dc.w $4040,$0000,$0011,$3f1c,$1c40
 dc.w $4042,$8000,$0013,$ffff,$ff40
 dc.w $4042,$8000,$0011,$0003,$8040
 dc.w $6ae0,$0000,$0011,$0003,$8040
 dc.w $4040,$0000,$0011,$0003,$8040
 dc.w $4040,$0000,$0010,$0000,$0040
 dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $0007,$00e0,$1c03,$8070,$1c00
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $003f,$effd,$ffbf,$f7fe,$ff80
 dc.w $0e34,$7fff,$c94a,$3fff,$ff80
 dc.w $0031,$effd,$c13f,$f7fe,$ff80
 dc.w $0015,$5555,$5555,$5555,$5500
 dc.w $003f,$effd,$ffbf,$f7fe,$ff80
 dc.w $0e3d,$7fff,$ffff,$ffe3,$ff80
 dc.w $003d,$6ffd,$ffbf,$f7ea,$ff80
 dc.w $0015,$5555,$5555,$5555,$5500
 dc.w $003f,$effd,$ffbf,$f7fe,$ff80
 dc.w $0e36,$fe7f,$c7f7,$7fff,$ff80
 dc.w $0036,$ee7d,$c7b7,$f7fe,$ff80
 dc.w $0015,$5555,$5555,$5555,$5500
 dc.w $0039,$effd,$ffbf,$f7fe,$ff80
 dc.w $0e39,$f8ff,$ffe0,$0000,$0000
 dc.w $003f,$effd,$ffaf,$ffff,$ff80
 dc.w $0005,$5555,$554f,$ffff,$ff80
 dc.w $003f,$effd,$ffae,$ffff,$ff80
 dc.w $0e3f,$f85f,$ffee,$ffff,$ff80
 dc.w $003f,$ea1d,$f0ae,$ffff,$ff80
 dc.w $0015,$5555,$554e,$f8ff,$ff80
 dc.w $003f,$effd,$ffae,$f8ff,$ff80
 dc.w $0e3d,$7fff,$ffec,$0000,$0080
 dc.w $003d,$6ffd,$ffae,$fffc,$7f80
 dc.w $0015,$5555,$554e,$fffc,$7f80
 dc.w $003f,$effd,$ffae,$fffc,$7f80
 dc.w $0e3f,$ffff,$ffef,$ffff,$ff80
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $0000,$0000,$0000,$0000,$0000
 dc.w $0000,$0000,$0000,$0000,$0000

 END

