Hi,

For the lurker coming here for Awesomium, use the following code. The key is to 
use the unpack alignment settings.

Very non optimized and copied from 
https://github.com/assertfail/bezel-webkit/blob/master/Source/wkSurface.cpp

Code:
void nr::awe::Drawer::operator() (const osg::Camera& cam) const {

        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);

        if (paints.size()<1)
                return;

        //if ( ! gGc->getState() )
                //return;

        auto cid = gGc->getState()->getContextID();

        if ( NULL == awe::texture->getTextureObject( cid ) )
                return;

        auto obj = awe::texture->getTextureObject( cid );
        obj->bind();

        int bpp = 4;
        int stride = nr::width * 4;

        for ( auto p : paints )
        {
                glPixelStorei(GL_UNPACK_ROW_LENGTH, stride/bpp); 
                glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, p.dest_rect.height);
    
                glPixelStorei(GL_UNPACK_SKIP_PIXELS,  p.dest_rect.x);
                glPixelStorei(GL_UNPACK_SKIP_ROWS,    p.dest_rect.y);

                glTexSubImage2D(
                        GL_TEXTURE_2D,
                        0,
                        p.dest_rect.x,
                        p.dest_rect.y,
                        p.dest_rect.width,
                        p.dest_rect.height,
                        GL_BGRA,
                        GL_UNSIGNED_BYTE,
                        p.src_buffer);

                //unsigned char* a = &p.src_buffer[0];

                //glTexSubImage2D(GL_TEXTURE_2D, 0, p.dest_rect.x, 
p.dest_rect.y, p.dest_rect.width, p.dest_rect.height, GL_BGRA_EXT, 
GL_UNSIGNED_BYTE, a);

                glPixelStorei(GL_UNPACK_ROW_LENGTH,   0);
                glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
                glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
                glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);

                delete p.src_buffer;
        }

        paints.clear();

}

void nr::awe::Zurface::Paint(unsigned char* buffer, int ss, const 
Awesomium::Rect& sr, const Awesomium::Rect& dr) {

        int row;
        int bpp = 4;
        int stride = nr::width * 4;

        unsigned char* store = (unsigned char*) malloc(nr::height * stride);

    memset(store, 0, height * stride);

        // copy the region to our store
    for (row = 0 ; row < dr.height ; ++row)
        memcpy(store+(row+dr.y)*stride+(dr.x*bpp),
               buffer+(row+sr.y)*ss+(sr.x*4),
               dr.width*bpp);

        //memcpy(copy, src_buffer, src_row_span * src_rect.height);

        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);

        paints.push_back( {store, ss, sr, dr} );

};



Thank you!

Cheers,
Johny

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=70405#70405





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to