Hi, all:
How can I make IDirectFBSurface::blit supporting a transparent background? I
have tried a lot of methods, but it doesn't work.
Here is my problem.
1> draw something to the primary_surface
2> create a tempory_surface with transparent background and draw something
to it
3> blit the content of temporary_surface to the pramary_surface, but this
operation should not erase what primary_surface already have
Here is my code, it doesn't work, I don't know why. The blue rectangle draw
on the primary_surface will be erased after the blit operation.
Thanks a lot!
#include <iostream>
#include <directfb.h>
*using* *namespace* std;
*int* main(*int* argc, *char* *argv[])
{
IDirectFB *dfb;
// Initialize DirectFB
DirectFBInit(&argc, &argv);
DirectFBCreate(&dfb);
dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);
// Create primary surface
IDirectFBSurface *primary_surface;
DFBSurfaceDescription primary_surface_description;
primary_surface_description.flags =
DFBSurfaceDescriptionFlags(DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT
| DSDESC_PIXELFORMAT);
primary_surface_description.caps =
DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
primary_surface_description.pixelformat = DSPF_ARGB;
primary_surface_description.width = 1280;
primary_surface_description.height = 800;
dfb->CreateSurface(dfb, &primary_surface_description, &primary_surface);
// Draw a big blue square
primary_surface->SetColor(primary_surface, 0x00, 0x00, 0xff, 0xff);
primary_surface->FillRectangle(primary_surface, 50, 50, 600, 600);
primary_surface->Flip(primary_surface, NULL, DFBSurfaceFlipFlags(0));
// Sleep 1 seconds to observe the result
sleep(1);
// Create temporary surface
IDirectFBSurface *temporary_surface;
DFBSurfaceDescription temporary_surface_description;
temporary_surface_description.flags =
DFBSurfaceDescriptionFlags(DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT
| DSDESC_PIXELFORMAT);
temporary_surface_description.caps =
DFBSurfaceCapabilities(DSCAPS_FLIPPING); // Not primary
temporary_surface_description.pixelformat = DSPF_ARGB;
temporary_surface_description.width = 1280;
temporary_surface_description.height = 800;
dfb->CreateSurface(dfb, &temporary_surface_description, &temporary_surface);
// Clear the background with transparent black
temporary_surface->Clear(temporary_surface, 0, 0, 0, 0);
temporary_surface->SetColor(temporary_surface, 0, 0, 0, 0);
temporary_surface->FillRectangle(temporary_surface, 0, 0, 1280, 800);
// Draw a small red square
temporary_surface->SetColor(temporary_surface, 0xff, 0x00, 0x00, 0xff);
temporary_surface->FillRectangle(temporary_surface, 0, 0, 200, 200);
temporary_surface->Flip(temporary_surface, NULL, DFBSurfaceFlipFlags(0));
// Copy the content of the temporary surface to primary surface
DFBRectangle rect;
rect.x = 0;
rect.y = 0;
rect.w = 1280;
rect.h = 800;
temporary_surface->SetSrcBlendFunction(temporary_surface, DSBF_SRCALPHA);
primary_surface->SetDstBlendFunction(primary_surface, DSBF_DESTALPHA);
primary_surface->Blit(primary_surface, temporary_surface, &rect, 0, 0);
primary_surface->Flip(primary_surface, NULL, DFBSurfaceFlipFlags(0));
// Sleep 3 seconds to observe the result
// Note that the original blue square is not destroyed
sleep(3);
temporary_surface->Release(temporary_surface);
primary_surface->Release(primary_surface);
dfb->Release(dfb);
*return* 0;
}
--
Kelvin Chen
_______________________________________________
directfb-users mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users