bwk@mitre-bedford.ARPA (Barry W. Kort) (10/06/88)
At OOPSLA '88, Sam Adams, Nanette Harter, and I discussed the
problem of drawing bi-colored forms using the ColorDevice class.
The following hack transforms an ordinary form into one that will
display a foreground color over a background color. This method
seems horribly inefficient. Perhaps someone can offer a better way.
------------Rape and Paste---------------------
'From Smalltalk-80, Version 2.3 of 13 June 1988
on 5 October 1988 at 8:14:31 am'!
!Form methodsFor: 'color forms'!
foreColor: fcolor backColor: bcolor
"Return a new form which can be displayed in color using ColorDevice.
This version works only for forms of width 8, 16, and multiples of 16."
| cform cindex sno cbits cno |
cform _ self class new width: self width * 8 height: self height.
cbits _ cform bits. cindex _ 0.
1 to: bits size do: [ :sindex | sno _ bits at: sindex.
14 to: width \\ 16 by: -2 do: [ :bindex |
cindex _ cindex + 1.
cno _ sno bitShift: 0 - bindex.
cno _ cno bitAnd: 3.
cno = 0 ifTrue: [ cbits at: cindex put: bcolor * 256 + bcolor].
cno = 1 ifTrue: [ cbits at: cindex put: bcolor * 256 + fcolor].
cno = 2 ifTrue: [ cbits at: cindex put: fcolor * 256 + bcolor].
cno = 3 ifTrue: [ cbits at: cindex put: fcolor * 256 + fcolor]]].
^ cform! !
-------------------------------------------
--Barry Kort