Form manipulation from a Plugin
diegogomezdeck at consultar.com
diegogomezdeck at consultar.com
Mon Apr 7 14:36:23 UTC 2003
Andreas,
Thank you very much for you answer, it help me a lot! I just included all
these sanity checks to my code.
But I still don't find the way to get the alpha part of pixel. With this
code:
alpha := (pixel bitAnd: 16rFF000000) >> 24.
alpha is always 0. Is It the way to get the alpha part for pixels in 32
bits Forms?
The other 3 bytes hold the RGB triplet and I can access them without
problems.
TIA,
Diego
> Diego,
>
> There are actually various problems in the code you're quoting. A safe
> way to deal with this is along the following lines:
>
> | formOop bitsOop bitsPtr |
> self var: #bitsPtr type: 'unsigned int*'.
>
> "... grab other stuff before..."
> bitsOop := interpreterProxy fetchPointer: 0 ofObject: formOop.
>
> "first test if bitsOop is really what we're expecting"
> ((interpreterProxy isInteger: bitsOop) or:[
> (interpreterProxy isWords: bitsOop) not])
> ifTrue:[^interpreterProxy primitiveFail].
>
> [note: those tests above *MUST* be done as it is quite possible that
> forms contain either integers (surface references) or byte arrays
> (hibernated). Not testing for this will hose your system].
>
> "now test if the length of the bitmap is right"
> (interpreterProxy slotSizeOf: bitsOop) = expectedSize
> ifFalse:[^interpreterProxy primitiveFail]
>
> [again, this test is needed if for some reason the format of the form
> has been screwed up. the expectedSize here is whatever the number of
> words for a form of that size/depth is expected to be; e.g., for a
> 32bpp form just width*height]
>
> "now grab the pointer to the bits"
> bitsPtr := interpreterProxy firstIndexableField: bitsOop.
>
> [At this point you have a C 'unsigned int *' pointer to those bits. If
> you wanted to work on a byte pointer instead you could just change the
> declaration to be 'unsigned char *' but watch the indexing!]
>
> 0 to: expectedSize-1 do:[:i| "for all words..."
> pixel := bitsPtr at: i.
> ... etc ...
>
> You should be pretty safe doing it the above way as it will ensure all
> of the invariants are checked.
>
> Cheers,
> - Andreas
>
>> -----Original Message-----
>> From: squeak-dev-bounces at lists.squeakfoundation.org
>> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On
>> Behalf Of diegogomezdeck at consultar.com
>> Sent: Monday, April 07, 2003 3:58 PM
>> To: squeak-dev at lists.squeakfoundation.org
>> Subject: Form manipulation from a Plugin
>>
>>
>> Hi list...
>>
>> I'm processing a 32 bits Form in a slang-plugin.
>>
>> The method receive the Form as a parameter:
>>
>> formOop := interpreterProxy stackObjectValue: 1.
>>
>> Then I ask for widht, height and a pointer to bits:
>>
>> bits := interpreterProxy fetchPointer: 0 ofObject: formOop.
>> width := self fetchIntOrFloat: 1 ofObject: formOop.
>> height := self fetchIntOrFloat: 2 ofObject: formOop.
>>
>> Then I iterate over the bits:
>>
>> bits
>> to: bits + (height - 1 * (width * 4))
>> by: 4
>> do: [:pos |
>> pixel := interpreterProxy longAt: pos.
>> alpha := (pixel bitAnd: 16rFF000000) >> 24.
>> <some other stuff>
>> ].
>>
>> The problem I have is the following: The alpha part of pixel
>> is always 0.
>> (I don't need to say that the form has not transparent colors)
>>
>> Any idea of my problem?
>>
>>
>> TIA,
>>
>> Diego Gomez Deck
>>
>>
>>
>>
>>
More information about the Squeak-dev
mailing list
|