propane 3.4.2-java → 3.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +2 -2
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -2
  5. data/.travis.yml +1 -1
  6. data/CHANGELOG.md +9 -1
  7. data/Gemfile +2 -0
  8. data/README.md +7 -10
  9. data/Rakefile +10 -11
  10. data/bin/propane +3 -1
  11. data/lib/propane.rb +4 -2
  12. data/lib/propane/app.rb +5 -1
  13. data/lib/propane/creators/sketch_class.rb +7 -1
  14. data/lib/propane/creators/sketch_factory.rb +4 -2
  15. data/lib/propane/creators/sketch_writer.rb +1 -0
  16. data/lib/propane/helper_methods.rb +22 -23
  17. data/lib/propane/helpers/numeric.rb +2 -0
  18. data/lib/propane/helpers/version_error.rb +1 -0
  19. data/lib/propane/library.rb +5 -1
  20. data/lib/propane/library_loader.rb +2 -0
  21. data/lib/propane/native_folder.rb +10 -9
  22. data/lib/propane/native_loader.rb +3 -0
  23. data/lib/propane/runner.rb +20 -14
  24. data/lib/propane/version.rb +2 -1
  25. data/library/boids/boids.rb +21 -11
  26. data/library/color_group/color_group.rb +2 -0
  27. data/library/control_panel/control_panel.rb +8 -5
  28. data/library/dxf/dxf.rb +2 -0
  29. data/library/file_chooser/chooser.rb +10 -9
  30. data/library/file_chooser/file_chooser.rb +10 -9
  31. data/library/library_proxy/library_proxy.rb +2 -0
  32. data/library/net/net.rb +2 -0
  33. data/library/slider/slider.rb +23 -22
  34. data/library/vector_utils/vector_utils.rb +4 -0
  35. data/library/video_event/video_event.rb +2 -0
  36. data/pom.rb +37 -36
  37. data/pom.xml +7 -7
  38. data/propane.gemspec +13 -9
  39. data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
  40. data/src/main/java/monkstone/ColorUtil.java +1 -3
  41. data/src/main/java/monkstone/MathToolModule.java +1 -1
  42. data/src/main/java/monkstone/PropaneLibrary.java +2 -2
  43. data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
  44. data/src/main/java/monkstone/fastmath/Deglut.java +6 -56
  45. data/src/main/java/monkstone/filechooser/Chooser.java +1 -1
  46. data/src/main/java/monkstone/noise/Noise.java +116 -0
  47. data/src/main/java/monkstone/noise/NoiseGenerator.java +63 -0
  48. data/src/main/java/monkstone/noise/NoiseMode.java +15 -0
  49. data/src/main/java/monkstone/noise/SimplexNoise.java +137 -103
  50. data/src/main/java/monkstone/noise/ValueNoise.java +170 -0
  51. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
  52. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  53. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
  54. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
  55. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  56. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  57. data/src/main/java/monkstone/slider/WheelHandler.java +1 -1
  58. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  59. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
  60. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -2
  61. data/src/main/java/monkstone/videoevent/CaptureEvent.java +1 -1
  62. data/src/main/java/monkstone/videoevent/MovieEvent.java +1 -1
  63. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  64. data/src/main/java/processing/awt/PGraphicsJava2D.java +781 -285
  65. data/src/main/java/processing/awt/PImageAWT.java +377 -0
  66. data/src/main/java/processing/awt/PShapeJava2D.java +56 -52
  67. data/src/main/java/processing/awt/PSurfaceAWT.java +308 -208
  68. data/src/main/java/processing/awt/ShimAWT.java +581 -0
  69. data/src/main/java/processing/core/PApplet.java +13142 -13883
  70. data/src/main/java/processing/core/PConstants.java +477 -447
  71. data/src/main/java/processing/core/PFont.java +914 -880
  72. data/src/main/java/processing/core/PGraphics.java +152 -136
  73. data/src/main/java/processing/core/PImage.java +275 -372
  74. data/src/main/java/processing/core/PMatrix.java +172 -159
  75. data/src/main/java/processing/core/PMatrix2D.java +478 -415
  76. data/src/main/java/processing/core/PMatrix3D.java +762 -735
  77. data/src/main/java/processing/core/PShape.java +2887 -2651
  78. data/src/main/java/processing/core/PShapeOBJ.java +97 -92
  79. data/src/main/java/processing/core/PShapeSVG.java +1705 -1490
  80. data/src/main/java/processing/core/PStyle.java +40 -37
  81. data/src/main/java/processing/core/PSurface.java +139 -97
  82. data/src/main/java/processing/core/PSurfaceNone.java +296 -218
  83. data/src/main/java/processing/core/PVector.java +995 -963
  84. data/src/main/java/processing/core/ThinkDifferent.java +12 -8
  85. data/src/main/java/processing/data/DoubleDict.java +756 -710
  86. data/src/main/java/processing/data/DoubleList.java +749 -696
  87. data/src/main/java/processing/data/FloatDict.java +748 -702
  88. data/src/main/java/processing/data/FloatList.java +751 -697
  89. data/src/main/java/processing/data/IntDict.java +720 -673
  90. data/src/main/java/processing/data/IntList.java +699 -633
  91. data/src/main/java/processing/data/JSONArray.java +931 -873
  92. data/src/main/java/processing/data/JSONObject.java +1262 -1165
  93. data/src/main/java/processing/data/JSONTokener.java +351 -341
  94. data/src/main/java/processing/data/LongDict.java +710 -663
  95. data/src/main/java/processing/data/LongList.java +701 -635
  96. data/src/main/java/processing/data/Sort.java +37 -41
  97. data/src/main/java/processing/data/StringDict.java +525 -486
  98. data/src/main/java/processing/data/StringList.java +626 -580
  99. data/src/main/java/processing/data/Table.java +3690 -3510
  100. data/src/main/java/processing/data/TableRow.java +182 -183
  101. data/src/main/java/processing/data/XML.java +957 -883
  102. data/src/main/java/processing/event/Event.java +87 -67
  103. data/src/main/java/processing/event/KeyEvent.java +48 -41
  104. data/src/main/java/processing/event/MouseEvent.java +88 -113
  105. data/src/main/java/processing/event/TouchEvent.java +10 -6
  106. data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
  107. data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
  108. data/src/main/java/processing/net/Client.java +20 -20
  109. data/src/main/java/processing/net/Server.java +9 -9
  110. data/src/main/java/processing/opengl/FontTexture.java +286 -266
  111. data/src/main/java/processing/opengl/FrameBuffer.java +389 -377
  112. data/src/main/java/processing/opengl/LinePath.java +132 -89
  113. data/src/main/java/processing/opengl/LineStroker.java +588 -581
  114. data/src/main/java/processing/opengl/PGL.java +660 -567
  115. data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
  116. data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
  117. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
  118. data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
  119. data/src/main/java/processing/opengl/PShader.java +369 -461
  120. data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
  121. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
  122. data/src/main/java/processing/opengl/Texture.java +1492 -1401
  123. data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
  124. data/test/create_test.rb +21 -20
  125. data/test/deglut_spec_test.rb +4 -2
  126. data/test/helper_methods_test.rb +49 -20
  127. data/test/math_tool_test.rb +39 -32
  128. data/test/native_folder.rb +47 -0
  129. data/test/respond_to_test.rb +3 -2
  130. data/test/sketches/key_event.rb +2 -2
  131. data/test/sketches/library/my_library/my_library.rb +3 -0
  132. data/test/test_helper.rb +2 -0
  133. data/test/vecmath_spec_test.rb +35 -22
  134. data/vendors/Rakefile +35 -40
  135. metadata +47 -23
  136. data/library/simplex_noise/simplex_noise.rb +0 -3
  137. data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
  138. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
  139. data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
  140. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +0 -160
@@ -37,7 +37,7 @@ import java.net.*;
37
37
  * goes wrong with the connection, for example the host is not there or is
38
38
  * listening on a different port, an exception is thrown.
39
39
  *
40
- * ( end auto-generated )
40
+ *
41
41
  * @webref net
42
42
  * @brief The client class is used to create client Objects which connect to a server to exchange data.
43
43
  * @instanceName client any variable of type Client
@@ -108,7 +108,7 @@ public class Client implements Runnable {
108
108
  }
109
109
 
110
110
  } catch (IOException e) {
111
- e.printStackTrace();
111
+
112
112
  dispose();
113
113
  }
114
114
  }
@@ -153,7 +153,7 @@ public class Client implements Runnable {
153
153
  * Disconnects from the server. Use to shut the connection when you're
154
154
  * finished with the Client.
155
155
  *
156
- * ( end auto-generated )
156
+ *
157
157
  * @webref client:client
158
158
  * @brief Disconnects from the server
159
159
  * @usage application
@@ -194,7 +194,7 @@ public class Client implements Runnable {
194
194
  input = null;
195
195
  }
196
196
  } catch (Exception e) {
197
- e.printStackTrace();
197
+
198
198
  }
199
199
 
200
200
  try {
@@ -203,7 +203,7 @@ public class Client implements Runnable {
203
203
  output = null;
204
204
  }
205
205
  } catch (Exception e) {
206
- e.printStackTrace();
206
+
207
207
  }
208
208
 
209
209
  try {
@@ -212,7 +212,7 @@ public class Client implements Runnable {
212
212
  socket = null;
213
213
  }
214
214
  } catch (Exception e) {
215
- e.printStackTrace();
215
+
216
216
  }
217
217
  }
218
218
 
@@ -299,7 +299,7 @@ public class Client implements Runnable {
299
299
  }
300
300
  } catch (IOException e) {
301
301
  //errorMessage("run", e);
302
- e.printStackTrace();
302
+
303
303
  }
304
304
  }
305
305
  }
@@ -311,7 +311,7 @@ public class Client implements Runnable {
311
311
  * Returns true if this client is still active and hasn't run
312
312
  * into any trouble.
313
313
  *
314
- * ( end auto-generated )
314
+ *
315
315
  * @webref client:client
316
316
  * @brief Returns true if this client is still active
317
317
  * @usage application
@@ -326,7 +326,7 @@ public class Client implements Runnable {
326
326
  *
327
327
  * Returns the IP address of the computer to which the Client is attached.
328
328
  *
329
- * ( end auto-generated )
329
+ *
330
330
  * @webref client:client
331
331
  * @usage application
332
332
  * @brief Returns the IP address of the machine as a String
@@ -345,7 +345,7 @@ public class Client implements Runnable {
345
345
  * Returns the number of bytes available. When any client has bytes
346
346
  * available from the server, it returns the number of bytes.
347
347
  *
348
- * ( end auto-generated )
348
+ *
349
349
  * @webref client:client
350
350
  * @usage application
351
351
  * @brief Returns the number of bytes in the buffer waiting to be read
@@ -362,7 +362,7 @@ public class Client implements Runnable {
362
362
  *
363
363
  * Empty the buffer, removes all the data stored there.
364
364
  *
365
- * ( end auto-generated )
365
+ *
366
366
  * @webref client:client
367
367
  * @usage application
368
368
  * @brief Clears the buffer
@@ -382,7 +382,7 @@ public class Client implements Runnable {
382
382
  * the buffer. Returns -1 if there is no byte, although this should be
383
383
  * avoided by first cheacking <b>available()</b> to see if any data is available.
384
384
  *
385
- * ( end auto-generated )
385
+ *
386
386
  * @webref client:client
387
387
  * @usage application
388
388
  * @brief Returns a value from the buffer
@@ -407,7 +407,7 @@ public class Client implements Runnable {
407
407
  * Returns the next byte in the buffer as a char. Returns -1 or 0xffff if
408
408
  * nothing is there.
409
409
  *
410
- * ( end auto-generated )
410
+ *
411
411
  * @webref client:client
412
412
  * @usage application
413
413
  * @brief Returns the next byte in the buffer as a char
@@ -431,7 +431,7 @@ public class Client implements Runnable {
431
431
  * of bytes read. If more bytes are available than can fit into the
432
432
  * <b>byteBuffer</b>, only those that fit are read.
433
433
  *
434
- * ( end auto-generated )
434
+ *
435
435
  * <h3>Advanced</h3>
436
436
  * Return a byte array of anything that's in the serial buffer.
437
437
  * Not particularly memory/speed efficient, because it creates
@@ -531,7 +531,7 @@ public class Client implements Runnable {
531
531
  * not large enough, -1 is returned and an error is printed to the message
532
532
  * area. If nothing is in the buffer, 0 is returned.
533
533
  *
534
- * ( end auto-generated )
534
+ *
535
535
  * @webref client:client
536
536
  * @usage application
537
537
  * @brief Reads from the buffer of bytes up to and including a particular character
@@ -623,7 +623,7 @@ public class Client implements Runnable {
623
623
  * representation of your choice (i.e. UTF8 or two-byte Unicode data), and
624
624
  * send it as a byte array.
625
625
  *
626
- * ( end auto-generated )
626
+ *
627
627
  * @webref client:client
628
628
  * @usage application
629
629
  * @brief Returns the buffer as a String
@@ -641,7 +641,7 @@ public class Client implements Runnable {
641
641
  * Combination of <b>readBytesUntil()</b> and <b>readString()</b>. Returns
642
642
  * <b>null</b> if it doesn't find what you're looking for.
643
643
  *
644
- * ( end auto-generated )
644
+ *
645
645
  * <h3>Advanced</h3>
646
646
  * <p/>
647
647
  * If you want to move Unicode data, you can first convert the
@@ -665,7 +665,7 @@ public class Client implements Runnable {
665
665
  *
666
666
  * Writes data to a server specified when constructing the client.
667
667
  *
668
- * ( end auto-generated )
668
+ *
669
669
  * @webref client:client
670
670
  * @usage application
671
671
  * @brief Writes bytes, chars, ints, bytes[], Strings
@@ -681,7 +681,7 @@ public class Client implements Runnable {
681
681
  //e.printStackTrace();
682
682
  //dispose();
683
683
  //disconnect(e);
684
- e.printStackTrace();
684
+
685
685
  stop();
686
686
  }
687
687
  }
@@ -696,7 +696,7 @@ public class Client implements Runnable {
696
696
  //errorMessage("write", e);
697
697
  //e.printStackTrace();
698
698
  //disconnect(e);
699
- e.printStackTrace();
699
+
700
700
  stop();
701
701
  }
702
702
  }
@@ -42,7 +42,7 @@ import java.net.*;
42
42
  * commonly used so be sure to not select one of these. For example, web
43
43
  * servers usually use port 80 and POP mail uses port 110.
44
44
  *
45
- * ( end auto-generated )
45
+ *
46
46
  * @webref net
47
47
  * @usage application
48
48
  * @brief The server class is used to create server objects which send and receives data to and from its associated clients (other programs connected to it).
@@ -119,7 +119,7 @@ public class Server implements Runnable {
119
119
  *
120
120
  * Disconnect a particular client.
121
121
  *
122
- * ( end auto-generated )
122
+ *
123
123
  * @brief Disconnect a particular client.
124
124
  * @webref server:server
125
125
  * @param client the client to disconnect
@@ -191,7 +191,7 @@ public class Server implements Runnable {
191
191
  * Returns true if this server is still active and hasn't run
192
192
  * into any trouble.
193
193
  *
194
- * ( end auto-generated )
194
+ *
195
195
  * @webref server:server
196
196
  * @brief Return true if this server is still active.
197
197
  */
@@ -204,7 +204,7 @@ public class Server implements Runnable {
204
204
  try {
205
205
  return InetAddress.getLocalHost().getHostAddress();
206
206
  } catch (UnknownHostException e) {
207
- e.printStackTrace();
207
+
208
208
  return null;
209
209
  }
210
210
  }
@@ -220,7 +220,7 @@ public class Server implements Runnable {
220
220
  *
221
221
  * Returns the next client in line with a new message.
222
222
  *
223
- * ( end auto-generated )
223
+ *
224
224
  * @brief Returns the next client in line with a new message.
225
225
  * @webref server
226
226
  * @usage application
@@ -258,7 +258,7 @@ public class Server implements Runnable {
258
258
  *
259
259
  * Disconnects all clients and stops the server.
260
260
  *
261
- * ( end auto-generated )
261
+ *
262
262
  * <h3>Advanced</h3>
263
263
  * Use this to shut down the server if you finish using it while your applet
264
264
  * is still running. Otherwise, it will be automatically be shut down by the
@@ -290,7 +290,7 @@ public class Server implements Runnable {
290
290
  server = null;
291
291
  }
292
292
  } catch (IOException e) {
293
- e.printStackTrace();
293
+
294
294
  }
295
295
  }
296
296
 
@@ -324,7 +324,7 @@ public class Server implements Runnable {
324
324
  thread = null;
325
325
  } catch (IOException e) {
326
326
  //errorMessage("run", e);
327
- e.printStackTrace();
327
+
328
328
  thread = null;
329
329
  }
330
330
  }
@@ -337,7 +337,7 @@ public class Server implements Runnable {
337
337
  * Writes a value to all the connected clients. It sends bytes out from the
338
338
  * Server object.
339
339
  *
340
- * ( end auto-generated )
340
+ *
341
341
  * @webref server
342
342
  * @brief Writes data to all connected clients
343
343
  * @param data data to write
@@ -1,3 +1,5 @@
1
+ /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+
1
3
  /*
2
4
  Part of the Processing project - http://processing.org
3
5
 
@@ -18,7 +20,8 @@
18
20
  Public License along with this library; if not, write to the
19
21
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20
22
  Boston, MA 02111-1307 USA
21
- */
23
+ */
24
+
22
25
  package processing.opengl;
23
26
 
24
27
  import processing.core.PApplet;
@@ -30,203 +33,216 @@ import processing.core.PImage;
30
33
  import java.util.HashMap;
31
34
 
32
35
  /**
33
- * All the infrastructure needed for optimized font rendering in OpenGL.
34
- * Basically, this special class is needed because fonts in Processing are
35
- * handled by a separate PImage for each glyph. For performance reasons, all
36
- * these glyphs should be stored in a single OpenGL texture (otherwise,
37
- * rendering a string of text would involve binding and un-binding several
38
- * textures. PFontTexture manages the correspondence between individual glyphs
39
- * and the large OpenGL texture containing them. Also, in the case that the font
40
- * size is very large, one single OpenGL texture might not be enough to store
41
- * all the glyphs, so PFontTexture also takes care of spreading a single font
36
+ * All the infrastructure needed for optimized font rendering
37
+ * in OpenGL. Basically, this special class is needed because
38
+ * fonts in Processing are handled by a separate PImage for each
39
+ * glyph. For performance reasons, all these glyphs should be
40
+ * stored in a single OpenGL texture (otherwise, rendering a
41
+ * string of text would involve binding and un-binding several
42
+ * textures.
43
+ * PFontTexture manages the correspondence between individual
44
+ * glyphs and the large OpenGL texture containing them. Also,
45
+ * in the case that the font size is very large, one single
46
+ * OpenGL texture might not be enough to store all the glyphs,
47
+ * so PFontTexture also takes care of spreading a single font
42
48
  * over several textures.
43
- *
44
49
  * @author Andres Colubri
45
50
  */
46
51
  class FontTexture implements PConstants {
52
+ protected PGL pgl;
53
+ protected boolean is3D;
47
54
 
48
- protected PGL pgl;
49
- protected boolean is3D;
50
-
51
- protected int minSize;
52
- protected int maxSize;
53
- protected int offsetX;
54
- protected int offsetY;
55
- protected int lineHeight;
56
- protected Texture[] textures = null;
57
- protected PImage[] images = null;
58
- protected int lastTex;
59
- protected TextureInfo[] glyphTexinfos;
60
- protected HashMap<PFont.Glyph, TextureInfo> texinfoMap;
61
-
62
- public FontTexture(PGraphicsOpenGL pg, PFont font, boolean is3D) {
63
- pgl = pg.pgl;
64
- this.is3D = is3D;
65
-
66
- initTexture(pg, font);
67
- }
55
+ protected int minSize;
56
+ protected int maxSize;
57
+ protected int offsetX;
58
+ protected int offsetY;
59
+ protected int lineHeight;
60
+ protected Texture[] textures = null;
61
+ protected PImage[] images = null;
62
+ protected int lastTex;
63
+ protected TextureInfo[] glyphTexinfos;
64
+ protected HashMap<PFont.Glyph, TextureInfo> texinfoMap;
68
65
 
69
- protected void allocate() {
70
- // Nothing to do here: the font textures will allocate
71
- // themselves.
72
- }
66
+ public FontTexture(PGraphicsOpenGL pg, PFont font, boolean is3D) {
67
+ pgl = pg.pgl;
68
+ this.is3D = is3D;
73
69
 
74
- protected void dispose() {
75
- for (Texture texture : textures) {
76
- texture.dispose();
77
- }
78
- }
70
+ initTexture(pg, font);
71
+ }
79
72
 
80
- protected void initTexture(PGraphicsOpenGL pg, PFont font) {
81
- lastTex = -1;
82
73
 
83
- int spow = PGL.nextPowerOfTwo(font.getSize());
84
- minSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
85
- PApplet.max(PGL.MIN_FONT_TEX_SIZE, spow));
86
- maxSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
87
- PApplet.max(PGL.MAX_FONT_TEX_SIZE, 2 * spow));
74
+ protected void allocate() {
75
+ // Nothing to do here: the font textures will allocate
76
+ // themselves.
77
+ }
88
78
 
89
- if (maxSize < spow) {
90
- PGraphics.showWarning("The font size is too large to be properly "
91
- + "displayed with OpenGL");
92
- }
93
79
 
94
- addTexture(pg);
80
+ protected void dispose() {
81
+ for (Texture texture : textures) {
82
+ texture.dispose();
83
+ }
84
+ }
95
85
 
96
- offsetX = 0;
97
- offsetY = 0;
98
- lineHeight = 0;
99
86
 
100
- texinfoMap = new HashMap<>();
101
- glyphTexinfos = new TextureInfo[font.getGlyphCount()];
102
- addAllGlyphsToTexture(pg, font);
87
+ protected void initTexture(PGraphicsOpenGL pg, PFont font) {
88
+ lastTex = -1;
89
+
90
+ int spow = PGL.nextPowerOfTwo(font.getSize());
91
+ minSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
92
+ PApplet.max(PGL.MIN_FONT_TEX_SIZE, spow));
93
+ maxSize = PApplet.min(PGraphicsOpenGL.maxTextureSize,
94
+ PApplet.max(PGL.MAX_FONT_TEX_SIZE, 2 * spow));
95
+
96
+ if (maxSize < spow) {
97
+ PGraphics.showWarning("The font size is too large to be properly " +
98
+ "displayed with OpenGL");
103
99
  }
104
100
 
105
- public boolean addTexture(PGraphicsOpenGL pg) {
106
- int w, h;
107
- boolean resize;
108
-
109
- w = maxSize;
110
- if (-1 < lastTex && textures[lastTex].glHeight < maxSize) {
111
- // The height of the current texture is less than the maximum, this
112
- // means we can replace it with a larger texture.
113
- h = PApplet.min(2 * textures[lastTex].glHeight, maxSize);
114
- resize = true;
115
- } else {
116
- h = minSize;
117
- resize = false;
118
- }
101
+ addTexture(pg);
119
102
 
120
- Texture tex;
121
- if (is3D) {
122
- // Bilinear sampling ensures that the texture doesn't look pixelated
123
- // either when it is magnified or minified...
124
- tex = new Texture(pg, w, h,
125
- new Texture.Parameters(ARGB, Texture.BILINEAR, false));
126
- } else {
127
- // ...however, the effect of bilinear sampling is to add some blurriness
128
- // to the text in its original size. In 2D, we assume that text will be
129
- // shown at its original size, so linear sampling is chosen instead (which
130
- // only affects minimized text).
131
- tex = new Texture(pg, w, h,
132
- new Texture.Parameters(ARGB, Texture.LINEAR, false));
133
- }
103
+ offsetX = 0;
104
+ offsetY = 0;
105
+ lineHeight = 0;
106
+
107
+ texinfoMap = new HashMap<>();
108
+ glyphTexinfos = new TextureInfo[font.getGlyphCount()];
109
+ addAllGlyphsToTexture(pg, font);
110
+ }
134
111
 
135
- if (textures == null) {
136
- textures = new Texture[1];
137
- textures[0] = tex;
138
- images = new PImage[1];
139
- images[0] = pg.wrapTexture(tex);
140
- lastTex = 0;
141
- } else if (resize) {
142
- // Replacing old smaller texture with larger one.
143
- // But first we must copy the contents of the older
144
- // texture into the new one.
145
- Texture tex0 = textures[lastTex];
146
- tex.put(tex0);
147
- textures[lastTex] = tex;
148
-
149
- pg.setCache(images[lastTex], tex);
150
- images[lastTex].width = tex.width;
151
- images[lastTex].height = tex.height;
152
- } else {
153
- // Adding new texture to the list.
154
- lastTex = textures.length;
155
- Texture[] tempTex = new Texture[lastTex + 1];
156
- PApplet.arrayCopy(textures, tempTex, textures.length);
157
- tempTex[lastTex] = tex;
158
- textures = tempTex;
159
-
160
- PImage[] tempImg = new PImage[textures.length];
161
- PApplet.arrayCopy(images, tempImg, images.length);
162
- tempImg[lastTex] = pg.wrapTexture(tex);
163
- images = tempImg;
164
- }
165
112
 
166
- // Make sure that the current texture is bound.
167
- tex.bind();
113
+ public boolean addTexture(PGraphicsOpenGL pg) {
114
+ int w, h;
115
+ boolean resize;
168
116
 
169
- return resize;
117
+ w = maxSize;
118
+ if (-1 < lastTex && textures[lastTex].glHeight < maxSize) {
119
+ // The height of the current texture is less than the maximum, this
120
+ // means we can replace it with a larger texture.
121
+ h = PApplet.min(2 * textures[lastTex].glHeight, maxSize);
122
+ resize = true;
123
+ } else {
124
+ h = minSize;
125
+ resize = false;
170
126
  }
171
127
 
172
- public void begin() {
128
+ Texture tex;
129
+ if (is3D) {
130
+ // Bilinear sampling ensures that the texture doesn't look pixelated
131
+ // either when it is magnified or minified...
132
+ tex = new Texture(pg, w, h,
133
+ new Texture.Parameters(ARGB, Texture.BILINEAR, false));
134
+ } else {
135
+ // ...however, the effect of bilinear sampling is to add some blurriness
136
+ // to the text in its original size. In 2D, we assume that text will be
137
+ // shown at its original size, so linear sampling is chosen instead (which
138
+ // only affects minimized text).
139
+ tex = new Texture(pg, w, h,
140
+ new Texture.Parameters(ARGB, Texture.LINEAR, false));
173
141
  }
174
142
 
175
- public void end() {
176
- for (Texture texture : textures) {
177
- pgl.disableTexturing(texture.glTarget);
178
- }
143
+ if (textures == null) {
144
+ textures = new Texture[1];
145
+ textures[0] = tex;
146
+ images = new PImage[1];
147
+ images[0] = pg.wrapTexture(tex);
148
+ lastTex = 0;
149
+ } else if (resize) {
150
+ // Replacing old smaller texture with larger one.
151
+ // But first we must copy the contents of the older
152
+ // texture into the new one.
153
+ Texture tex0 = textures[lastTex];
154
+ tex.put(tex0);
155
+ textures[lastTex] = tex;
156
+
157
+ pg.setCache(images[lastTex], tex);
158
+ images[lastTex].width = tex.width;
159
+ images[lastTex].height = tex.height;
160
+ } else {
161
+ // Adding new texture to the list.
162
+ lastTex = textures.length;
163
+ Texture[] tempTex = new Texture[lastTex + 1];
164
+ PApplet.arrayCopy(textures, tempTex, textures.length);
165
+ tempTex[lastTex] = tex;
166
+ textures = tempTex;
167
+
168
+ PImage[] tempImg = new PImage[textures.length];
169
+ PApplet.arrayCopy(images, tempImg, images.length);
170
+ tempImg[lastTex] = pg.wrapTexture(tex);
171
+ images = tempImg;
179
172
  }
180
173
 
181
- public PImage getTexture(TextureInfo info) {
182
- return images[info.texIndex];
174
+ // Make sure that the current texture is bound.
175
+ tex.bind();
176
+
177
+ return resize;
178
+ }
179
+
180
+
181
+ public void begin() {
182
+ }
183
+
184
+
185
+ public void end() {
186
+ for (Texture texture : textures) {
187
+ pgl.disableTexturing(texture.glTarget);
183
188
  }
189
+ }
184
190
 
185
- // Add all the current glyphs to opengl texture.
186
- public void addAllGlyphsToTexture(PGraphicsOpenGL pg, PFont font) {
187
- // loop over current glyphs.
188
- for (int i = 0; i < font.getGlyphCount(); i++) {
189
- addToTexture(pg, i, font.getGlyph(i));
190
- }
191
+
192
+ public PImage getTexture(TextureInfo info) {
193
+ return images[info.texIndex];
194
+ }
195
+
196
+
197
+ // Add all the current glyphs to opengl texture.
198
+ public void addAllGlyphsToTexture(PGraphicsOpenGL pg, PFont font) {
199
+ // loop over current glyphs.
200
+ for (int i = 0; i < font.getGlyphCount(); i++) {
201
+ addToTexture(pg, i, font.getGlyph(i));
191
202
  }
203
+ }
192
204
 
193
- public void updateGlyphsTexCoords() {
194
- // loop over current glyphs.
195
- for (TextureInfo tinfo : glyphTexinfos) {
196
- if (tinfo != null && tinfo.texIndex == lastTex) {
197
- tinfo.updateUV();
198
- }
205
+
206
+ public void updateGlyphsTexCoords() {
207
+ // loop over current glyphs.
208
+ for (TextureInfo tinfo : glyphTexinfos) {
209
+ if (tinfo != null && tinfo.texIndex == lastTex) {
210
+ tinfo.updateUV();
199
211
  }
200
212
  }
213
+ }
201
214
 
202
- public TextureInfo getTexInfo(PFont.Glyph glyph) {
203
- TextureInfo info = texinfoMap.get(glyph);
204
- return info;
205
- }
206
215
 
207
- public TextureInfo addToTexture(PGraphicsOpenGL pg, PFont.Glyph glyph) {
208
- int n = glyphTexinfos.length;
209
- if (n == 0) {
210
- glyphTexinfos = new TextureInfo[1];
211
- }
212
- addToTexture(pg, n, glyph);
213
- return glyphTexinfos[n];
216
+ public TextureInfo getTexInfo(PFont.Glyph glyph) {
217
+ TextureInfo info = texinfoMap.get(glyph);
218
+ return info;
219
+ }
220
+
221
+
222
+ public TextureInfo addToTexture(PGraphicsOpenGL pg, PFont.Glyph glyph) {
223
+ int n = glyphTexinfos.length;
224
+ if (n == 0) {
225
+ glyphTexinfos = new TextureInfo[1];
214
226
  }
227
+ addToTexture(pg, n, glyph);
228
+ return glyphTexinfos[n];
229
+ }
230
+
215
231
 
216
- public boolean contextIsOutdated() {
217
- boolean outdated = false;
232
+ public boolean contextIsOutdated() {
233
+ boolean outdated = false;
234
+ for (Texture texture : textures) {
235
+ if (texture.contextIsOutdated()) {
236
+ outdated = true;
237
+ }
238
+ }
239
+ if (outdated) {
218
240
  for (Texture texture : textures) {
219
- if (texture.contextIsOutdated()) {
220
- outdated = true;
221
- }
241
+ texture.dispose();
222
242
  }
223
- if (outdated) {
224
- for (Texture texture : textures) {
225
- texture.dispose();
226
- }
227
- }
228
- return outdated;
229
243
  }
244
+ return outdated;
245
+ }
230
246
 
231
247
  // public void draw() {
232
248
  // Texture tex = textures[lastTex];
@@ -234,125 +250,129 @@ class FontTexture implements PConstants {
234
250
  // tex.glWidth, tex.glHeight,
235
251
  // 0, 0, tex.glWidth, tex.glHeight);
236
252
  // }
237
- // Adds this glyph to the opengl texture in PFont.
238
- protected void addToTexture(PGraphicsOpenGL pg, int idx, PFont.Glyph glyph) {
239
- // We add one pixel to avoid issues when sampling the font texture at
240
- // fractional screen positions. I.e.: the pixel on the screen only contains
241
- // half of the font rectangle, so it would sample half of the color from the
242
- // glyph area in the texture, and the other half from the contiguous pixel.
243
- // If the later contains a portion of the neighbor glyph and the former
244
- // doesn't, this would result in a shaded pixel when the correct output is
245
- // blank. This is a consequence of putting all the glyphs in a common
246
- // texture with bilinear sampling.
247
- int w = 1 + glyph.width + 1;
248
- int h = 1 + glyph.height + 1;
249
-
250
- // Converting the pixels array from the PImage into a valid RGBA array for
251
- // OpenGL.
252
- int[] rgba = new int[w * h];
253
- int t = 0;
254
- int p = 0;
255
- if (PGL.BIG_ENDIAN) {
256
- java.util.Arrays.fill(rgba, 0, w, 0xFFFFFF00); // Set the first row to blank pixels.
257
- t = w;
258
- for (int y = 0; y < glyph.height; y++) {
259
- rgba[t++] = 0xFFFFFF00; // Set the leftmost pixel in this row as blank
260
- for (int x = 0; x < glyph.width; x++) {
261
- rgba[t++] = 0xFFFFFF00 | glyph.image.pixels[p++];
262
- }
263
- rgba[t++] = 0xFFFFFF00; // Set the rightmost pixel in this row as blank
264
- }
265
- java.util.Arrays.fill(rgba, (h - 1) * w, h * w, 0xFFFFFF00); // Set the last row to blank pixels.
266
- } else {
267
- java.util.Arrays.fill(rgba, 0, w, 0x00FFFFFF); // Set the first row to blank pixels.
268
- t = w;
269
- for (int y = 0; y < glyph.height; y++) {
270
- rgba[t++] = 0x00FFFFFF; // Set the leftmost pixel in this row as blank
271
- for (int x = 0; x < glyph.width; x++) {
272
- rgba[t++] = (glyph.image.pixels[p++] << 24) | 0x00FFFFFF;
273
- }
274
- rgba[t++] = 0x00FFFFFF; // Set the rightmost pixel in this row as blank
275
- }
276
- java.util.Arrays.fill(rgba, (h - 1) * w, h * w, 0x00FFFFFF); // Set the last row to blank pixels.
277
- }
278
253
 
279
- // Is there room for this glyph in the current line?
280
- if (offsetX + w > textures[lastTex].glWidth) {
281
- // No room, go to the next line:
282
- offsetX = 0;
283
- offsetY += lineHeight;
254
+
255
+ // Adds this glyph to the opengl texture in PFont.
256
+ protected void addToTexture(PGraphicsOpenGL pg, int idx, PFont.Glyph glyph) {
257
+ // We add one pixel to avoid issues when sampling the font texture at
258
+ // fractional screen positions. I.e.: the pixel on the screen only contains
259
+ // half of the font rectangle, so it would sample half of the color from the
260
+ // glyph area in the texture, and the other half from the contiguous pixel.
261
+ // If the later contains a portion of the neighbor glyph and the former
262
+ // doesn't, this would result in a shaded pixel when the correct output is
263
+ // blank. This is a consequence of putting all the glyphs in a common
264
+ // texture with bilinear sampling.
265
+ int w = 1 + glyph.width + 1;
266
+ int h = 1 + glyph.height + 1;
267
+
268
+ // Converting the pixels array from the PImage into a valid RGBA array for
269
+ // OpenGL.
270
+ int[] rgba = new int[w * h];
271
+ int t = 0;
272
+ int p = 0;
273
+ if (PGL.BIG_ENDIAN) {
274
+ java.util.Arrays.fill(rgba, 0, w, 0xFFFFFF00); // Set the first row to blank pixels.
275
+ t = w;
276
+ for (int y = 0; y < glyph.height; y++) {
277
+ rgba[t++] = 0xFFFFFF00; // Set the leftmost pixel in this row as blank
278
+ for (int x = 0; x < glyph.width; x++) {
279
+ rgba[t++] = 0xFFFFFF00 | glyph.image.pixels[p++];
284
280
  }
285
- lineHeight = Math.max(lineHeight, h);
286
-
287
- boolean resized = false;
288
- if (offsetY + lineHeight > textures[lastTex].glHeight) {
289
- // We run out of space in the current texture, so we add a new texture:
290
- resized = addTexture(pg);
291
- if (resized) {
292
- // Because the current texture has been resized, we need to
293
- // update the UV coordinates of all the glyphs associated to it:
294
- updateGlyphsTexCoords();
295
- } else {
296
- // A new texture has been created. Reseting texture coordinates
297
- // and line.
298
- offsetX = 0;
299
- offsetY = 0;
300
- lineHeight = 0;
301
- }
281
+ rgba[t++] = 0xFFFFFF00; // Set the rightmost pixel in this row as blank
282
+ }
283
+ java.util.Arrays.fill(rgba, (h - 1) * w, h * w, 0xFFFFFF00); // Set the last row to blank pixels.
284
+ } else {
285
+ java.util.Arrays.fill(rgba, 0, w, 0x00FFFFFF); // Set the first row to blank pixels.
286
+ t = w;
287
+ for (int y = 0; y < glyph.height; y++) {
288
+ rgba[t++] = 0x00FFFFFF; // Set the leftmost pixel in this row as blank
289
+ for (int x = 0; x < glyph.width; x++) {
290
+ rgba[t++] = (glyph.image.pixels[p++] << 24) | 0x00FFFFFF;
302
291
  }
292
+ rgba[t++] = 0x00FFFFFF; // Set the rightmost pixel in this row as blank
293
+ }
294
+ java.util.Arrays.fill(rgba, (h - 1) * w, h * w, 0x00FFFFFF); // Set the last row to blank pixels.
295
+ }
303
296
 
304
- TextureInfo tinfo = new TextureInfo(lastTex, offsetX, offsetY, w, h, rgba);
305
- offsetX += w;
297
+ // Is there room for this glyph in the current line?
298
+ if (offsetX + w > textures[lastTex].glWidth) {
299
+ // No room, go to the next line:
300
+ offsetX = 0;
301
+ offsetY += lineHeight;
302
+ }
303
+ lineHeight = Math.max(lineHeight, h);
304
+
305
+ boolean resized = false;
306
+ if (offsetY + lineHeight > textures[lastTex].glHeight) {
307
+ // We run out of space in the current texture, so we add a new texture:
308
+ resized = addTexture(pg);
309
+ if (resized) {
310
+ // Because the current texture has been resized, we need to
311
+ // update the UV coordinates of all the glyphs associated to it:
312
+ updateGlyphsTexCoords();
313
+ } else {
314
+ // A new texture has been created. Reseting texture coordinates
315
+ // and line.
316
+ offsetX = 0;
317
+ offsetY = 0;
318
+ lineHeight = 0;
319
+ }
320
+ }
306
321
 
307
- if (idx == glyphTexinfos.length) {
308
- TextureInfo[] temp = new TextureInfo[glyphTexinfos.length + 1];
309
- System.arraycopy(glyphTexinfos, 0, temp, 0, glyphTexinfos.length);
310
- glyphTexinfos = temp;
311
- }
322
+ TextureInfo tinfo = new TextureInfo(lastTex, offsetX, offsetY, w, h, rgba);
323
+ offsetX += w;
312
324
 
313
- glyphTexinfos[idx] = tinfo;
314
- texinfoMap.put(glyph, tinfo);
325
+ if (idx == glyphTexinfos.length) {
326
+ TextureInfo[] temp = new TextureInfo[glyphTexinfos.length + 1];
327
+ System.arraycopy(glyphTexinfos, 0, temp, 0, glyphTexinfos.length);
328
+ glyphTexinfos = temp;
315
329
  }
316
330
 
317
- class TextureInfo {
331
+ glyphTexinfos[idx] = tinfo;
332
+ texinfoMap.put(glyph, tinfo);
333
+ }
334
+
318
335
 
319
- int texIndex;
320
- int width;
321
- int height;
322
- int[] crop;
323
- float u0, u1;
324
- float v0, v1;
325
- int[] pixels;
336
+ class TextureInfo {
337
+ int texIndex;
338
+ int width;
339
+ int height;
340
+ int[] crop;
341
+ float u0, u1;
342
+ float v0, v1;
343
+ int[] pixels;
326
344
 
327
- TextureInfo(int tidx, int cropX, int cropY, int cropW, int cropH,
345
+ TextureInfo(int tidx, int cropX, int cropY, int cropW, int cropH,
328
346
  int[] pix) {
329
- texIndex = tidx;
330
- crop = new int[4];
331
- // The region of the texture corresponding to the glyph is surrounded by a
332
- // 1-pixel wide border to avoid artifacts due to bilinear sampling. This
333
- // is why the additions and subtractions to the crop values.
334
- crop[0] = cropX + 1;
335
- crop[1] = cropY + 1 + cropH - 2;
336
- crop[2] = cropW - 2;
337
- crop[3] = -cropH + 2;
338
- pixels = pix;
339
- updateUV();
340
- updateTex();
341
- }
347
+ texIndex = tidx;
348
+ crop = new int[4];
349
+ // The region of the texture corresponding to the glyph is surrounded by a
350
+ // 1-pixel wide border to avoid artifacts due to bilinear sampling. This
351
+ // is why the additions and subtractions to the crop values.
352
+ crop[0] = cropX + 1;
353
+ crop[1] = cropY + 1 + cropH - 2;
354
+ crop[2] = cropW - 2;
355
+ crop[3] = -cropH + 2;
356
+ pixels = pix;
357
+ updateUV();
358
+ updateTex();
359
+ }
342
360
 
343
- void updateUV() {
344
- width = textures[texIndex].glWidth;
345
- height = textures[texIndex].glHeight;
346
361
 
347
- u0 = (float) crop[0] / (float) width;
348
- u1 = u0 + (float) crop[2] / (float) width;
349
- v0 = (float) (crop[1] + crop[3]) / (float) height;
350
- v1 = v0 - (float) crop[3] / (float) height;
351
- }
362
+ void updateUV() {
363
+ width = textures[texIndex].glWidth;
364
+ height = textures[texIndex].glHeight;
352
365
 
353
- void updateTex() {
354
- textures[texIndex].setNative(pixels, crop[0] - 1, crop[1] + crop[3] - 1,
355
- crop[2] + 2, -crop[3] + 2);
356
- }
366
+ u0 = (float)crop[0] / (float)width;
367
+ u1 = u0 + (float)crop[2] / (float)width;
368
+ v0 = (float)(crop[1] + crop[3]) / (float)height;
369
+ v1 = v0 - (float)crop[3] / (float)height;
370
+ }
371
+
372
+
373
+ void updateTex() {
374
+ textures[texIndex].setNative(pixels, crop[0] - 1, crop[1] + crop[3] - 1,
375
+ crop[2] + 2, -crop[3] + 2);
357
376
  }
377
+ }
358
378
  }