Nicolai wrote
>>>

You can draw a new form with copybits and use your own color mapping.

First, I thought there would be a bitblt operation that you could use
without explicit calculating the color mapping, a paint operation that
would convert a gray-value to an alpha value. But I could find it.

In this special case (black text on white background) you can use an
existing method for calculating this color map. This method is used by
strike font to create apropriate glyph forms from its font bitmap. (A large
bitmap with black characters on a white background.)

Here is an example that first, creates a form with black text on white
background, and than computes the color map and copys the source form in a
new form:

"create a test form "
sourceForm := Form extent: 300@150 depth: 32.
sourceForm fillColor: Color white.

"draw some black, bold text"
text := 'Hello World' asText.
text addAttribute: (TextFontReference toFont: (LogicalFont familyName:
'Source Sans Pro' pointSize: 32)).
text addAttribute: (TextColor color: Color black).
text addAttribute: (TextEmphasis bold).
text asMorph drawOn: sourceForm getCanvas.

"create a morph for displaying this form"
sourceImageMorph := ImageMorph withForm: sourceForm.
sourceImageMorph openInWorld; topLeft: 300@300.

"calculate the colormap"
colorMap := Color computeColorConvertingMap: Color black from: 32 to: 32
keepSubPixelAA: false.

"copy the source form bits to a new form of the same size"
newForm := sourceForm deepCopy copyBits: sourceForm boundingBox from:
sourceForm at: 0@0 colorMap: (colorMap).

"create a morph for displaying this form"
newImageMorph := ImageMorph withForm: newForm.
newImageMorph openInWorld; topLeft: 300@500.

<<<

Thanks Nicolai
That is very helpful. However, I agree with you that this is probably
something BitBlt should be able to handle. I have been looking at how they
do this in mathematica, and they have some interesting approaches.

Cheers
Andy

Reply via email to