''
'' $Id: EmBClass.bas,v 1.2 1994/03/16 12:12:10 alex Rel $
''
'' Implementation of a BOOPSI private image class
''
'' Derived from Commodore-Amiga example (c) Copyright 1992 Commodore-Amiga, Inc.
''

CONST LINEWIDTH = 1	' not variable, not fancy

' fill region centered in a box
SUB interiorBox(BYVAL rp&, BYVAL l, BYVAL t, BYVAL w, BYVAL h, _
  BYVAL xw, BYVAL yw, BYVAL pen)
	IF w > (xw << 1) AND h > (yw << 1) THEN
		POKEB rp& + RastPortMask, NOT 0
		BNDRYOFF rp&
		SetAfPt rp&, NULL&, 0
		SetDrMd rp&, JAM2&
		SetAPen rp&, pen
		RectFill rp&, l + xw, t + yw, l + w - 1 - xw, t + h - 1 - yw
	END IF
END SUB

SUB embossedBoxTrim(BYVAL rp&, BYVAL l, BYVAL t, BYVAL w, BYVAL h, _
  BYVAL hthick, BYVAL vthick, BYVAL ulpen, BYVAL lrpen)
	LOCAL bottom, right

	bottom = t + h - 1
	right = l + w - 1

	' upper right edges
	SetAPen rp&, ulpen

	Move rp&, l, bottom - 1
	Draw rp&, l, t
	Draw rp&, right - 1, t

	' lower right edges
	SetAPen rp&, lrpen

	Move rp&, right, t + 1
	Draw rp&, right, bottom
	Draw rp&, l + 1, bottom
END SUB

FUNCTION drawEmB&(BYVAL cl&, BYVAL o&, BYVAL msg&)
	LOCAL pens&, state&
	LOCAL l, t, w, h
	LOCAL ulpen, lrpen, fillpen

	' let's be sure that we were passed a DrawInfo
	IF PEEKL(msg& + impDrawimp_DrInfo) THEN
		pens& = PEEKL(PEEKL(msg& + impDrawimp_DrInfo) + dri_Pens)
	ELSE
		pens& = NULL&
	END IF
	
	l = PEEKW(o& + ImageLeftEdge) + PEEKW(msg& + impDrawimp_Offset)
	t = PEEKW(o& + ImageTopEdge) + PEEKW(msg& + impDrawimp_Offset + 2)
	w = PEEKW(o& + ImageWidth)
	h = PEEKW(o& + ImageHeight)

	state& = PEEKL(msg& + imp_State)
	SELECT CASE state&
		CASE IDS_SELECTED&, IDS_INACTIVESELECTED&
			IF pens& <> NULL& THEN
				ulpen = PEEKW(pens& + SHADOWPEN& * 2)
				lrpen = PEEKW(pens& + SHINEPEN& * 2)
				fillpen = PEEKW(pens& + FILLPEN& * 2)
			ELSE
				ulpen = 2
				lrpen = 1
				fillpen = 3
			END IF
		
		CASE REMAINDER
			IF pens& <> NULL& THEN
				ulpen = PEEKW(pens& + SHINEPEN& * 2)
				lrpen = PEEKW(pens& + SHADOWPEN& * 2)
				fillpen = PEEKW(pens& + BACKGROUNDPEN& * 2)
			ELSE
				ulpen = 2
				lrpen = 1
				fillpen = 3
			END IF
	END SELECT

	embossedBoxTrim PEEKL(msg& + impDrawimp_RPort), l, t, w, h, _
	  LINEWIDTH, LINEWIDTH, ulpen, lrpen

	interiorBox PEEKL(msg& + impDrawimp_RPort), l, t, w, h, _
	  LINEWIDTH, LINEWIDTH, fillpen
	drawEmB& = TRUE&
END FUNCTION

'
' Class Despatcher
'
FUNCTION despatchEmBClass&(BYVAL cl&, BYVAL o&, BYVAL msg&)
	LOCAL methodID&
	
	methodID& = PEEKL(msg& + MsgMethodID)
	SELECT CASE methodID&
		CASE IM_DRAW&	' draw with state
			despatchEmBClass& = drawEmB&(cl&, o&, msg&)
		
		CASE REMAINDER
			'use superclass defaults for everything else

			despatchEmBClass& = DoSuperMethodA&(cl&, o&, msg&)
	END SELECT
END FUNCTION

'
' Private class initialization
'
FUNCTION initEmBClass&
	STATIC cl&

	cl& = MakeClass&(NULL&, SADD("imageclass" + CHR$(0)), NULL&, 0, 0)
	IF cl& <> NULL& THEN InitHook cl& + cl_Dispatcher, VARPTRS(despatchEmBClass&)
	initEmBClass& = cl&
END FUNCTION

'
' Private class termination
'
FUNCTION freeEmBClass&(BYVAL cl&)
	freeEmBClass& = FreeClass&(cl&)
END FUNCTION
