Blame gdk/directfb/gdkgeometry-directfb.c

Packit 98cdb6
/* GDK - The GIMP Drawing Kit
Packit 98cdb6
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Lesser General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Lesser General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Lesser General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit 98cdb6
 * file for a list of people on the GTK+ Team.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * GTK+ DirectFB backend
Packit 98cdb6
 * Copyright (C) 2001-2002  convergence integrated media GmbH
Packit 98cdb6
 * Copyright (C) 2002-2004  convergence GmbH
Packit 98cdb6
 * Written by Denis Oliver Kropp <dok@convergence.de> and
Packit 98cdb6
 *            Sven Neumann <sven@convergence.de>
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include "config.h"
Packit 98cdb6
#include "gdk.h"        /* For gdk_rectangle_intersect */
Packit 98cdb6
Packit 98cdb6
#include "gdkdirectfb.h"
Packit 98cdb6
#include "gdkprivate-directfb.h"
Packit 98cdb6
Packit 98cdb6
#include "gdkinternals.h"
Packit 98cdb6
#include "gdkalias.h"
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_directfb_window_get_offsets (GdkWindow *window,
Packit 98cdb6
                                  gint      *x_offset,
Packit 98cdb6
                                  gint      *y_offset)
Packit 98cdb6
{
Packit 98cdb6
  if (x_offset)
Packit 98cdb6
    *x_offset = 0;
Packit 98cdb6
  if (y_offset)
Packit 98cdb6
    *y_offset = 0;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
gboolean
Packit 98cdb6
_gdk_windowing_window_queue_antiexpose (GdkWindow *window,
Packit 98cdb6
                                        GdkRegion *area)
Packit 98cdb6
{
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_window_scroll:
Packit 98cdb6
 * @window: a #GdkWindow
Packit 98cdb6
 * @dx: Amount to scroll in the X direction
Packit 98cdb6
 * @dy: Amount to scroll in the Y direction
Packit 98cdb6
 *
Packit 98cdb6
 * Scroll the contents of its window, both pixels and children, by
Packit 98cdb6
 * the given amount. Portions of the window that the scroll operation
Packit 98cdb6
 * brings in from offscreen areas are invalidated.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
_gdk_directfb_window_scroll (GdkWindow *window,
Packit 98cdb6
                             gint       dx,
Packit 98cdb6
                             gint       dy)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject         *private;
Packit 98cdb6
  GdkDrawableImplDirectFB *impl;
Packit 98cdb6
  GdkRegion               *invalidate_region = NULL;
Packit 98cdb6
  GList                   *list;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (dx == 0 && dy == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* Move the current invalid region */
Packit 98cdb6
  if (private->update_area)
Packit 98cdb6
    gdk_region_offset (private->update_area, dx, dy);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    {
Packit 98cdb6
      GdkRectangle  clip_rect = {  0,  0, impl->width, impl->height };
Packit 98cdb6
      GdkRectangle  rect      = { dx, dy, impl->width, impl->height };
Packit 98cdb6
Packit 98cdb6
      invalidate_region = gdk_region_rectangle (&clip_rect);
Packit 98cdb6
Packit 98cdb6
      if (gdk_rectangle_intersect (&rect, &clip_rect, &rect) &&
Packit 98cdb6
          (!private->update_area ||
Packit 98cdb6
           !gdk_region_rect_in (private->update_area, &rect)))
Packit 98cdb6
        {
Packit 98cdb6
          GdkRegion *region;
Packit 98cdb6
Packit 98cdb6
          region = gdk_region_rectangle (&rect);
Packit 98cdb6
          gdk_region_subtract (invalidate_region, region);
Packit 98cdb6
          gdk_region_destroy (region);
Packit 98cdb6
Packit 98cdb6
          if (impl->surface)
Packit 98cdb6
            {
Packit 98cdb6
              DFBRegion update = { rect.x, rect.y,
Packit 98cdb6
                                   rect.x + rect.width  - 1,
Packit 98cdb6
                                   rect.y + rect.height - 1 };
Packit 98cdb6
Packit 98cdb6
              impl->surface->SetClip (impl->surface, &update);
Packit 98cdb6
              impl->surface->Blit (impl->surface, impl->surface, NULL, dx, dy);
Packit 98cdb6
              impl->surface->SetClip (impl->surface, NULL);
Packit 98cdb6
              impl->surface->Flip (impl->surface, &update, 0);
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  for (list = private->children; list; list = list->next)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject         *obj      = GDK_WINDOW_OBJECT (list->data);
Packit 98cdb6
      GdkDrawableImplDirectFB *obj_impl = GDK_DRAWABLE_IMPL_DIRECTFB (obj->impl);
Packit 98cdb6
Packit 98cdb6
      _gdk_directfb_move_resize_child (list->data,
Packit 98cdb6
                                       obj->x + dx,
Packit 98cdb6
                                       obj->y + dy,
Packit 98cdb6
                                       obj_impl->width,
Packit 98cdb6
                                       obj_impl->height);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (invalidate_region)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_window_invalidate_region (window, invalidate_region, TRUE);
Packit 98cdb6
      gdk_region_destroy (invalidate_region);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_window_move_region:
Packit 98cdb6
 * @window: a #GdkWindow
Packit 98cdb6
 * @region: The #GdkRegion to move
Packit 98cdb6
 * @dx: Amount to move in the X direction
Packit 98cdb6
 * @dy: Amount to move in the Y direction
Packit 98cdb6
 *
Packit 98cdb6
 * Move the part of @window indicated by @region by @dy pixels in the Y
Packit 98cdb6
 * direction and @dx pixels in the X direction. The portions of @region
Packit 98cdb6
 * that not covered by the new position of @region are invalidated.
Packit 98cdb6
 *
Packit 98cdb6
 * Child windows are not moved.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.8
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
_gdk_directfb_window_move_region (GdkWindow       *window,
Packit 98cdb6
                                  const GdkRegion *region,
Packit 98cdb6
                                  gint             dx,
Packit 98cdb6
                                  gint             dy)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject         *private;
Packit 98cdb6
  GdkDrawableImplDirectFB *impl;
Packit 98cdb6
  GdkRegion               *window_clip;
Packit 98cdb6
  GdkRegion               *src_region;
Packit 98cdb6
  GdkRegion               *brought_in;
Packit 98cdb6
  GdkRegion               *dest_region;
Packit 98cdb6
  GdkRegion               *moving_invalid_region;
Packit 98cdb6
  GdkRectangle             dest_extents;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
  g_return_if_fail (region != NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (dx == 0 && dy == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  GdkRectangle  clip_rect = {  0,  0, impl->width, impl->height };
Packit 98cdb6
  window_clip = gdk_region_rectangle (&clip_rect);
Packit 98cdb6
Packit 98cdb6
  /* compute source regions */
Packit 98cdb6
  src_region = gdk_region_copy (region);
Packit 98cdb6
  brought_in = gdk_region_copy (region);
Packit 98cdb6
  gdk_region_intersect (src_region, window_clip);
Packit 98cdb6
Packit 98cdb6
  gdk_region_subtract (brought_in, src_region);
Packit 98cdb6
  gdk_region_offset (brought_in, dx, dy);
Packit 98cdb6
Packit 98cdb6
  /* compute destination regions */
Packit 98cdb6
  dest_region = gdk_region_copy (src_region);
Packit 98cdb6
  gdk_region_offset (dest_region, dx, dy);
Packit 98cdb6
  gdk_region_intersect (dest_region, window_clip);
Packit 98cdb6
  gdk_region_get_clipbox (dest_region, &dest_extents);
Packit 98cdb6
Packit 98cdb6
  gdk_region_destroy (window_clip);
Packit 98cdb6
Packit 98cdb6
  /* calculating moving part of current invalid area */
Packit 98cdb6
  moving_invalid_region = NULL;
Packit 98cdb6
  if (private->update_area)
Packit 98cdb6
    {
Packit 98cdb6
      moving_invalid_region = gdk_region_copy (private->update_area);
Packit 98cdb6
      gdk_region_intersect (moving_invalid_region, src_region);
Packit 98cdb6
      gdk_region_offset (moving_invalid_region, dx, dy);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* invalidate all of the src region */
Packit 98cdb6
  gdk_window_invalidate_region (window, src_region, FALSE);
Packit 98cdb6
Packit 98cdb6
  /* un-invalidate destination region */
Packit 98cdb6
  if (private->update_area)
Packit 98cdb6
    gdk_region_subtract (private->update_area, dest_region);
Packit 98cdb6
Packit 98cdb6
  /* invalidate moving parts of existing update area */
Packit 98cdb6
  if (moving_invalid_region)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_window_invalidate_region (window, moving_invalid_region, FALSE);
Packit 98cdb6
      gdk_region_destroy (moving_invalid_region);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* invalidate area brought in from off-screen */
Packit 98cdb6
  gdk_window_invalidate_region (window, brought_in, FALSE);
Packit 98cdb6
  gdk_region_destroy (brought_in);
Packit 98cdb6
Packit 98cdb6
  /* Actually do the moving */
Packit 98cdb6
  if (impl->surface)
Packit 98cdb6
    {
Packit 98cdb6
      DFBRectangle source = { dest_extents.x - dx,
Packit 98cdb6
                              dest_extents.y - dy,
Packit 98cdb6
                              dest_extents.width,
Packit 98cdb6
                              dest_extents.height};
Packit 98cdb6
      DFBRegion destination = { dest_extents.x,
Packit 98cdb6
                                dest_extents.y,
Packit 98cdb6
                                dest_extents.x + dest_extents.width - 1,
Packit 98cdb6
                                dest_extents.y + dest_extents.height - 1};
Packit 98cdb6
Packit 98cdb6
      impl->surface->SetClip (impl->surface, &destination);
Packit 98cdb6
      impl->surface->Blit (impl->surface, impl->surface, &source, dx, dy);
Packit 98cdb6
      impl->surface->SetClip (impl->surface, NULL);
Packit 98cdb6
      impl->surface->Flip (impl->surface, &destination, 0);
Packit 98cdb6
    }
Packit 98cdb6
  gdk_region_destroy (src_region);
Packit 98cdb6
  gdk_region_destroy (dest_region);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
#define __GDK_GEOMETRY_X11_C__
Packit 98cdb6
#include "gdkaliasdef.c"