Hello,

I'm making a slideshow and would like to make use of a window to 
output an title on top of the image. (on a 50% transparent background)

I'm somewhat new to DirectFB and the problem I'm facing is,
the window I've drawn on top of my primary layer has its own black
background.

How would I make this black background transparent?

Just to make the situation a little clearer, I'm not having any problems
drawing transparent objects onto the window surface. My problem is that,
there is a black background of my window object that I cant seem to get
transparent.

Any help would be appreciated

Daniel

(I've attached the source code)


#include <directfb.h>
#include <direct/util.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

/* macro for a safe call to DirectFB functions */
#define DFBCHECK(x...)                                                 \
        {                                                                  \
                err = x;                                                       \
                if (err != DFB_OK) {                                           \
                        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ );  
   \
                        DirectFBErrorFatal( #x, err );                          
   \
                }                                                              \
        }

static IDirectFB                                *dfb;
static IDirectFBSurface                 *primary;
static IDirectFBSurface                 *background;
static IDirectFBImageProvider   *provider;
static IDirectFBFont                    *font;
static IDirectFBWindow                  *window;
static IDirectFBSurface                 *window_surface;
static IDirectFBDisplayLayer    *layer;

static int xres;
static int yres;
static int fontheight;

char *inputFile[] = {"img1.jpg","img2.jpg",NULL};
static void init_resources(int argc, char *argv[])
{
        DFBResult err;
        DFBSurfaceDescription dsc;

        DFBCHECK(DirectFBInit(&argc, &argv));
        DFBCHECK(DirectFBCreate(&dfb));

        dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer );

        layer->SetCooperativeLevel( layer, DLSCL_ADMINISTRATIVE );

//      layer->SetBackgroundColor( layer, 0, 130, 0, 0 );
//      layer->SetOpacity(layer, 122);
        layer->GetSurface(layer, &primary);

        primary->SetDrawingFlags(primary, DSDRAW_BLEND);

        DFBCHECK(primary->GetSize(primary, &xres, &yres));

        // load font
        {
                DFBFontDescription desc;

                desc.flags = DFDESC_HEIGHT;
                desc.height = 24;

                DFBCHECK(dfb->CreateFont(dfb, FONT, &desc, &font));
                DFBCHECK(font->GetHeight(font, &fontheight));
                DFBCHECK(primary->SetFont(primary, font));
        }

        // create offscreen buffer
        dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT;
        dsc.width = xres;
        dsc.height = yres;
        DFBCHECK(dfb->CreateSurface(dfb, &dsc, &background));

        // create window
        DFBWindowDescription desc;

        desc.flags  = ( DWDESC_POSX | DWDESC_POSY |     DWDESC_WIDTH |
DWDESC_HEIGHT | DWDESC_CAPS );
        desc.posx   = 100;
        desc.posy   = 100;
        desc.width  = 250;
        desc.height = 250;
        desc.caps   = DWCAPS_ALPHACHANNEL;

        layer->CreateWindow(layer, &desc, &window);
        window->GetSurface(window, &window_surface);
//      window->SetOpacity(window, 122);
}

static void deinit_resources()
{
        background->Release(background);
        primary->Release(primary);
        font->Release(font);
        dfb->Release(dfb);
}

static void onscreen_text(char* img_path, int x, int y, int w, int h)
{
        char buf[128];

        primary->SetColor(primary, 125, 0, 0, 0xa0);
        primary->FillRectangle(primary, x, y, w, fontheight+5);
        sprintf(buf, "Now displaying: %s", img_path);

        primary->SetColor(primary, 255, 255, 255, 0xFF);
        primary->DrawString(primary, buf, -1, 10, 0, DSTF_LEFT | DSTF_TOP);
}

int main(int argc, char *argv[])
{
        int i,j;
        char img_path[128];

        if (argc != 2)
        {
                printf("usage: %s <steps>\n", argv[0]);
                return -1;
        }

        init_resources(argc, argv);

        int total_boxes = atoi(argv[1]);
        int one_row = sqrt(total_boxes);

        DFBRectangle imgArea;
        imgArea.x = 0;
        imgArea.y = 0;
        imgArea.w = 800 / one_row;
        imgArea.h = 600 / one_row;

        int position_x;
        int position_y;

        // main loop
        while (1) {
                for(j=0; NULL != inputFile[j]; j++) {

                        sprintf(img_path, "./%s", inputFile[j]);        // set 
filename as title

                        dfb->CreateImageProvider(dfb, img_path, &provider);
                        provider->RenderTo(provider, background, NULL);
                        provider->Release(provider);

                        for (i=0; i<total_boxes; ++i)
                        {
                                position_x = i % one_row;
                                position_y = (i-position_x) / one_row;

                                if (position_x != 0)
                                        position_x *= imgArea.w;

                                if (position_y != 0)
                                        position_y *= imgArea.h;

                                imgArea.x = position_x;
                                imgArea.y = position_y;

                                primary->Blit(primary, background, &imgArea, 
position_x,
position_y);

                                if (i < one_row) // only update title and bg 
when needed
                                        onscreen_text(img_path, position_x, 
position_y, imgArea.w,
imgArea.h);

                                primary->Flip(primary, NULL, 
DSFLIP_WAITFORSYNC);

                                window->SetOpacity(window, 128);
                                window_surface->SetColor( window_surface, 255, 
0, 0, 128);
                                window_surface->FillRectangle( window_surface, 
0, 0, 100, 100 );
                                window_surface->Flip (window_surface, NULL, 0); 

                                sleep(1);
                        }

                        sleep(1);
                }
        }

        deinit_resources();
        return 1;
}



_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to