static DFBResult IDirectFBSurface_Layer_GetSubSurface( IDirectFBSurface *thiz, const DFBRectangle *rect, IDirectFBSurface **surface ) { DFBResult ret; DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Layer) D_DEBUG_AT( Surface, "%s( %p )\n", __FUNCTION__, thiz ); /* Check arguments */ if (!data->base.surface) return DFB_DESTROYED; if (!surface) return DFB_INVARG; /* Allocate interface */ DIRECT_ALLOCATE_INTERFACE( *surface, IDirectFBSurface ); if (rect || data->base.limit_set) { DFBRectangle wanted, granted; /* Compute wanted rectangle */ if (rect) { wanted = *rect; wanted.x += data->base.area.wanted.x; wanted.y += data->base.area.wanted.y; if (wanted.w <= 0 || wanted.h <= 0) { wanted.w = 0; wanted.h = 0; } } else { wanted = data->base.area.wanted; } /* Compute granted rectangle */ granted = wanted; dfb_rectangle_intersect( &granted, &data->base.area.granted ); /* Construct */ ret = IDirectFBSurface_Layer_Construct( *surface, thiz, &wanted, &granted, data->region, data->base.caps | DSCAPS_SUBSURFACE, data->base.core ); } else { /* Construct */ ret = IDirectFBSurface_Layer_Construct( *surface, thiz, NULL, NULL, data->region, data->base.caps | DSCAPS_SUBSURFACE, data->base.core ); } return ret; }
static DFBResult IDirectFBDisplayLayer_GetSurface( IDirectFBDisplayLayer *thiz, IDirectFBSurface **interface ) { DFBResult ret; CoreLayerRegion *region; IDirectFBSurface *surface; D_DEBUG_AT( Layer, "%s( %p )\n", __FUNCTION__, thiz ); DIRECT_INTERFACE_GET_DATA(IDirectFBDisplayLayer) if (!interface) return DFB_INVARG; if (data->level == DLSCL_SHARED) { D_WARN( "letting unprivileged IDirectFBDisplayLayer::GetSurface() " "call pass until cooperative level handling is finished" ); } ret = CoreLayerContext_GetPrimaryRegion( data->context, true, ®ion ); if (ret) return ret; DIRECT_ALLOCATE_INTERFACE( surface, IDirectFBSurface ); ret = IDirectFBSurface_Layer_Construct( surface, NULL, NULL, NULL, region, DSCAPS_NONE, data->core, data->idirectfb ); // Fix to only perform single buffered clearing using a background when // configured to do so AND the display layer region is frozen. Also // added support for this behavior when the cooperative level is // DLSCL_ADMINISTRATIVE. if (region->config.buffermode == DLBM_FRONTONLY && data->level != DLSCL_SHARED && D_FLAGS_IS_SET( region->state, CLRSF_FROZEN )) { // If a window stack is available, give it the opportunity to // render the background (optionally based on configuration) and // flip the display layer so it is visible. Otherwise, just // directly flip the display layer and make it visible. if (data->stack) { CoreWindowStack_RepaintAll( data->stack ); } else { CoreLayerRegion_FlipUpdate2( region, NULL, NULL, DSFLIP_NONE, -1 ); } } *interface = ret ? NULL : surface; dfb_layer_region_unref( region ); return ret; }