Bug #: 3674
[WebKit-https.git] / WebCore / kwq / KWQPointArray.mm
1 /*
2  * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "KWQPointArray.h"
27 #import <stdarg.h>
28
29 #import "KWQRect.h"
30
31 QPointArray::QPointArray(int nPoints, const int *points)
32 {
33     setPoints(nPoints, points);
34 }
35
36 QPointArray::QPointArray(const QRect &rect)
37 {
38     setPoints(4, rect.topLeft().x(), rect.topLeft().y(),
39               rect.topRight().x(), rect.topRight().y(),
40               rect.bottomRight().x(), rect.bottomRight().y(),
41               rect.bottomLeft().x(), rect.bottomLeft().y());
42 }
43
44 QPointArray QPointArray::copy() const
45 {
46     QPointArray copy;
47     copy.duplicate(*this);
48     return copy;
49 }
50
51 QRect QPointArray::boundingRect() const
52 {
53     int nPoints = count();
54     
55     if (nPoints < 1) return QRect(0,0,0,0);
56     
57     int minX = INT_MAX, maxX = 0;
58     int minY = INT_MAX, maxY = 0;
59     
60     while (nPoints > 0) {
61         QPoint p = at(nPoints);
62         int x = p.x(), y = p.y();
63         
64         if (x < minX) minX = x;
65         if (x > maxX) maxX = x;
66         if (y < minY) minY = y;
67         if (y > maxY) maxY = y;
68         
69         nPoints--;
70     }
71     
72     return QRect(minX, minY, maxX - minX + 1, maxY - minY + 1);
73 }
74
75 void QPointArray::point(uint index, int *x, int *y)
76 {
77     QPoint p = at(index);
78     *x = p.x();
79     *y = p.y();
80 }
81
82 void QPointArray::setPoint( uint index, int x, int y )
83 {
84     QMemArray<QPoint>::at( index ) = QPoint( x, y );
85 }
86
87
88 bool QPointArray::setPoints( int nPoints, const int *points )
89 {
90     if ( !resize(nPoints) )
91         return FALSE;
92     int i = 0;
93     while ( nPoints-- ) {                       // make array of points
94         setPoint( i++, *points, *(points+1) );
95         points++;
96         points++;
97     }
98     return TRUE;
99 }
100
101 // FIXME: Workaround for Radar 2921061
102 #if 0
103
104 bool QPointArray::setPoints( int nPoints, int firstx, int firsty, ... )
105 {
106     va_list ap;
107     if ( !resize(nPoints) )
108         return FALSE;
109     setPoint( 0, firstx, firsty );              // set first point
110     int i = 1, x, y;
111     nPoints--;
112     va_start( ap, firsty );
113     while ( nPoints-- ) {
114         x = va_arg( ap, int );
115         y = va_arg( ap, int );
116         setPoint( i++, x, y );
117     }
118     va_end( ap );
119     return TRUE;
120 }
121
122 #else
123
124 bool QPointArray::setPoints( int nPoints, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3)
125 {
126     if ( !resize(nPoints) )
127         return FALSE;
128     setPoint( 0, x0, y0 );
129     setPoint( 1, x1, y1 );
130     setPoint( 2, x2, y2 );
131     setPoint( 3, x3, y3 );
132     return TRUE;
133 }
134
135 #endif