ed427567f9100d6c6dd372ea0a7d340ebde94176
[mesa.git] / src / glu / sgi / libnurbs / internals / bin.cc
1 /*
2 ** License Applicability. Except to the extent portions of this file are
3 ** made subject to an alternative license as permitted in the SGI Free
4 ** Software License B, Version 1.1 (the "License"), the contents of this
5 ** file are subject only to the provisions of the License. You may not use
6 ** this file except in compliance with the License. You may obtain a copy
7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9 **
10 ** http://oss.sgi.com/projects/FreeB
11 **
12 ** Note that, as provided in the License, the Software is distributed on an
13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17 **
18 ** Original Code. The Original Code is: OpenGL Sample Implementation,
19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21 ** Copyright in any portions created by third parties is as indicated
22 ** elsewhere herein. All Rights Reserved.
23 **
24 ** Additional Notice Provisions: The application programming interfaces
25 ** established by SGI in conjunction with the Original Code are The
26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29 ** Window System(R) (Version 1.3), released October 19, 1998. This software
30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31 ** published by SGI, but has not been independently verified as being
32 ** compliant with the OpenGL(R) version 1.2.1 Specification.
33 */
34
35 /*
36 * bin.c++
37 *
38 * $Date: 2006/03/14 15:08:52 $ $Revision: 1.3 $
39 * $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/bin.cc,v 1.3 2006/03/14 15:08:52 brianp Exp $
40 */
41
42 #include "glimports.h"
43 #include "mystdio.h"
44 #include "myassert.h"
45 #include "bin.h"
46
47 /*----------------------------------------------------------------------------
48 * Constructor and destructor
49 *----------------------------------------------------------------------------
50 */
51 Bin::Bin()
52 {
53 head = NULL;
54 }
55
56 Bin::~Bin()
57 {
58 assert( head == NULL);
59 }
60
61 /*----------------------------------------------------------------------------
62 * remove_this_arc - remove given Arc_ptr from bin
63 *----------------------------------------------------------------------------
64 */
65
66 void
67 Bin::remove_this_arc( Arc_ptr arc )
68 {
69 Arc_ptr *j;
70 for( j = &(head); (*j != 0) && (*j != arc); j = &((*j)->link) );
71
72 if( *j != 0 ) {
73 if( *j == current )
74 current = (*j)->link;
75 *j = (*j)->link;
76 }
77 }
78
79 /*----------------------------------------------------------------------------
80 * numarcs - count number of arcs in bin
81 *----------------------------------------------------------------------------
82 */
83
84 int
85 Bin::numarcs()
86 {
87 long count = 0;
88 for( Arc_ptr jarc = firstarc(); jarc; jarc = nextarc() )
89 count++;
90 return count;
91 }
92
93 /*----------------------------------------------------------------------------
94 * adopt - place an orphaned arcs into their new parents bin
95 *----------------------------------------------------------------------------
96 */
97
98 void
99 Bin::adopt()
100 {
101 markall();
102
103 Arc_ptr orphan;
104 while( (orphan = removearc()) != NULL ) {
105 for( Arc_ptr parent = orphan->next; parent != orphan; parent = parent->next ) {
106 if (! parent->ismarked() ) {
107 orphan->link = parent->link;
108 parent->link = orphan;
109 orphan->clearmark();
110 break;
111 }
112 }
113 }
114 }
115
116
117 /*----------------------------------------------------------------------------
118 * show - print out descriptions of the arcs in the bin
119 *----------------------------------------------------------------------------
120 */
121
122 void
123 Bin::show( char *name )
124 {
125 #ifndef NDEBUG
126 _glu_dprintf( "%s\n", name );
127 for( Arc_ptr jarc = firstarc(); jarc; jarc = nextarc() )
128 jarc->show( );
129 #endif
130 }
131
132
133
134 /*----------------------------------------------------------------------------
135 * markall - mark all arcs with an identifying tag
136 *----------------------------------------------------------------------------
137 */
138
139 void
140 Bin::markall()
141 {
142 for( Arc_ptr jarc=firstarc(); jarc; jarc=nextarc() )
143 jarc->setmark();
144 }
145
146 /*----------------------------------------------------------------------------
147 * listBezier - print out all arcs that are untessellated border arcs
148 *----------------------------------------------------------------------------
149 */
150
151 void
152 Bin::listBezier( void )
153 {
154 for( Arc_ptr jarc=firstarc(); jarc; jarc=nextarc() ) {
155 if( jarc->isbezier( ) ) {
156 assert( jarc->pwlArc->npts == 2 );
157 #ifndef NDEBUG
158 TrimVertex *pts = jarc->pwlArc->pts;
159 REAL s1 = pts[0].param[0];
160 REAL t1 = pts[0].param[1];
161 REAL s2 = pts[1].param[0];
162 REAL t2 = pts[1].param[1];
163 _glu_dprintf( "arc (%g,%g) (%g,%g)\n", s1, t1, s2, t2 );
164 #endif
165 }
166 }
167 }
168