1 /* 2 * Copyright (c) 2002-2008 LWJGL Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'LWJGL' nor the names of 17 * its contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 package org.lwjgl.opengl; 33 34 import static org.lwjgl.opengl.GL11.*; 35 36 class ReferencesStack { 37 private References[] references_stack; 38 private int stack_pos; 39 getReferences()40 public References getReferences() { 41 return references_stack[stack_pos]; 42 } 43 pushState()44 public void pushState() { 45 int pos = ++stack_pos; 46 if (pos == references_stack.length) { 47 growStack(); 48 } 49 references_stack[pos].copy(references_stack[pos - 1], GL_ALL_CLIENT_ATTRIB_BITS); 50 } 51 popState(int mask)52 public References popState(int mask) { 53 References result = references_stack[stack_pos--]; 54 55 references_stack[stack_pos].copy(result, ~mask); 56 result.clear(); 57 58 return result; 59 } 60 growStack()61 private void growStack() { 62 References[] new_references_stack = new References[references_stack.length + 1]; 63 System.arraycopy(references_stack, 0, new_references_stack, 0, references_stack.length); 64 references_stack = new_references_stack; 65 references_stack[references_stack.length - 1] = new References(GLContext.getCapabilities()); 66 } 67 ReferencesStack()68 ReferencesStack() { 69 ContextCapabilities caps = GLContext.getCapabilities(); 70 references_stack = new References[1]; 71 stack_pos = 0; 72 for (int i = 0; i < references_stack.length; i++) 73 references_stack[i] = new References(caps); 74 } 75 } 76