xref: /haiku/headers/private/interface/ShapePrivate.h (revision 1f52c921e27aa442370e1bd4adc021acf2b78b64)
1 /*
2  * Copyright 2003-2010 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  *		Adrian Oanca, adioanca@cotty.iren.ro
8  */
9 #ifndef SHAPE_PRIVATE_H
10 #define SHAPE_PRIVATE_H
11 
12 #include <Point.h>
13 #include <Rect.h>
14 #include <Referenceable.h>
15 
16 #include <string.h>
17 #include <stdio.h>
18 
19 
20 #define OP_LINETO			0x10000000
21 #define OP_BEZIERTO			0x20000000
22 #define OP_CLOSE			0x40000000
23 #define OP_MOVETO			0x80000000
24 #define OP_LARGE_ARC_TO_CW	0x01000000
25 #define OP_LARGE_ARC_TO_CCW	0x02000000
26 #define OP_SMALL_ARC_TO_CW	0x04000000
27 #define OP_SMALL_ARC_TO_CCW	0x08000000
28 
29 
30 class shape_data : public BReferenceable {
31 public:
32 	uint32*	opList;
33 	BPoint*	ptList;
34 	int32	opCount;
35 	int32	opSize;
36 	int32	ptCount;
37 	int32	ptSize;
38 
39 	bool    fOwnsMemory;
40 
41 	shape_data()
42 		:
43 		fOwnsMemory(false)
44 	{
45 	}
46 
47 	~shape_data()
48 	{
49 		if (fOwnsMemory) {
50 			delete[] opList;
51 			delete[] ptList;
52 		}
53 	}
54 
55 	shape_data(const shape_data& other)
56 	{
57 		opList = new(std::nothrow) uint32[other.opCount];
58 		ptList = new(std::nothrow) BPoint[other.ptCount];
59 		fOwnsMemory = true;
60 		opCount = other.opCount;
61 		opSize = other.opSize;
62 		ptCount = other.ptCount;
63 		ptSize = other.ptSize;
64 		memcpy((void*)opList, other.opList, opSize);
65 		memcpy((void*)ptList, other.ptList, ptSize);
66 	}
67 
68 	BRect DetermineBoundingBox() const
69 	{
70 		BRect bounds;
71 
72 		if (ptCount == 0)
73 			return bounds;
74 
75 		// TODO: This implementation doesn't take into account curves at all.
76 		bounds.left = ptList[0].x;
77 		bounds.top = ptList[0].y;
78 		bounds.right = ptList[0].x;
79 		bounds.bottom = ptList[0].y;
80 
81 		for (int32 i = 1; i < ptCount; i++) {
82 			if (bounds.left > ptList[i].x)
83 				bounds.left = ptList[i].x;
84 
85 			if (bounds.top > ptList[i].y)
86 				bounds.top = ptList[i].y;
87 
88 			if (bounds.right < ptList[i].x)
89 				bounds.right = ptList[i].x;
90 
91 			if (bounds.bottom < ptList[i].y)
92 				bounds.bottom = ptList[i].y;
93 		}
94 
95 		return bounds;
96 	}
97 };
98 
99 
100 #endif	// SHAPE_PRIVATE_H
101