Missing transparency in ImageSurface

Kees Kling <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Hi,

I have an in memory dataset which I want to overlay over a background

Here is the part I'm doing the overlay

Cairo::RefPtr<Cairo::Surface> radarModule::composeProduct() {
     Cairo::RefPtr<Cairo::ImageSurface> sfc = 
Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 800, 800);
     Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(sfc);
     cr->set_source(background->getLayers(),0,0);
     cr->paint();
     if (dataset != NULL) {
         cr->save();
         cr->set_operator(Cairo::OPERATOR_ATOP);
         cr->set_source(radarSfc,0,0);
         cr->paint();
         cr->restore();
     }
     return sfc;
}

And here is the part where I create a surface from a unsigned char buffer
void radarModule::drawImage() {
     // storing GdalDataset in an buffer;
     // this will be a one byte per pixel data
     int bufferSize =  dataset->GetRasterXSize() * 
dataset->GetRasterYSize();
     unsigned char* buffer = (unsigned char*) CPLMalloc(sizeof(char) * 
bufferSize);
     // convert this data with colortable to ARGB 4 bytes per pixel data
     unsigned char* colorbuffer = (unsigned char*) 
CPLMalloc(sizeof(char) * bufferSize * 4 );

     try {
         dataset->getPixelData(buffer);
     } catch ( string &e) {
         ctrl->getLogger()->errorStream()<<e;
     }
     // convert this buffer to the colorbuffer
     for ( int i = 0; i< bufferSize; i++) {
         // lookup color
         unsigned char a, r, g, b;
         ctable->getColor(buffer[i]).getColor(r,g,b,a);
         colorbuffer[ i * 4 ] = b;//b
         colorbuffer[ (i * 4) + 1 ]  = g;//g
         colorbuffer[ (i * 4) + 2 ]  = r;//r
         colorbuffer[ (i * 4) + 3 ]  = a;//a
     }
     int stride = 
Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32,dataset->GetRasterXSize());
     // Here creating the image surface and draw the pixels on
     radarSfc = 
Cairo::ImageSurface::create(colorbuffer,Cairo::FORMAT_ARGB32,
             dataset->GetRasterXSize(), dataset->GetRasterYSize(), stride);

     CPLFree(buffer);
     //CPLFree(colorbuffer);

     //radarSfc = Cairo::ImageSurface::create_from_png("r.png");
     radarSfc->write_to_png("r.png");
}

before I construct the image I'm adding a colortable, bcause the dataset 
is an index array
If I run this code al parts which are fully transparent turns out white, 
but in the l;ast line I save the surface as
png.file and that image is correct according to gimp.

I also tried to create the surface of the png file from disk and then 
the alpha blending is ok.

What am I doing wrong??

regards
Kees Kling
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.