webengine/wmlengine/src/gdi/src/Utils.c
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/gdi/src/Utils.c	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,157 @@
+/*
+* 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);
+    }
+  }
+}
+
+