REQ_DLL_VER      =  1
DLL_ENTRY        =  1

HS_HORIZONTAL    =  0
HS_VERTICAL      =  1
HS_FDIAGONAL     =  2
HS_BDIAGONAL     =  3
HS_CROSS         =  4
HS_DIAGCROSS     =  5

SCR_PIXMAP       = -1

PX_MEM_SYSTEM    =  0
PX_MEM_LOCAL     =  1
PX_MEM_GART      =  2

PX_MEM_MASK      =  3

ARGB32           = ((32 shl 24) or (2 shl 16) or 0x8888)

macro CreateHatch hatch, bkcolor, fcolor
{
           pushd fcolor
           pushd bkcolor
           pushd hatch
           call [imp_CreateHatch]
           add esp, 3*4
}

macro DestroyBrush brush
{
           pushd brush
           call [imp_DestroyBrush]
           add esp, 4
}

macro CreatePixmap width, height, format, flags
{
           pushd flags
           pushd format
           pushd height
           pushd width
           call [imp_CreatePixmap]
           add esp, 4*4
}

macro DestroyPixmap pixmap
{
          pushd pixmap
          call [imp_DestroyPixmap]
          add esp, 4
};

macro LockPixmap pixmap
{
           pushd pixmap
           call [imp_LockPixmap]
           add esp, 4
}

macro UnlockPixmap pixmap
{
           pushd pixmap
           call [imp_UnlockPixmap]
           add esp, 4
}

macro ClearPixmap pixmap, color
{
           pushd color
           pushd pixmap
           call [imp_ClearPixmap]
           add esp, 2*4
}

macro Line pixmap, x0,y0,x1,y1,color
{
           pushd color
           pushd y1
           pushd x1
           pushd y0
           pushd x0
           pushd pixmap
           call [imp_Line]
           add esp, 6*4
};

macro DrawRect pixmap,x,y,w,h,color,border
{
           pushd border
           pushd color
           pushd h
           pushd w
           pushd y
           pushd x
           pushd pixmap
           call [imp_DrawRect]
           add esp, 7*4
}

macro FillRect pixmap,x,y,w,h,brush,border
{
           pushd border
           pushd brush
           pushd h
           pushd w
           pushd y
           pushd x
           pushd pixmap
           call [imp_FillRect]
           add esp, 7*4
}

macro Blit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h
{
           pushd h
           pushd w
           pushd srcy
           pushd srcx
           pushd srcpix
           pushd dsty
           pushd dstx
           pushd dstpix
           call [imp_Blit]
           add esp, 8*4
}

macro BlitAlpha dstpix, dstx, dsty, srcpix, srcx, srcy, w, h, alpha
{
           pushd alpha
           pushd h
           pushd w
           pushd srcy
           pushd srcx
           pushd srcpix
           pushd dsty
           pushd dstx
           pushd dstpix
           call [imp_BlitAlpha]
           add esp, 9*4
}

macro TransparentBlit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h, key
{
           pushd key
           pushd h
           pushd w
           pushd srcy
           pushd srcx
           pushd srcpix
           pushd dsty
           pushd dstx
           pushd dstpix
           call [imp_TransparentBlit]
           add esp, 9*4
}


macro fix_cwd  path
{
          pushd path

          push '/'
          push path
          call _strrchr

          mov byte [eax], 0

          mov eax, 30
          mov ebx, 1
          mov ecx, [esp+8]
          int 0x40

          add esp, 12
}

szPxlib              db  '/rd/1/lib/pixlib.obj',0

szStart              db  'START',0
szVersion            db  'version',0

szCreatePixmap       db  'CreatePixmap',0
szDestroyPixmap      db  'DestroyPixmap',0
szLockPixmap         db  'LockPixmap',0
szUnlockPixmap       db  'UnlockPixmap',0
szGetPixmapPitch     db  'GetPixmapPitch',0

szCreateHatch        db  'CreateHatch',0
szCreateMonoBrush    db  'CreateMonoBrush',0
szDestroyBrush       db  'DestroyBrush',0

szClearPixmap        db  'ClearPixmap',0
szLine               db  'Line',0
szDrawRect           db  'DrawRect',0
szFillRect           db  'FillRect',0
szBlit               db  'Blit',0
szTransparentBlit    db  'TransparentBlit',0
szBlitAlpha          db  'BlitAlpha',0

align 4

px_import:

imp_start            dd  szStart
imp_ver              dd  szVersion

imp_CreatePixmap     dd  szCreatePixmap
imp_DestroyPixmap    dd  szDestroyPixmap
imp_LockPixmap       dd  szLockPixmap
imp_UnlockPixmap     dd  szUnlockPixmap
imp_GetPixmapPitch   dd  szGetPixmapPitch

imp_CreateHatch      dd  szCreateHatch
imp_CreateMonoBrush  dd  szCreateMonoBrush
imp_DestroyBrush     dd  szDestroyBrush

imp_ClearPixmap      dd  szClearPixmap
imp_Line             dd  szLine
imp_DrawRect         dd  szDrawRect
imp_FillRect         dd  szFillRect
imp_Blit             dd  szBlit
imp_TransparentBlit  dd  szTransparentBlit
imp_BlitAlpha        dd  szBlitAlpha

                     dd  0


;szBlockClip          db  'BlockClip',0
;szLineClip           db  'LineClip',0
;imp_BlockClip        dd  szBlockClip
;imp_LineClip         dd  szLineClip


align 4

load_pxlib:
           mov  eax, 68
           mov  ebx, 19
           mov  ecx, szPxlib
           int  0x40
           test eax, eax
           jz   .fail

           mov  edx, eax
           mov  esi, px_import
.import_loop:
           lodsd
           test eax, eax
           jz   .import_done
           push edx
.import_find:
           mov ebx, [edx]
           test ebx, ebx
           jz .fail         ;import_not_found

           push eax
@@:
           mov cl, [eax]
           cmp cl, [ebx]
           jnz .import_find_next

           test cl, cl
           jz .import_found

           inc eax
           inc ebx
           jmp @b
.import_find_next:
           pop eax
           add edx, 8
           jmp .import_find
.import_found:
           pop eax
           mov eax, [edx+4]
           mov [esi-4], eax
           pop edx
           jmp .import_loop
.import_done:

           cmp word [imp_ver], REQ_DLL_VER
           jb .fail
           cmp word [imp_ver+2], REQ_DLL_VER
           ja .fail

           push DLL_ENTRY
           call [imp_start]
           test eax, eax
           jz .fail

           ret
.fail:
           xor eax, eax
           ret

align 4
_strrchr:
	push	ebp
	mov	ebp, esp
	push	edi
        mov     edi, [8+ebp]
        mov     ecx, -1
        xor     al, al
        cld
        repne
        scasb
        not     ecx
        dec     edi
        mov     al, [12+ebp]
        std
        repne
        scasb
        cld
        jne     .failure
        lea     eax, [edi+1]
        pop     edi
        pop     ebp
        ret
.failure:
        xor     eax, eax
        pop     edi
        pop     ebp
        ret