Hi guys! I come from the Qt world and i am porting an application to
Android. I am bit confused, i am banging my head for a few days now on
something that must be so trivial that i cannot find why it's not working.
Some background: i have a C++ engine which i use trough NDK and JNI. This
engine creates some bitmaps and passes them to the Java side, the Java side
must display them on a View and let the user interact with them (drag and
such).
The engine works properly, because i use it under Qt with full success.
This is the workflow:
1- Java loads a big Bitmap from a custom data file (the C++ engine expects
it to be in ARGB format, but it's compressed JPG data)
Bitmap.Config fmt = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0,
size).copy( fmt , false);
2- initialize the C++ engine passing the bitmap. The C++ engine "breaks"
the bitmap in smaller tiles. For tile it builds a rather complex alpha mask
and stores it into the first byte of the bitmap (the "a" byte). This alpha
mask only uses two values: 0xFF for opaque and 0x00 for transparent.
init_C_engine( this.fullImage );
3- The Java side then allocates all the tiles bitmaps, i do in two steps
because before init i dont know which size will the tiles be. The engine
will populate the tile_width and tile_height arrays:
Bitmap.Config fmt = Bitmap.Config.ARGB_8888;
for (int t = 0; t < this.puzzle_size; t++ ){
tile_data[ t ] = Bitmap.createBitmap( tile_width[t],
tile_height[t],
fmt);
4- Last step,inside the C++ engine, all the tiles bitmaps are filled:
for ( int n = 0; n < nBitmaps; n++ )
{
jobject bitmap = env->GetObjectArrayElement( bitmaps, n );
AndroidBitmap_getInfo(env, bitmap, &info);
AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void
**>(&pixels));
game->getTileBitmap( n, (unsigned char*)pixels );
AndroidBitmap_unlockPixels(env, bitmap);
env->SetObjectArrayElement( bitmaps, n, bitmap );
}
}
Now, in my custom View:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
for ( int t = 0; t < board.nTiles; t++ ){
canvas.drawBitmap( tile_data[tile],
tile_x[tile],
tile_y[tile], paint);
}
}
What i expect is that on my View i see my tiles with transparent areas.
what i get instead is a weird behaviour so that on the black background i
see the ENTIRE tile like the alpha bytes are all set to opaque, but when i
move the tiles one of top of the other, the "transparent" areas get
combined in some strange way, like colors are "xor"ed or multiplied in some
way! When i move one tile on the other i can see the areas where the alpha
bytes are set to transparent but colors gets mangled instead of being
transparend!
Basically i expect that pixels having alpha set to 0 are drawn as
transparent... i looked on internet but i could not find anything usefull
to help me out....
Does somebody have ideas? Anything will be appreciated!
thanks.
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en