Ejemplo n.º 1
0
bool
davinciStretchBlit32( void *drv, void *dev, DFBRectangle *srect, DFBRectangle *drect )
{
     DavinciDriverData *ddrv = drv;
     DavinciDeviceData *ddev = dev;

     DFBRegion clip = DFB_REGION_INIT_FROM_RECTANGLE( drect );

     D_DEBUG_AT( Davinci_2D, "%s( %4d,%4d-%4dx%4d <- %4d,%4d-%4dx%4d )\n",
                 __FUNCTION__, DFB_RECTANGLE_VALS(drect), DFB_RECTANGLE_VALS(srect) );

     if (!dfb_region_region_intersect( &clip, &ddev->clip ))
          return true;

     dfb_region_translate( &clip, -drect->x, -drect->y );

     davinci_c64x_stretch_32__L( &ddrv->tasks,
                                 ddev->dst_phys + ddev->dst_pitch * drect->y + ddev->dst_bpp * drect->x,
                                 ddev->dst_pitch,
                                 ddev->src_phys + ddev->src_pitch * srect->y + ddev->src_bpp * srect->x,
                                 ddev->src_pitch,
                                 drect->w, drect->h,
                                 srect->w, srect->h,
                                 &clip );

     return true;
}
Ejemplo n.º 2
0
static DFBResult
primaryUpdateRegion( CoreLayer             *layer,
                     void                  *driver_data,
                     void                  *layer_data,
                     void                  *region_data,
                     CoreSurface           *surface,
                     const DFBRegion       *left_update,
                     CoreSurfaceBufferLock *left_lock,
                     const DFBRegion       *right_update,
                     CoreSurfaceBufferLock *right_lock )
{
     DFBX11       *x11    = driver_data;
     DFBX11Shared *shared = x11->shared;
     X11LayerData *lds    = layer_data;

     DFBRegion     region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     D_DEBUG_AT( X11_Layer, "%s()\n", __FUNCTION__ );

     if (left_update && !dfb_region_region_intersect( &region, left_update ))
          return DFB_OK;

     lds->shown = true;

     return DisplaySurface( x11, layer_data, shared->vdp_queue, left_lock );
}
static DFBResult
IDirectFBSurface_Layer_Flip( IDirectFBSurface    *thiz,
                             const DFBRegion     *region,
                             DFBSurfaceFlipFlags  flags )
{
     DFBRegion reg;

     DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Layer)

     D_DEBUG_AT( Surface, "%s( %p, %p, 0x%08x )\n", __FUNCTION__, thiz, region, flags );

     if (!data->base.surface)
          return DFB_DESTROYED;

     if (data->base.locked)
          return DFB_LOCKED;

     if (!data->base.area.current.w || !data->base.area.current.h ||
         (region && (region->x1 > region->x2 || region->y1 > region->y2)))
          return DFB_INVAREA;


     IDirectFBSurface_StopAll( &data->base );

     if (data->base.parent) {
          IDirectFBSurface_data *parent_data;

          DIRECT_INTERFACE_GET_DATA_FROM( data->base.parent, parent_data, IDirectFBSurface );

          if (parent_data) {
               /* Signal end of sequence of operations. */
               dfb_state_lock( &parent_data->state );
               dfb_state_stop_drawing( &parent_data->state );
               dfb_state_unlock( &parent_data->state );
          }
     }

     dfb_region_from_rectangle( &reg, &data->base.area.current );

     if (region) {
          DFBRegion clip = DFB_REGION_INIT_TRANSLATED( region,
                                                       data->base.area.wanted.x,
                                                       data->base.area.wanted.y );

          if (!dfb_region_region_intersect( &reg, &clip ))
               return DFB_INVAREA;
     }

     D_DEBUG_AT( Surface, "  -> FLIP %4d,%4d-%4dx%4d\n", DFB_RECTANGLE_VALS_FROM_REGION( &reg ) );

     return CoreLayerRegion_FlipUpdate( data->region, &reg, flags );
}
Ejemplo n.º 4
0
void
dfb_updates_add( DFBUpdates      *updates,
                 const DFBRegion *region )
{
     int i;

     D_MAGIC_ASSERT( updates, DFBUpdates );
     DFB_REGION_ASSERT( region );
     D_ASSERT( updates->regions != NULL );
     D_ASSERT( updates->num_regions >= 0 );
     D_ASSERT( updates->num_regions <= updates->max_regions );

     if (updates->num_regions == 0) {
          updates->regions[0]  = updates->bounding = *region;
          updates->num_regions = 1;

          return;
     }

     for (i=0; i<updates->num_regions; i++) {
          DFBRegion inter = updates->regions[i];

          if (dfb_region_region_intersect( &inter, region )) {
               DFBRegion uni = updates->regions[i];

               dfb_region_region_union( &uni, region );

               updates->regions[i] = uni;

               dfb_region_region_union( &updates->bounding, &uni );

               return;
          }
     }

     if (updates->num_regions == updates->max_regions) {
          dfb_region_region_union( &updates->bounding, region );

          updates->regions[0]  = updates->bounding;
          updates->num_regions = 1;
     }
     else {
          updates->regions[updates->num_regions++] = *region;

          dfb_region_region_union( &updates->bounding, region );
     }
}
Ejemplo n.º 5
0
static DFBResult
primaryUpdateRegion( CoreLayer             *layer,
                     void                  *driver_data,
                     void                  *layer_data,
                     void                  *region_data,
                     CoreSurface           *surface,
                     const DFBRegion       *update,
                     CoreSurfaceBufferLock *lock )
{
     DFBX11    *x11    = driver_data;
     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     if (update && !dfb_region_region_intersect( &region, update ))
          return DFB_OK;

     return dfb_x11_update_screen( x11, &region, lock );
}
Ejemplo n.º 6
0
static DFBResult
primaryUpdateRegion( CoreLayer             *layer,
                     void                  *driver_data,
                     void                  *layer_data,
                     void                  *region_data,
                     CoreSurface           *surface,
                     const DFBRegion       *update,
                     CoreSurfaceBufferLock *lock )
{
     DFBX11       *x11 = driver_data;
     X11LayerData *lds = layer_data;

     DFBRegion  region = DFB_REGION_INIT_FROM_DIMENSION( &surface->config.size );

     D_DEBUG_AT( X11_Layer, "%s()\n", __FUNCTION__ );

     if (x11->shared->x_error)
          return DFB_FAILURE;

     if (update && !dfb_region_region_intersect( &region, update ))
          return DFB_OK;

     return dfb_x11_update_screen( x11, lds, &region, lock );
}
Ejemplo n.º 7
0
void
dfb_clip_blit_flipped_rotated( const DFBRegion *clip,
                               DFBRectangle *srect, DFBRectangle *drect, DFBSurfaceBlittingFlags flags )
{

    DFBRegion dest    = DFB_REGION_INIT_FROM_RECTANGLE( drect );
    DFBRegion clipped = dest;

    D_ASSERT( !(flags & (DSBLIT_ROTATE270 | DSBLIT_ROTATE180)) );

    if (flags & DSBLIT_ROTATE90) {
        D_ASSERT( srect->w == drect->h );
        D_ASSERT( srect->h == drect->w );
    }
    else {
        D_ASSERT( srect->w == drect->w );
        D_ASSERT( srect->h == drect->h );
    }

    dfb_region_region_intersect( &clipped, clip );
    dfb_rectangle_from_region( drect, &clipped );

    switch (flags & (DSBLIT_FLIP_HORIZONTAL | DSBLIT_FLIP_VERTICAL | DSBLIT_ROTATE90)) {
    case DSBLIT_NOFX:
        srect->x += clipped.x1 - dest.x1;
        srect->y += clipped.y1 - dest.y1;
        break;
    case DSBLIT_FLIP_HORIZONTAL:
        srect->x += dest.x2 - clipped.x2;
        srect->y += clipped.y1 - dest.y1;
        break;
    case DSBLIT_FLIP_VERTICAL:
        srect->x += clipped.x1 - dest.x1;
        srect->y += dest.y2 - clipped.y2;
        break;
    case DSBLIT_ROTATE90:
        srect->x += dest.y2 - clipped.y2;
        srect->y += clipped.x1 - dest.x1;
        break;
    case (DSBLIT_FLIP_HORIZONTAL | DSBLIT_FLIP_VERTICAL): // ROTATE180
        srect->x += dest.x2 - clipped.x2;
        srect->y += dest.y2 - clipped.y2;
        break;
    case (DSBLIT_ROTATE90 | DSBLIT_FLIP_VERTICAL | DSBLIT_FLIP_HORIZONTAL): // ROTATE270
        srect->x += clipped.y1 - dest.y1;
        srect->y += dest.x2 - clipped.x2;
        break;
    case (DSBLIT_ROTATE90 | DSBLIT_FLIP_HORIZONTAL):
        srect->x += clipped.y1 - dest.y1;
        srect->y += clipped.x1 - dest.x1;
        break;
    case (DSBLIT_ROTATE90 | DSBLIT_FLIP_VERTICAL):
        srect->x += dest.y2 - clipped.y2;
        srect->y += dest.x2 - clipped.x2;
        break;
    }

    if (flags & DSBLIT_ROTATE90) {
        srect->w  = drect->h;
        srect->h  = drect->w;
    }
    else {
        srect->w = drect->w;
        srect->h = drect->h;
    }

    D_DEBUG_AT( Core_Clipping, "  => %4d,%4d-%4dx%4d -> %4d,%4d-%4dx%4d\n",
                DFB_RECTANGLE_VALS(srect), DFB_RECTANGLE_VALS(drect) );
}