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 android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to