Reaching OS3.9 (yes, OS3.9) -compatible offscreen Rastport with private LayerInfo+1Layer to have offscreen clipping

Online Status

I've been coding raster routines under OS3.2 lately, and at some point in my life I figured out the "graphics.library draw call that asks for a struct RastPort *", would not clip , and so continue to draw anywhere in memory, a privately inited Rastport + bitmap inited with:

struct RastPort mytemprastport;
 InitRastport(&mytemprastport);
 mytemprastport.BitMap = thatbm;
 somedrawcall(&mytemprastport); // <- that , will clip no border., mytemprastport.Layer is NULL 

.... super usefull if you actually draw a rectangle with same size, and know that you don't need clipping anyway. Great. But clipping, need I. At some other poijnt of my tumulturous life I found this usefull piece of code (somewhere), that allows to have a complete Offscreen, unrelated to any screen or anything, and that does a legitimate clippable Layer+rastport to your bitmap:

void OffscreenBitMap_Init(OffscreenBitMap *ofsbm, 
		int pixelWidth, int pixelHeight , 
		int depth,
		int bmFlags,
		struct BitMap *friendBitmapForMode)
{
	
	if(!ofsbm) return;
    ofsbm->_layer = NULL;
    ofsbm->_layerinfo = NULL;
    ofsbm->_rp = NULL;
    ofsbm->_bm = NULL;
	// the way to create RastPort that actually clips drawing.
	if(friendBitmapForMode) depth = friendBitmapForMode->Depth;
	ofsbm->_bm = AllocBitMap(pixelWidth,pixelHeight,depth,bmFlags, friendBitmapForMode);
	if(!ofsbm->_bm) return;

	ofsbm->_layerinfo = NewLayerInfo();
	if(!ofsbm->_layerinfo) {  OffscreenBitMap_Close(ofsbm); return; }

	ofsbm->_layer = CreateUpfrontLayer(ofsbm->_layerinfo, ofsbm->_bm, 0, 0, pixelWidth - 1, pixelHeight - 1, 0, NULL);

	if(!ofsbm->_layer) {  OffscreenBitMap_Close(ofsbm); return; }
	ofsbm->_rp = ofsbm->_layer->rp;
	
}
void OffscreenBitMap_Close(OffscreenBitMap *ofsbm)
{
    if(ofsbm->_layer) DeleteLayer (0,ofsbm->_layer);
    ofsbm->_layer = NULL;
    if(ofsbm->_layerinfo) DisposeLayerInfo(ofsbm->_layerinfo);
    ofsbm->_layerinfo = NULL;
    ofsbm->_rp = NULL;
    if(ofsbm->_bm) FreeBitMap(ofsbm->_bm);
    ofsbm->_bm = NULL;	
}

... works great no OS3.2, problem is, on OS3.9 , as soon you use NewLayerInfo() and CreateUpfrontLayer(), it ends up trashing the whole intuition at some point. No idea why, I 've heard layers.library has a long history, but well i'm "that close" to achieve OS3.9 compatibility. An idea to make that code "safe for OS3.9" ? Is there a more "soft way" to create a private clipable rastport ? Am I supposed to use LockLayerInfo()/Unlock() ? Any tips ?

Online Status

Ok , about this... someone from the AROS team explained me and now, I have better code to have offscreen clipped rastports, more OS3.9 compatible than what's up there, and here it is: ... I now use CreateUpfrontHookLayer instead of CreateUpfrontLayer, and specify LAYERS_NOBACKFILL and a NULL hook. What would happen with previous version is that when layer is closed * the layer.library will redraw on the bitmap to "repair" behind the layer* ... This will not happen with this. Closing code remain the same.

BOOL uted_pool_create_layer(UTEDBitMapPool *pool,int w,int h , struct BitMap *bitmap)
{
    if(pool->layerInfo) return TRUE;

    pool->layerInfo = NewLayerInfo();
    if(!pool->layerInfo) return FALSE;

    InstallLayerInfoHook(pool->layerInfo,LAYERS_NOBACKFILL);

    pool->layer = CreateUpfrontHookLayer(pool->layerInfo,bitmap,0,0,
                w - 1, h - 1, LAYERSIMPLE,LAYERS_NOBACKFILL,NULL);

    if (!pool->layer) {uted_pool_free_layer(pool);  uted_pool_free_bitmapcache(pool);  return FALSE; }

    pool->rp = pool->layer->rp;

    return TRUE;
}

Also, at some point I was very wrong doing these:

  1. I was doing FreeBitmap() before closing the layer (I had no idea closing the layer would draw on the attached bitmap)... fatal. So of course free the layers then the bitmap.
  2. Actually all calls to FreeBitmap() need a WaitBlit() before them... because blits can be delayed, maybe the blitter is still drawing on that thing you're closing.

And well, my code using offscreen rastport is way more stable now, that's very clear. I still have a OS3.9 intuition compatibility issue, but it happens when I use InstallClipRegion() under a GM_RENDER.