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 */ 39 40#include "glimports.h" 41#include "mystdio.h" 42#include "myassert.h" 43#include "bin.h" 44 45/*---------------------------------------------------------------------------- 46 * Constructor and destructor 47 *---------------------------------------------------------------------------- 48 */ 49Bin::Bin() 50{ 51 head = NULL; 52 current = NULL; 53} 54 55Bin::~Bin() 56{ 57 assert( head == NULL); 58} 59 60/*---------------------------------------------------------------------------- 61 * remove_this_arc - remove given Arc_ptr from bin 62 *---------------------------------------------------------------------------- 63 */ 64 65void 66Bin::remove_this_arc( Arc_ptr arc ) 67{ 68 Arc_ptr *j; 69 for( j = &(head); (*j != 0) && (*j != arc); j = &((*j)->link) ); 70 71 if( *j != 0 ) { 72 if( *j == current ) 73 current = (*j)->link; 74 *j = (*j)->link; 75 } 76} 77 78/*---------------------------------------------------------------------------- 79 * numarcs - count number of arcs in bin 80 *---------------------------------------------------------------------------- 81 */ 82 83int 84Bin::numarcs() 85{ 86 long count = 0; 87 for( Arc_ptr jarc = firstarc(); jarc; jarc = nextarc() ) 88 count++; 89 return count; 90} 91 92/*---------------------------------------------------------------------------- 93 * adopt - place an orphaned arcs into their new parents bin 94 *---------------------------------------------------------------------------- 95 */ 96 97void 98Bin::adopt() 99{ 100 markall(); 101 102 Arc_ptr orphan; 103 while( (orphan = removearc()) != NULL ) { 104 for( Arc_ptr parent = orphan->next; parent != orphan; parent = parent->next ) { 105 if (! parent->ismarked() ) { 106 orphan->link = parent->link; 107 parent->link = orphan; 108 orphan->clearmark(); 109 break; 110 } 111 } 112 } 113} 114 115 116/*---------------------------------------------------------------------------- 117 * show - print out descriptions of the arcs in the bin 118 *---------------------------------------------------------------------------- 119 */ 120 121void 122Bin::show( const char *name ) 123{ 124#ifndef NDEBUG 125 _glu_dprintf( "%s\n", name ); 126 for( Arc_ptr jarc = firstarc(); jarc; jarc = nextarc() ) 127 jarc->show( ); 128#endif 129} 130 131 132 133/*---------------------------------------------------------------------------- 134 * markall - mark all arcs with an identifying tag 135 *---------------------------------------------------------------------------- 136 */ 137 138void 139Bin::markall() 140{ 141 for( Arc_ptr jarc=firstarc(); jarc; jarc=nextarc() ) 142 jarc->setmark(); 143} 144 145/*---------------------------------------------------------------------------- 146 * listBezier - print out all arcs that are untessellated border arcs 147 *---------------------------------------------------------------------------- 148 */ 149 150void 151Bin::listBezier( void ) 152{ 153 for( Arc_ptr jarc=firstarc(); jarc; jarc=nextarc() ) { 154 if( jarc->isbezier( ) ) { 155 assert( jarc->pwlArc->npts == 2 ); 156#ifndef NDEBUG 157 TrimVertex *pts = jarc->pwlArc->pts; 158 REAL s1 = pts[0].param[0]; 159 REAL t1 = pts[0].param[1]; 160 REAL s2 = pts[1].param[0]; 161 REAL t2 = pts[1].param[1]; 162 _glu_dprintf( "arc (%g,%g) (%g,%g)\n", s1, t1, s2, t2 ); 163#endif 164 } 165 } 166} 167 168