Hello.
My application works extensively with png images. So Image based PNGReadWriter speed not enough for me.
I have C library dll which has function "byte* readPNG(filename)". It returns buffer (pointer address) with same structure as Form Bitmap has.
I use FFI to call this function. And I have very naive converter of returned buffer to Form:
buffer := self primReadImageBytesFrom: imagePath.
buffer getHandle asInteger == 0 ifTrue: [self error: 'bad image: ', imagePath ].��
���
form := Form extent: width @ height depth: 32.
���
x:= 0. y:=0.
[y <=� height ] whileTrue: [
x :=0.
[x <= width] whileTrue: [
��� offset� := x * 4 + (y * width * 4) + 1 + 8.
��� value := buffer getHandle integerAt: offset size: 4 signed: false. ���
��� form pixelValueAt: x@y put: value.
��� x := x + 1.
].
y := y + 1.
].
^form
It's work and it is improve that buffer format similar to Form bits format. But such algorithm very slow.
So my question is: How efficiently convert external byte array from FFI call to internal ByteArray (Bitmap, Form).
I know about BitBlt class and
��� blt := (BitBlt current
��� ��� ��� ��� toForm: f)
��� ��� ��� ��� sourceForm: source.
��� blt combinationRule: Form over. "store"
��� blt sourceX: 0;
��� ��� �sourceY: 0;
��� ��� �height: height;
��� ��� �width: width.
��� blt destX: 0;
��� ��� �destY: 0.
��� blt copyBits.
And it works very fast. I try create source Form by
source := Form extent: width@height depth: 32.
source bits: buffer getHandle
But BitBlt raise error for such form. #copyBits primitive failed and method execution continue with attempt to unhibernate given forms.
Any ideas?