--- /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);
+ }
+ }
+}
+
+