JOGL v2.6.0-rc-20250712
JOGL, High-Performance Graphics Binding for Java™ (public API).
CapabilitiesFilter.java
Go to the documentation of this file.
1/**
2 * Copyright 2019 JogAmp Community. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are
5 * permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * The views and conclusions contained in the software and documentation are those of the
25 * authors and should not be interpreted as representing official policies, either expressed
26 * or implied, of JogAmp Community.
27 */
28
29package com.jogamp.nativewindow;
30
31import java.util.ArrayList;
32import java.util.List;
33
34import com.jogamp.nativewindow.VisualIDHolder.VIDType;
35
36/**
37 * Diverse reusable {@link CapabilitiesImmutable} list filter
38 */
39public class CapabilitiesFilter {
40 protected CapabilitiesFilter() {}
41
42 /** Generic filter criteria */
43 public static interface Test<C extends CapabilitiesImmutable> {
44 public boolean match(final C cap);
45 }
46
47 public static class TestLessColorCompBits<C extends CapabilitiesImmutable> implements Test<C> {
48 final int minColorCompBits;
49 public TestLessColorCompBits(final int minColorCompBits) {
50 this.minColorCompBits = minColorCompBits;
51 }
52 public final boolean match(final C cap) {
53 return cap.getRedBits() < minColorCompBits ||
54 cap.getGreenBits() < minColorCompBits ||
55 cap.getBlueBits() < minColorCompBits ||
56 cap.getAlphaBits() < minColorCompBits;
57 }
58 }
59 public static class TestMoreColorCompBits<C extends CapabilitiesImmutable> implements Test<C> {
60 final int maxColorCompBits;
61 public TestMoreColorCompBits(final int maxColorCompBits) {
62 this.maxColorCompBits = maxColorCompBits;
63 }
64 public final boolean match(final C cap) {
65 return cap.getRedBits() > maxColorCompBits ||
66 cap.getGreenBits() > maxColorCompBits ||
67 cap.getBlueBits() > maxColorCompBits ||
68 cap.getAlphaBits() > maxColorCompBits;
69 }
70 }
71 public static class TestUnmatchedNativeVisualID<C extends CapabilitiesImmutable> implements Test<C> {
72 final int requiredNativeVisualID;
73 public TestUnmatchedNativeVisualID(final int requiredNativeVisualID) {
74 this.requiredNativeVisualID = requiredNativeVisualID;
75 }
76 public final boolean match(final C cap) {
77 return cap.getVisualID(VIDType.NATIVE) != requiredNativeVisualID;
78 }
79 }
80
81 /**
82 * Removing all {@link CapabilitiesImmutable} derived elements matching the given {@code criteria} {@link Test} list.
83 * @param availableCaps {@link CapabilitiesImmutable} derived list to be filtered
84 * @param criteria {@link Test} list run on all non-removed {@link CapabilitiesImmutable} derived elements
85 * @return the list of removed {@link CapabilitiesImmutable} derived elements, might be of size 0 if none were removed.
86 */
87 public static <C extends CapabilitiesImmutable> ArrayList<C> removeMatching(final ArrayList<C> availableCaps, final List<Test<C>> criteria) {
88 final ArrayList<C> removedCaps = new ArrayList<C>();
89 for(int i=0; i<availableCaps.size(); ) {
90 final C cap = availableCaps.get(i);
91 boolean removed = false;
92 for(int j=0; !removed && j<criteria.size(); j++) {
93 if( criteria.get(j).match(cap) ) {
94 removedCaps.add(availableCaps.remove(i));
95 removed = true;
96 }
97 }
98 if( !removed ) {
99 i++;
100 }
101 }
102 return removedCaps;
103 }
104
105 /**
106 * If {@code requiredNativeVisualID} is not {@link VisualIDHolder.VID_UNDEFINED} and hence specific,
107 * this filter removes all non-matching nativeVisualID {@link VIDType.NATIVE}.
108 * <p>
109 * Otherwise, if {@code requiredNativeVisualID} equals {@link VisualIDHolder.VID_UNDEFINED}, none is removed.
110 * </p>
111 * @param availableCaps list of {@link CapabilitiesImmutable} derived elements to be filtered
112 * @param requiredNativeVisualID if not {@link VisualIDHolder.VID_UNDEFINED}, remove all non-matching nativeVisualID's
113 * @return the list of removed {@link CapabilitiesImmutable} derived elements, might be of size 0 if none were removed.
114 */
115 public static <C extends CapabilitiesImmutable> ArrayList<C> removeUnmatchingNativeVisualID(final ArrayList<C> availableCaps,
116 final int requiredNativeVisualID) {
117 if( VisualIDHolder.VID_UNDEFINED == requiredNativeVisualID) {
118 return new ArrayList<C>();
119 }
120 final ArrayList<Test<C>> criteria = new ArrayList<Test<C>>();
121 criteria.add(new CapabilitiesFilter.TestUnmatchedNativeVisualID<C>(requiredNativeVisualID));
122 return removeMatching(availableCaps, criteria);
123 }
124
125 /**
126 * Filter removing all {@link CapabilitiesImmutable} derived elements having color components > {@code maxColorCompBits} including alpha.
127 * @param availableCaps list of {@link CapabilitiesImmutable} derived elements to be filtered
128 * @param maxColorCompBits maximum tolerated color component bits
129 * @return the list of removed {@link CapabilitiesImmutable} derived elements, might be of size 0 if none were removed.
130 */
131 public static <C extends CapabilitiesImmutable> ArrayList<C> removeMoreColorComps(final ArrayList<C> availableCaps,
132 final int maxColorCompBits) {
133 final ArrayList<Test<C>> criteria = new ArrayList<Test<C>>();
134 criteria.add(new CapabilitiesFilter.TestMoreColorCompBits<C>(maxColorCompBits));
135 return removeMatching(availableCaps, criteria);
136 }
137
138 /**
139 * Filter removing all {@link CapabilitiesImmutable} derived elements having color components > {@code maxColorCompBits} including alpha.
140 * <p>
141 * If {@code requiredNativeVisualID} is not {@link VisualIDHolder.VID_UNDEFINED} and hence specific,
142 * this filter also removes all non-matching nativeVisualID {@link VIDType.NATIVE}.
143 * </p>
144 * @param availableCaps list of {@link CapabilitiesImmutable} derived elements to be filtered
145 * @param maxColorCompBits maximum tolerated color component bits
146 * @param requiredNativeVisualID if not {@link VisualIDHolder.VID_UNDEFINED}, also remove all non-matching nativeVisualID's
147 * @return the list of removed {@link CapabilitiesImmutable} derived elements, might be of size 0 if none were removed.
148 * @see #removeUnmatchingNativeVisualID(ArrayList, int)
149 * @see #removeMoreColorComps(ArrayList, int)
150 */
151 public static <C extends CapabilitiesImmutable> ArrayList<C> removeMoreColorCompsAndUnmatchingNativeVisualID(final ArrayList<C> availableCaps,
152 final int maxColorCompBits, final int requiredNativeVisualID) {
153 final ArrayList<Test<C>> criteria = new ArrayList<Test<C>>();
154 criteria.add(new CapabilitiesFilter.TestMoreColorCompBits<C>(maxColorCompBits));
155 if( VisualIDHolder.VID_UNDEFINED != requiredNativeVisualID) {
156 criteria.add(new CapabilitiesFilter.TestUnmatchedNativeVisualID<C>(requiredNativeVisualID));
157 }
158 return removeMatching(availableCaps, criteria);
159 }
160
161}
Diverse reusable CapabilitiesImmutable list filter.
static< C extends CapabilitiesImmutable > ArrayList< C > removeMoreColorComps(final ArrayList< C > availableCaps, final int maxColorCompBits)
Filter removing all CapabilitiesImmutable derived elements having color components > maxColorCompBits...
static< C extends CapabilitiesImmutable > ArrayList< C > removeMoreColorCompsAndUnmatchingNativeVisualID(final ArrayList< C > availableCaps, final int maxColorCompBits, final int requiredNativeVisualID)
Filter removing all CapabilitiesImmutable derived elements having color components > maxColorCompBits...
static< C extends CapabilitiesImmutable > ArrayList< C > removeUnmatchingNativeVisualID(final ArrayList< C > availableCaps, final int requiredNativeVisualID)
If requiredNativeVisualID is not VisualIDHolder.VID_UNDEFINED and hence specific, this filter removes...
static< C extends CapabilitiesImmutable > ArrayList< C > removeMatching(final ArrayList< C > availableCaps, final List< Test< C > > criteria)
Removing all CapabilitiesImmutable derived elements matching the given criteria Test list.
Specifies an immutable set of capabilities that a window's rendering context must support,...
static final int VID_UNDEFINED
getVisualID(VIDType) result indicating an undefined value, which could be cause by an unsupported que...