webengine/wmlengine/src/gdi/src/Utils.c
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 12 Mar 2010 15:48:51 +0200
branchRCL_3
changeset 34 220a17280356
parent 0 dd21522fd290
permissions -rw-r--r--
Revision: 201006 Kit: 201008

/*
* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


#include "nw_gdi_utils.h"

NW_Bool
NW_GDI_Rectangle_Contains (const NW_GDI_Rectangle_t* rect,
                           const NW_GDI_Point2D_t* point)
{
  if ((point->x >= rect->point.x) && (point->x < rect->point.x + rect->dimension.width) &&
    (point->y >= rect->point.y) && (point->y < rect->point.y + rect->dimension.height)) {
    return NW_TRUE;
  }
  else {
    return NW_FALSE;
  }
}

NW_Bool
NW_GDI_Rectangle_Cross (const NW_GDI_Rectangle_t* rect1,
                        const NW_GDI_Rectangle_t* rect2,
                        NW_GDI_Rectangle_t* result)
{
  const NW_GDI_Rectangle_t* temp;
  NW_GDI_Metric_t x1_left;
  NW_GDI_Metric_t x1_right;
  NW_GDI_Metric_t y1_bottom;
  NW_GDI_Metric_t x2_left;
  NW_GDI_Metric_t x2_right;
  NW_GDI_Metric_t y2_top;
  NW_GDI_Metric_t y2_bottom;
  NW_GDI_Metric_t r_left;
  NW_GDI_Metric_t r_right;
  NW_GDI_Metric_t r_top;
  NW_GDI_Metric_t r_bottom;

  if (result != NULL) {
    NW_Mem_memset(result, 0, sizeof(NW_GDI_Rectangle_t));
  }

  if ((rect1->dimension.width==0 && rect1->dimension.height==0) ||
      (rect2->dimension.width==0 && rect2->dimension.height==0)) {
    return NW_FALSE;
  }

  if (rect1->point.y > rect2->point.y) {
    temp = rect1;
    rect1 = rect2;
    rect2 = temp;
  }

  x1_left = rect1->point.x; 
  x1_right = (NW_GDI_Metric_t)(rect1->point.x + rect1->dimension.width - 1);
  y1_bottom = (NW_GDI_Metric_t)(rect1->point.y + rect1->dimension.height - 1);

  x2_left = rect2->point.x; 
  x2_right = (NW_GDI_Metric_t)(rect2->point.x + rect2->dimension.width - 1);
  y2_top = rect2->point.y; 
  y2_bottom = (NW_GDI_Metric_t)(rect2->point.y + rect2->dimension.height - 1);

  if (x1_left < x2_left) {
    if (x1_right < x2_left) {
      return NW_FALSE;
    }
    else {
      r_left = x2_left;
    }

    if (x2_right < x1_right) {
      r_right = x2_right;
    }
    else {
      r_right = x1_right;
    }
  }
  else {
    if (x1_left > x2_right) {
      return NW_FALSE;
    }
    else {
      r_left = x1_left;
    }

    if (x1_right < x2_right) {
      r_right = x1_right;
    }
    else {
      r_right = x2_right;
    }
  }

  /* Get the vertical intersection */
  if (y1_bottom < y2_top) {
    return NW_FALSE;
  }
  else {
    r_top = y2_top;
  }

  if (y2_bottom < y1_bottom) {
    r_bottom = y2_bottom;
  }
  else {
    r_bottom = y1_bottom;
  }
  
  if (result != NULL) {
    result->point.x = r_left;
    result->point.y = r_top;
    result->dimension.width = (NW_GDI_Metric_t)(r_right - r_left + 1);
    result->dimension.height = (NW_GDI_Metric_t)(r_bottom - r_top + 1);
  }

  return NW_TRUE;
}

void
NW_GDI_Rectangle_Add (const NW_GDI_Rectangle_t* rect1,
                      const NW_GDI_Rectangle_t* rect2,
                      NW_GDI_Rectangle_t* result)
{
  if (result) {
    *result = *rect1;

    if (rect2->point.x < rect1->point.x) {
      result->point.x = rect1->point.x;
    }
    if (rect2->point.y < rect1->point.y) {
      result->point.y = rect1->point.y;
    }
    if (rect2->point.x + rect2->dimension.width > 
          rect1->point.x + rect1->dimension.width) {
      result->dimension.width = (NW_GDI_Metric_t)(rect2->point.x + rect2->dimension.width - result->point.x);
    }
    if (rect2->point.y + rect2->dimension.height > 
          rect1->point.y + rect1->dimension.height) {
      result->dimension.height = (NW_GDI_Metric_t)(rect2->point.y + rect2->dimension.height - result->point.y);
    }
  }
}