toxiclibs 0.2-java → 0.5.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -0
  3. data/CHANGELOG.md +4 -0
  4. data/LICENSE +675 -0
  5. data/README.md +12 -5
  6. data/Rakefile +25 -82
  7. data/examples/attract_repel/attract_repel.rb +30 -0
  8. data/examples/attract_repel/attractor.rb +23 -0
  9. data/examples/attract_repel/particle.rb +27 -0
  10. data/examples/data/ti_yong.png +0 -0
  11. data/examples/force_directed/cluster.rb +76 -0
  12. data/examples/force_directed/force_directed_graph.rb +92 -0
  13. data/examples/force_directed/node.rb +26 -0
  14. data/examples/gray_scott_image.rb +75 -0
  15. data/examples/gray_scott_tone_map.rb +77 -0
  16. data/examples/implicit.rb +139 -0
  17. data/examples/inflate_mesh.rb +89 -0
  18. data/examples/model_align.rb +44 -0
  19. data/examples/povmesh/ftest.rb +46 -0
  20. data/examples/povmesh/tentacle.rb +73 -0
  21. data/examples/simple_cluster/cluster.rb +47 -0
  22. data/examples/simple_cluster/node.rb +27 -0
  23. data/examples/simple_cluster/simple_cluster.rb +60 -0
  24. data/examples/soft_body/blanket.rb +45 -0
  25. data/examples/soft_body/connection.rb +16 -0
  26. data/examples/soft_body/particle.rb +22 -0
  27. data/examples/soft_body/soft_body_square_adapted.rb +55 -0
  28. data/lib/toxiclibs.jar +0 -0
  29. data/lib/toxiclibs.rb +91 -32
  30. data/lib/toxiclibs/version.rb +1 -1
  31. data/pom.xml +122 -0
  32. data/src/com/toxi/net/ClientListener.java +41 -0
  33. data/src/com/toxi/net/ServerListener.java +70 -0
  34. data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
  35. data/src/com/toxi/net/ServerState.java +18 -0
  36. data/src/com/toxi/net/UDPConnection.java +66 -0
  37. data/src/com/toxi/net/UDPSyncClient.java +81 -0
  38. data/src/com/toxi/net/UDPSyncServer.java +450 -0
  39. data/src/com/toxi/nio/UDPClient.java +121 -0
  40. data/src/com/toxi/nio/UDPClientState.java +32 -0
  41. data/src/com/toxi/nio/UDPServer.java +129 -0
  42. data/src/toxi/color/AccessCriteria.java +114 -0
  43. data/src/toxi/color/AlphaAccessor.java +67 -0
  44. data/src/toxi/color/CMYKAccessor.java +122 -0
  45. data/src/toxi/color/CMYKDistanceProxy.java +40 -0
  46. data/src/toxi/color/ColorGradient.java +260 -0
  47. data/src/toxi/color/ColorList.java +699 -0
  48. data/src/toxi/color/ColorRange.java +671 -0
  49. data/src/toxi/color/ColorTheme.java +163 -0
  50. data/src/toxi/color/DistanceProxy.java +44 -0
  51. data/src/toxi/color/HSVAccessor.java +113 -0
  52. data/src/toxi/color/HSVDistanceProxy.java +40 -0
  53. data/src/toxi/color/HistEntry.java +85 -0
  54. data/src/toxi/color/Histogram.java +185 -0
  55. data/src/toxi/color/Hue.java +249 -0
  56. data/src/toxi/color/LuminanceAccessor.java +78 -0
  57. data/src/toxi/color/NamedColor.java +935 -0
  58. data/src/toxi/color/ProximityComparator.java +70 -0
  59. data/src/toxi/color/RGBAccessor.java +113 -0
  60. data/src/toxi/color/RGBDistanceProxy.java +41 -0
  61. data/src/toxi/color/ReadonlyTColor.java +296 -0
  62. data/src/toxi/color/TColor.java +1677 -0
  63. data/src/toxi/color/TColorAdapter.java +68 -0
  64. data/src/toxi/color/ToneMap.java +218 -0
  65. data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
  66. data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
  67. data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
  68. data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
  69. data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
  70. data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
  71. data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
  72. data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
  73. data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
  74. data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
  75. data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
  76. data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
  77. data/src/toxi/data/csv/CSVAdapter.java +74 -0
  78. data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
  79. data/src/toxi/data/csv/CSVListener.java +61 -0
  80. data/src/toxi/data/csv/CSVParser.java +202 -0
  81. data/src/toxi/data/feeds/AtomAuthor.java +49 -0
  82. data/src/toxi/data/feeds/AtomContent.java +50 -0
  83. data/src/toxi/data/feeds/AtomEntry.java +111 -0
  84. data/src/toxi/data/feeds/AtomFeed.java +129 -0
  85. data/src/toxi/data/feeds/AtomLink.java +62 -0
  86. data/src/toxi/data/feeds/RSSChannel.java +88 -0
  87. data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
  88. data/src/toxi/data/feeds/RSSFeed.java +99 -0
  89. data/src/toxi/data/feeds/RSSItem.java +104 -0
  90. data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
  91. data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
  92. data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
  93. data/src/toxi/geom/AABB.java +658 -0
  94. data/src/toxi/geom/Axis3D.java +116 -0
  95. data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
  96. data/src/toxi/geom/BernsteinPolynomial.java +94 -0
  97. data/src/toxi/geom/BezierCurve2D.java +159 -0
  98. data/src/toxi/geom/BezierCurve3D.java +148 -0
  99. data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
  100. data/src/toxi/geom/BoxIntersector.java +52 -0
  101. data/src/toxi/geom/Circle.java +230 -0
  102. data/src/toxi/geom/CircleIntersector.java +85 -0
  103. data/src/toxi/geom/Cone.java +150 -0
  104. data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
  105. data/src/toxi/geom/CoordinateExtractor.java +16 -0
  106. data/src/toxi/geom/Ellipse.java +250 -0
  107. data/src/toxi/geom/GMatrix.java +2599 -0
  108. data/src/toxi/geom/GVector.java +833 -0
  109. data/src/toxi/geom/GlobalGridTesselator.java +54 -0
  110. data/src/toxi/geom/GridTesselator.java +108 -0
  111. data/src/toxi/geom/Intersector2D.java +49 -0
  112. data/src/toxi/geom/Intersector3D.java +51 -0
  113. data/src/toxi/geom/IsectData2D.java +103 -0
  114. data/src/toxi/geom/IsectData3D.java +103 -0
  115. data/src/toxi/geom/Line2D.java +534 -0
  116. data/src/toxi/geom/Line3D.java +471 -0
  117. data/src/toxi/geom/LineStrip2D.java +430 -0
  118. data/src/toxi/geom/LineStrip3D.java +230 -0
  119. data/src/toxi/geom/LocalGridTesselator.java +57 -0
  120. data/src/toxi/geom/Matrix3d.java +3048 -0
  121. data/src/toxi/geom/Matrix4f.java +3446 -0
  122. data/src/toxi/geom/Matrix4x4.java +1076 -0
  123. data/src/toxi/geom/MatrixSizeException.java +58 -0
  124. data/src/toxi/geom/OctreeVisitor.java +44 -0
  125. data/src/toxi/geom/Origin3D.java +148 -0
  126. data/src/toxi/geom/Plane.java +293 -0
  127. data/src/toxi/geom/PlaneIntersector.java +57 -0
  128. data/src/toxi/geom/PointCloud3D.java +253 -0
  129. data/src/toxi/geom/PointOctree.java +502 -0
  130. data/src/toxi/geom/PointQuadtree.java +375 -0
  131. data/src/toxi/geom/Polygon2D.java +1038 -0
  132. data/src/toxi/geom/PolygonClipper2D.java +45 -0
  133. data/src/toxi/geom/PolygonTesselator.java +20 -0
  134. data/src/toxi/geom/QuadtreeVisitor.java +44 -0
  135. data/src/toxi/geom/Quaternion.java +641 -0
  136. data/src/toxi/geom/Ray2D.java +146 -0
  137. data/src/toxi/geom/Ray3D.java +150 -0
  138. data/src/toxi/geom/Ray3DIntersector.java +75 -0
  139. data/src/toxi/geom/ReadonlyVec2D.java +575 -0
  140. data/src/toxi/geom/ReadonlyVec3D.java +628 -0
  141. data/src/toxi/geom/ReadonlyVec4D.java +431 -0
  142. data/src/toxi/geom/Rect.java +720 -0
  143. data/src/toxi/geom/Reflector3D.java +58 -0
  144. data/src/toxi/geom/Shape2D.java +94 -0
  145. data/src/toxi/geom/Shape3D.java +42 -0
  146. data/src/toxi/geom/SingularMatrixException.java +57 -0
  147. data/src/toxi/geom/SpatialBins.java +182 -0
  148. data/src/toxi/geom/SpatialIndex.java +61 -0
  149. data/src/toxi/geom/Sphere.java +224 -0
  150. data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
  151. data/src/toxi/geom/Spline2D.java +349 -0
  152. data/src/toxi/geom/Spline3D.java +351 -0
  153. data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
  154. data/src/toxi/geom/Triangle2D.java +422 -0
  155. data/src/toxi/geom/Triangle3D.java +456 -0
  156. data/src/toxi/geom/TriangleIntersector.java +105 -0
  157. data/src/toxi/geom/Vec2D.java +1328 -0
  158. data/src/toxi/geom/Vec3D.java +1832 -0
  159. data/src/toxi/geom/Vec4D.java +985 -0
  160. data/src/toxi/geom/VecMathUtil.java +100 -0
  161. data/src/toxi/geom/XAxisCylinder.java +64 -0
  162. data/src/toxi/geom/YAxisCylinder.java +65 -0
  163. data/src/toxi/geom/ZAxisCylinder.java +64 -0
  164. data/src/toxi/geom/mesh/BezierPatch.java +200 -0
  165. data/src/toxi/geom/mesh/BoxSelector.java +62 -0
  166. data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
  167. data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
  168. data/src/toxi/geom/mesh/Face.java +176 -0
  169. data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
  170. data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
  171. data/src/toxi/geom/mesh/Mesh3D.java +224 -0
  172. data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
  173. data/src/toxi/geom/mesh/OBJWriter.java +194 -0
  174. data/src/toxi/geom/mesh/PLYWriter.java +167 -0
  175. data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
  176. data/src/toxi/geom/mesh/STLColorModel.java +54 -0
  177. data/src/toxi/geom/mesh/STLReader.java +185 -0
  178. data/src/toxi/geom/mesh/STLWriter.java +323 -0
  179. data/src/toxi/geom/mesh/SphereFunction.java +156 -0
  180. data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
  181. data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
  182. data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
  183. data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
  184. data/src/toxi/geom/mesh/Terrain.java +451 -0
  185. data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
  186. data/src/toxi/geom/mesh/Vertex.java +78 -0
  187. data/src/toxi/geom/mesh/VertexSelector.java +193 -0
  188. data/src/toxi/geom/mesh/WEFace.java +100 -0
  189. data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
  190. data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
  191. data/src/toxi/geom/mesh/WEVertex.java +134 -0
  192. data/src/toxi/geom/mesh/WingedEdge.java +115 -0
  193. data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
  194. data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
  195. data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
  196. data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
  197. data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
  198. data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
  199. data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
  200. data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
  201. data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
  202. data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
  203. data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
  204. data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
  205. data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
  206. data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
  207. data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
  208. data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
  209. data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
  210. data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
  211. data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
  212. data/src/toxi/geom/nurbs/ControlNet.java +148 -0
  213. data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
  214. data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
  215. data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
  216. data/src/toxi/geom/nurbs/KnotVector.java +333 -0
  217. data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
  218. data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
  219. data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
  220. data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
  221. data/src/toxi/image/util/Filter8bit.java +331 -0
  222. data/src/toxi/image/util/TiledFrameExporter.java +162 -0
  223. data/src/toxi/math/BezierInterpolation.java +102 -0
  224. data/src/toxi/math/CircularInterpolation.java +88 -0
  225. data/src/toxi/math/CosineInterpolation.java +51 -0
  226. data/src/toxi/math/DecimatedInterpolation.java +77 -0
  227. data/src/toxi/math/ExponentialInterpolation.java +68 -0
  228. data/src/toxi/math/InterpolateStrategy.java +60 -0
  229. data/src/toxi/math/Interpolation2D.java +93 -0
  230. data/src/toxi/math/LinearInterpolation.java +46 -0
  231. data/src/toxi/math/MathUtils.java +990 -0
  232. data/src/toxi/math/NonLinearScaleMap.java +101 -0
  233. data/src/toxi/math/ScaleMap.java +183 -0
  234. data/src/toxi/math/SigmoidInterpolation.java +78 -0
  235. data/src/toxi/math/SinCosLUT.java +141 -0
  236. data/src/toxi/math/ThresholdInterpolation.java +58 -0
  237. data/src/toxi/math/ZoomLensInterpolation.java +126 -0
  238. data/src/toxi/math/conversion/UnitTranslator.java +161 -0
  239. data/src/toxi/math/noise/PerlinNoise.java +281 -0
  240. data/src/toxi/math/noise/SimplexNoise.java +542 -0
  241. data/src/toxi/math/waves/AMFMSineWave.java +143 -0
  242. data/src/toxi/math/waves/AbstractWave.java +248 -0
  243. data/src/toxi/math/waves/ConstantWave.java +48 -0
  244. data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
  245. data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
  246. data/src/toxi/math/waves/FMSineWave.java +142 -0
  247. data/src/toxi/math/waves/FMSquareWave.java +143 -0
  248. data/src/toxi/math/waves/FMTriangleWave.java +126 -0
  249. data/src/toxi/math/waves/SineWave.java +81 -0
  250. data/src/toxi/math/waves/Wave2D.java +68 -0
  251. data/src/toxi/math/waves/WaveState.java +69 -0
  252. data/src/toxi/music/scale/AbstractScale.java +117 -0
  253. data/src/toxi/music/scale/GenericScale.java +66 -0
  254. data/src/toxi/music/scale/MajorScale.java +41 -0
  255. data/src/toxi/newmesh/AttributedEdge.java +106 -0
  256. data/src/toxi/newmesh/AttributedFace.java +63 -0
  257. data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
  258. data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
  259. data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
  260. data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
  261. data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
  262. data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
  263. data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
  264. data/src/toxi/newmesh/SpatialIndex.java +78 -0
  265. data/src/toxi/physics2d/ParticlePath2D.java +100 -0
  266. data/src/toxi/physics2d/ParticleString2D.java +184 -0
  267. data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
  268. data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
  269. data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
  270. data/src/toxi/physics2d/VerletParticle2D.java +457 -0
  271. data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
  272. data/src/toxi/physics2d/VerletSpring2D.java +181 -0
  273. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
  274. data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
  275. data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
  276. data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
  277. data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
  278. data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
  279. data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
  280. data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
  281. data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
  282. data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
  283. data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
  284. data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
  285. data/src/toxi/physics3d/ParticlePath3D.java +100 -0
  286. data/src/toxi/physics3d/ParticleString3D.java +184 -0
  287. data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
  288. data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
  289. data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
  290. data/src/toxi/physics3d/VerletParticle3D.java +385 -0
  291. data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
  292. data/src/toxi/physics3d/VerletSpring3D.java +180 -0
  293. data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
  294. data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
  295. data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
  296. data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
  297. data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
  298. data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
  299. data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
  300. data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
  301. data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
  302. data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
  303. data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
  304. data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
  305. data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
  306. data/src/toxi/processing/ArrowModifier.java +116 -0
  307. data/src/toxi/processing/DashedLineModifier.java +48 -0
  308. data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
  309. data/src/toxi/processing/Line2DRenderModifier.java +18 -0
  310. data/src/toxi/processing/MeshToVBO.java +94 -0
  311. data/src/toxi/processing/NormalMapper.java +18 -0
  312. data/src/toxi/processing/POVInterface.java +121 -0
  313. data/src/toxi/processing/POVMesh.java +219 -0
  314. data/src/toxi/processing/POVWriter.java +460 -0
  315. data/src/toxi/processing/RCOpaque.java +77 -0
  316. data/src/toxi/processing/RCTransp.java +78 -0
  317. data/src/toxi/processing/TextureBuilder.java +232 -0
  318. data/src/toxi/processing/Textures.java +110 -0
  319. data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
  320. data/src/toxi/processing/Tracing.java +25 -0
  321. data/src/toxi/processing/XYZNormalMapper.java +30 -0
  322. data/src/toxi/sim/automata/CAMatrix.java +297 -0
  323. data/src/toxi/sim/automata/CARule.java +76 -0
  324. data/src/toxi/sim/automata/CARule2D.java +354 -0
  325. data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
  326. data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
  327. data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
  328. data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
  329. data/src/toxi/sim/dla/DLA.java +497 -0
  330. data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
  331. data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
  332. data/src/toxi/sim/dla/DLAEventListener.java +57 -0
  333. data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
  334. data/src/toxi/sim/dla/DLAParticle.java +102 -0
  335. data/src/toxi/sim/dla/DLASegment.java +88 -0
  336. data/src/toxi/sim/dla/PipelineOrder.java +50 -0
  337. data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
  338. data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
  339. data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
  340. data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
  341. data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
  342. data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
  343. data/src/toxi/sim/grayscott/GrayScott.java +469 -0
  344. data/src/toxi/util/DateUtils.java +141 -0
  345. data/src/toxi/util/FileSequenceDescriptor.java +181 -0
  346. data/src/toxi/util/FileUtils.java +467 -0
  347. data/src/toxi/util/datatypes/ArraySet.java +128 -0
  348. data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
  349. data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
  350. data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
  351. data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
  352. data/src/toxi/util/datatypes/DoubleRange.java +251 -0
  353. data/src/toxi/util/datatypes/FloatRange.java +251 -0
  354. data/src/toxi/util/datatypes/GenericSet.java +215 -0
  355. data/src/toxi/util/datatypes/IntegerRange.java +247 -0
  356. data/src/toxi/util/datatypes/IntegerSet.java +149 -0
  357. data/src/toxi/util/datatypes/ItemIndex.java +72 -0
  358. data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
  359. data/src/toxi/util/datatypes/TypedProperties.java +291 -0
  360. data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
  361. data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
  362. data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
  363. data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
  364. data/src/toxi/util/events/EventDispatcher.java +86 -0
  365. data/src/toxi/volume/AdditiveBrush.java +19 -0
  366. data/src/toxi/volume/ArrayIsoSurface.java +297 -0
  367. data/src/toxi/volume/BoxBrush.java +100 -0
  368. data/src/toxi/volume/BrushMode.java +16 -0
  369. data/src/toxi/volume/HashIsoSurface.java +354 -0
  370. data/src/toxi/volume/IsoSurface.java +59 -0
  371. data/src/toxi/volume/MarchingCubesIndex.java +312 -0
  372. data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
  373. data/src/toxi/volume/MeshVoxelizer.java +216 -0
  374. data/src/toxi/volume/MultiplyBrush.java +20 -0
  375. data/src/toxi/volume/PeakBrush.java +21 -0
  376. data/src/toxi/volume/ReplaceBrush.java +19 -0
  377. data/src/toxi/volume/RoundBrush.java +113 -0
  378. data/src/toxi/volume/VolumetricBrush.java +160 -0
  379. data/src/toxi/volume/VolumetricHashMap.java +179 -0
  380. data/src/toxi/volume/VolumetricSpace.java +195 -0
  381. data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
  382. data/toxiclibs.gemspec +34 -0
  383. metadata +424 -27
@@ -0,0 +1,141 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.util;
29
+
30
+ import java.text.SimpleDateFormat;
31
+ import java.util.Date;
32
+ import java.util.TimeZone;
33
+
34
+ /**
35
+ * A Simple timestamp generator/formatter with timezone support.
36
+ */
37
+ public class DateUtils {
38
+
39
+ /**
40
+ *
41
+ */
42
+ public static final TimeZone GMT = TimeZone.getTimeZone("GMT");
43
+
44
+ /**
45
+ *
46
+ */
47
+ public static final SimpleDateFormat FORMAT = new SimpleDateFormat(
48
+ "yyyyMMdd-HHmmss");
49
+
50
+ /**
51
+ * Creates a formatted timestamp string of the current datetime using the
52
+ * local host timezone.
53
+ *
54
+ * @return timestamp
55
+ */
56
+ public static final String timeStamp() {
57
+ return timeStamp(new Date(), null);
58
+ }
59
+
60
+ /**
61
+ * Creates a formatted timestamp string of the given date using the local
62
+ * host timezone.
63
+ *
64
+ * @param date
65
+ * @return timestamp
66
+ */
67
+ public static final String timeStamp(Date date) {
68
+ return timeStamp(date, null);
69
+ }
70
+
71
+ /**
72
+ * Creates a formatted timestamp string of the given date using the
73
+ * specified timezone.
74
+ *
75
+ * @param date
76
+ * @param zone
77
+ * @return timestamp
78
+ */
79
+ public static final String timeStamp(Date date, TimeZone zone) {
80
+ if (zone == null) {
81
+ zone = TimeZone.getDefault();
82
+ }
83
+ FORMAT.setTimeZone(zone);
84
+ return FORMAT.format(date);
85
+ }
86
+
87
+ /**
88
+ * Creates a formatted timestamp string of the given epoch using the local
89
+ * host timezone.
90
+ *
91
+ * @param t
92
+ * unix epoch timestamp
93
+ * @return timestamp
94
+ */
95
+ public static final String timeStamp(long t) {
96
+ return timeStamp(new Date(t), null);
97
+ }
98
+
99
+ /**
100
+ * Creates a formatted timestamp string of the given date using the given
101
+ * timezone ID.
102
+ *
103
+ * @see TimeZone#getTimeZone(String)
104
+ *
105
+ * @param zoneID
106
+ * @param date
107
+ * @return timestamp
108
+ */
109
+ public static final String timeStampForZone(String zoneID, Date date) {
110
+ return timeStamp(date, TimeZone.getTimeZone(zoneID));
111
+ }
112
+
113
+ /**
114
+ * Creates a formatted timestamp string of the current date in GMT.
115
+ *
116
+ * @return timestamp
117
+ */
118
+ public static final String timeStampGMT() {
119
+ return timeStamp(new Date(), GMT);
120
+ }
121
+
122
+ /**
123
+ * Creates a formatted timestamp string of the given date in GMT.
124
+ *
125
+ * @param date
126
+ * @return timestamp
127
+ */
128
+ public static final String timeStampGMT(Date date) {
129
+ return timeStamp(date, GMT);
130
+ }
131
+
132
+ /**
133
+ * Creates a formatted timestamp string of the given epoch in GMT.
134
+ *
135
+ * @param t
136
+ * @return timestamp
137
+ */
138
+ public static final String timeStampGMT(long t) {
139
+ return timeStamp(new Date(t), GMT);
140
+ }
141
+ }
@@ -0,0 +1,181 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.util;
29
+
30
+ import java.io.File;
31
+ import java.util.Iterator;
32
+
33
+ /**
34
+ * A descriptor and iterator for handling file sequences.
35
+ */
36
+ public class FileSequenceDescriptor implements Iterable<String> {
37
+
38
+ private class SequenceIterator implements Iterator<String> {
39
+
40
+ private int curr;
41
+ private final int end;
42
+
43
+ public SequenceIterator(int start, int end) {
44
+ this.curr = start;
45
+ this.end = end;
46
+ }
47
+
48
+ @Override
49
+ public boolean hasNext() {
50
+ return curr < end;
51
+ }
52
+
53
+ @Override
54
+ public String next() {
55
+ String path = getPathForIndex(curr);
56
+ curr++;
57
+ return path;
58
+ }
59
+
60
+ @Override
61
+ public void remove() {
62
+ throw new UnsupportedOperationException("remove() not supported");
63
+ }
64
+
65
+ }
66
+
67
+ /**
68
+ *
69
+ */
70
+ public String filePattern;
71
+
72
+ /**
73
+ *
74
+ */
75
+ public String extension;
76
+
77
+ /**
78
+ *
79
+ */
80
+ public int numDigits;
81
+
82
+ /**
83
+ *
84
+ */
85
+ public int start;
86
+
87
+ /**
88
+ *
89
+ */
90
+ public int end = -1;
91
+
92
+ /**
93
+ * Creates a new descriptor from the given sequence details.
94
+ *
95
+ * @param filePattern
96
+ * file pattern in the format: e.g. "path/basename%d04.ext"
97
+ * @param extension
98
+ * file extension (e.g. ".tga")
99
+ * @param numDigits
100
+ * number of digits used for the index
101
+ * @param start
102
+ * start index
103
+ */
104
+ public FileSequenceDescriptor(String filePattern, String extension,
105
+ int numDigits, int start) {
106
+ this.filePattern = filePattern;
107
+ this.extension = extension;
108
+ this.numDigits = numDigits;
109
+ this.start = start;
110
+ }
111
+
112
+ /**
113
+ * Returns the base path of the sequence, i.e. the substring of the
114
+ * sequence's file pattern from the beginning until the first occurence of
115
+ * the % sign indicating the frame numbers.
116
+ *
117
+ * @return path string
118
+ */
119
+ public String getBasePath() {
120
+ return filePattern.substring(0, filePattern.indexOf('%'));
121
+ }
122
+
123
+ /**
124
+ * Calculates sequence duration
125
+ *
126
+ * @return number of files in sequence
127
+ */
128
+ public int getDuration() {
129
+ return getFinalIndex() - start;
130
+ }
131
+
132
+ /**
133
+ * Identifies the index of the last file of the sequence.
134
+ *
135
+ * @return final index
136
+ */
137
+ public int getFinalIndex() {
138
+ if (end == -1) {
139
+ end = start;
140
+ while (true) {
141
+ if (!new File(getPathForIndex(end)).canRead()) {
142
+ break;
143
+ } else {
144
+ end++;
145
+ }
146
+ }
147
+ }
148
+ return end;
149
+ }
150
+
151
+ /**
152
+ * Constructs the file path for the given absolute index
153
+ *
154
+ * @param i
155
+ * index
156
+ * @return path
157
+ */
158
+ public String getPathForIndex(int i) {
159
+ return String.format(filePattern, i);
160
+ }
161
+
162
+ /**
163
+ * Returns the index of the first file of the sequence.
164
+ *
165
+ * @return start index
166
+ */
167
+ public int getStartIndex() {
168
+ return start;
169
+ }
170
+
171
+ /**
172
+ * Creates an iterator providing paths for each file in the sequence. The
173
+ * iterator does not support the remove() method and attempts to use it
174
+ * results in an {@link UnsupportedOperationException} being thrown.
175
+ * @return
176
+ */
177
+ @Override
178
+ public Iterator<String> iterator() {
179
+ return new SequenceIterator(start, getFinalIndex());
180
+ }
181
+ }
@@ -0,0 +1,467 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.util;
29
+
30
+ import java.awt.FileDialog;
31
+ import java.awt.Frame;
32
+ import java.io.BufferedInputStream;
33
+ import java.io.BufferedReader;
34
+ import java.io.BufferedWriter;
35
+ import java.io.ByteArrayOutputStream;
36
+ import java.io.File;
37
+ import java.io.FileInputStream;
38
+ import java.io.FileOutputStream;
39
+ import java.io.FilenameFilter;
40
+ import java.io.IOException;
41
+ import java.io.InputStream;
42
+ import java.io.InputStreamReader;
43
+ import java.io.OutputStream;
44
+ import java.io.OutputStreamWriter;
45
+ import java.io.UnsupportedEncodingException;
46
+ import java.util.zip.GZIPInputStream;
47
+ import java.util.zip.GZIPOutputStream;
48
+
49
+ /**
50
+ * A collection of file handling utilities.
51
+ */
52
+ public class FileUtils {
53
+
54
+ /**
55
+ * {@link FileDialog} constant
56
+ */
57
+ public static final int LOAD = FileDialog.LOAD;
58
+
59
+ /**
60
+ * {@link FileDialog} constant
61
+ */
62
+ public static final int SAVE = FileDialog.SAVE;
63
+
64
+ /**
65
+ * Attempts to create the full path of directories as specified by the given
66
+ * target path. The path is assumed to be a directory, NOT a file in a
67
+ * directory. For the latter, use {@link #createDirectoriesForFile(File)}.
68
+ *
69
+ * @param path
70
+ * @return true, if the operation succeeded
71
+ */
72
+ static public boolean createDirectories(File path) {
73
+ try {
74
+ if (!path.exists()) {
75
+ path.mkdirs();
76
+ }
77
+ return true;
78
+ } catch (SecurityException se) {
79
+ System.err.println("No permissions to create "
80
+ + path.getAbsolutePath());
81
+ }
82
+ return false;
83
+ }
84
+
85
+ /**
86
+ * Attempts to create the full path of directories as specified by the given
87
+ * target file.
88
+ *
89
+ * @param file
90
+ * @return true, if the operation succeeded
91
+ */
92
+ static public boolean createDirectoriesForFile(File file) {
93
+ try {
94
+ String parentName = file.getParent();
95
+ if (parentName != null) {
96
+ File parent = new File(parentName);
97
+ if (!parent.exists()) {
98
+ parent.mkdirs();
99
+ }
100
+ }
101
+ return true;
102
+ } catch (SecurityException se) {
103
+ System.err.println("No permissions to create "
104
+ + file.getAbsolutePath());
105
+ }
106
+ return false;
107
+ }
108
+
109
+ /**
110
+ * Creates an {@link InputStream} for the given file. If the file extension
111
+ * ends with ".gz" the stream is automatically wrapped in a
112
+ * {@link GZIPInputStream} as well.
113
+ *
114
+ * @param file
115
+ * input file
116
+ * @return input stream
117
+ * @throws IOException
118
+ */
119
+ static public InputStream createInputStream(File file) throws IOException {
120
+ if (file == null) {
121
+ throw new IllegalArgumentException("file can't be null");
122
+ }
123
+ InputStream stream = new FileInputStream(file);
124
+ if (file.getName().toLowerCase().endsWith(".gz")) {
125
+ stream = new GZIPInputStream(stream);
126
+ }
127
+ return stream;
128
+ }
129
+
130
+ /**
131
+ * Creates an {@link OutputStream} for the given file. If the file extension
132
+ * ends with ".gz" the stream is automatically wrapped in a
133
+ * {@link GZIPOutputStream} as well. Also attempts to create any
134
+ * intermediate directories for the file using
135
+ * {@link #createDirectoriesForFile(File)}.
136
+ *
137
+ * @param file
138
+ * output file
139
+ * @return output stream
140
+ * @throws IOException
141
+ */
142
+ static public OutputStream createOutputStream(File file) throws IOException {
143
+ if (file == null) {
144
+ throw new IllegalArgumentException("file can't be null");
145
+ }
146
+ createDirectoriesForFile(file);
147
+ OutputStream stream = new FileOutputStream(file);
148
+ if (file.getName().toLowerCase().endsWith(".gz")) {
149
+ stream = new GZIPOutputStream(stream);
150
+ }
151
+ return stream;
152
+ }
153
+
154
+ /**
155
+ * Creates a {@link BufferedReader} for the given file using UTF-8 encoding.
156
+ *
157
+ * @param file
158
+ * @return reader instance
159
+ * @throws IOException
160
+ */
161
+ public static BufferedReader createReader(File file) throws IOException {
162
+ return createReader(createInputStream(file));
163
+ }
164
+
165
+ /**
166
+ * Creates a {@link BufferedReader} for the given {@link InputStream} using
167
+ * UTF-8 encoding.
168
+ *
169
+ * @param input
170
+ * stream
171
+ * @return reader instance
172
+ */
173
+ public static BufferedReader createReader(InputStream input) {
174
+ return createReader(input, "UTF-8");
175
+ }
176
+
177
+ /**
178
+ * Creates a {@link BufferedReader} for the given {@link InputStream} and
179
+ * using the specified encoding.
180
+ *
181
+ * @param input
182
+ * stream
183
+ * @param encoding
184
+ * text encoding to use
185
+ * @return reader instance
186
+ */
187
+ public static BufferedReader createReader(InputStream input, String encoding) {
188
+ InputStreamReader isr = null;
189
+ try {
190
+ isr = new InputStreamReader(input, encoding);
191
+ } catch (UnsupportedEncodingException e) {
192
+ }
193
+ return new BufferedReader(isr, 0x10000);
194
+ }
195
+
196
+ /**
197
+ * Creates a {@link BufferedWriter} for the given file using UTF-8 encoding.
198
+ *
199
+ * @param file
200
+ * @return writer instance
201
+ * @throws IOException
202
+ */
203
+ public static BufferedWriter createWriter(File file) throws IOException {
204
+ return createWriter(createOutputStream(file));
205
+ }
206
+
207
+ /**
208
+ * Creates a {@link BufferedWriter} for the given {@link OutputStream} using
209
+ * UTF-8 encoding.
210
+ *
211
+ * @param out
212
+ * @return writer instance
213
+ */
214
+ public static BufferedWriter createWriter(OutputStream out) {
215
+ return createWriter(out, "UTF-8");
216
+ }
217
+
218
+ /**
219
+ * Creates a {@link BufferedWriter} for the given {@link OutputStream} and
220
+ * using the specified encoding.
221
+ *
222
+ * @param out
223
+ * stream
224
+ * @param encoding
225
+ * text encoding to use
226
+ * @return writer instance
227
+ */
228
+ public static BufferedWriter createWriter(OutputStream out, String encoding) {
229
+ OutputStreamWriter w = null;
230
+ try {
231
+ w = new OutputStreamWriter(out, encoding);
232
+ } catch (UnsupportedEncodingException e) {
233
+ }
234
+ return new BufferedWriter(w, 0x10000);
235
+ }
236
+
237
+ /**
238
+ * <p>
239
+ * Analyses the given file path for a file sequence pattern and returns a
240
+ * {@link FileSequenceDescriptor} instance for further use to handle this
241
+ * sequence. The file pattern should be in one of these formats:
242
+ * </p>
243
+ * <ul>
244
+ * <li>base_path-00001.ext</li>
245
+ * <li>base_path001.ext</li>
246
+ * </ul>
247
+ * <p>
248
+ * The sequence index should be using leading zeros, but the number of
249
+ * digits will be identified automatically.
250
+ * </p>
251
+ *
252
+ * @param path
253
+ * file path of the first file in the sequence
254
+ * @return descriptor, or null, if the path could not be analysed
255
+ */
256
+ public static FileSequenceDescriptor getFileSequenceDescriptorFor(
257
+ String path) {
258
+ int dotIndex = path.lastIndexOf('.');
259
+ int zeroIndex = path.lastIndexOf('-') + 1;
260
+ if (zeroIndex == 0) {
261
+ zeroIndex = dotIndex - 1;
262
+ while (path.charAt(zeroIndex) >= '0'
263
+ && path.charAt(zeroIndex) <= '9') {
264
+ zeroIndex--;
265
+ }
266
+ zeroIndex++;
267
+ }
268
+ int numDigits = dotIndex - zeroIndex;
269
+ if (dotIndex != -1 && numDigits > 0) {
270
+ String base = path.substring(0, zeroIndex);
271
+ String extension = path.substring(dotIndex);
272
+ String filePattern = base + "%0" + numDigits + "d" + extension;
273
+ int start = Integer.parseInt(path.substring(zeroIndex, dotIndex));
274
+ return new FileSequenceDescriptor(filePattern, extension, dotIndex
275
+ - zeroIndex, start);
276
+ } else {
277
+ return null;
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Loads the given {@link InputStream} into a byte array buffer.
283
+ *
284
+ * @param stream
285
+ * @return byte array
286
+ * @throws IOException
287
+ */
288
+ static public byte[] loadBytes(InputStream stream) throws IOException {
289
+ BufferedInputStream input = new BufferedInputStream(stream);
290
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
291
+ int c;
292
+ while ((c = input.read()) != -1) {
293
+ buffer.write(c);
294
+ }
295
+ return buffer.toByteArray();
296
+ }
297
+
298
+ /**
299
+ * Loads the given {@link BufferedReader} as text, line by line into a
300
+ * {@link String}.
301
+ *
302
+ * @param reader
303
+ * @return reader contents as string
304
+ * @throws IOException
305
+ */
306
+ public static String loadText(BufferedReader reader) throws IOException {
307
+ StringBuilder result = new StringBuilder();
308
+ String line;
309
+ while ((line = reader.readLine()) != null) {
310
+ result.append(line).append("\n");
311
+ }
312
+ return result.toString();
313
+ }
314
+
315
+ /**
316
+ * Loads the given {@link InputStream} as text, line by line into a
317
+ * {@link String} using UTF-8 encoding.
318
+ *
319
+ * @param input
320
+ * stream
321
+ * @return stream contents as string
322
+ * @throws IOException
323
+ */
324
+ public static String loadText(InputStream input) throws IOException {
325
+ return loadText(input, "UTF-8");
326
+ }
327
+
328
+ /**
329
+ * Loads the given {@link InputStream} as text, line by line into a
330
+ * {@link String} using the specified encoding.
331
+ *
332
+ * @param input
333
+ * stream
334
+ * @param encoding
335
+ * @return stream contents as single string
336
+ * @throws IOException
337
+ */
338
+ public static String loadText(InputStream input, String encoding)
339
+ throws IOException {
340
+ byte[] raw = loadBytes(input);
341
+ return new String(raw, encoding);
342
+ }
343
+
344
+ /**
345
+ * Saves the given text to the specified {@link BufferedWriter} instance,
346
+ * then closes the writer afterwards.
347
+ *
348
+ * @param writer
349
+ * @param string
350
+ * @throws IOException
351
+ */
352
+ static public void saveText(BufferedWriter writer, String string)
353
+ throws IOException {
354
+ writer.write(string);
355
+ writer.flush();
356
+ writer.close();
357
+ }
358
+
359
+ /**
360
+ * Saves the given text to the specified {@link OutputStream} instance, then
361
+ * closes the underlying writer afterwards.
362
+ *
363
+ * @param output
364
+ * @param string
365
+ * @throws IOException
366
+ */
367
+ static public void saveText(OutputStream output, String string)
368
+ throws IOException {
369
+ saveText(createWriter(output), string);
370
+ }
371
+
372
+ /**
373
+ * Displays a standard AWT file dialog for choosing a folder (no files!).
374
+ *
375
+ * @param frame
376
+ * parent frame
377
+ * @param title
378
+ * dialog title
379
+ * @param path
380
+ * base directory (or null)
381
+ * @return path to chosen directory or null, if user has canceled
382
+ */
383
+ public static String showDirectoryChooser(final Frame frame,
384
+ final String title, String path) {
385
+ System.setProperty("apple.awt.fileDialogForDirectories", "true");
386
+ String result = showFileDialog(frame, title, path, (File dir, String name) -> new File(dir + "/" + name).isDirectory(), LOAD);
387
+ System.setProperty("apple.awt.fileDialogForDirectories", "false");
388
+ return result;
389
+ }
390
+
391
+ /**
392
+ * Displays a standard AWT file dialog for choosing a file for loading or
393
+ * saving.
394
+ *
395
+ * @param frame
396
+ * parent frame
397
+ * @param title
398
+ * dialog title
399
+ * @param path
400
+ * base directory (or null)
401
+ * @param filter
402
+ * a FilenameFilter implementation (or null)
403
+ * @param mode
404
+ * either FileUtils.LOAD or FileUtils.SAVE
405
+ * @return path to chosen file or null, if user has canceled
406
+ */
407
+ public static String showFileDialog(final Frame frame, final String title,
408
+ String path, FilenameFilter filter, final int mode) {
409
+ String fileID = null;
410
+ FileDialog fd = new FileDialog(frame, title, mode);
411
+ if (path != null) {
412
+ fd.setDirectory(path);
413
+ }
414
+ if (filter != null) {
415
+ fd.setFilenameFilter(filter);
416
+ }
417
+ fd.setVisible(true);
418
+ if (fd.getFile() != null) {
419
+ fileID = fd.getFile();
420
+ fileID = fd.getDirectory() + fileID;
421
+ }
422
+ return fileID;
423
+ }
424
+
425
+ /**
426
+ * Displays a standard AWT file dialog for choosing a file for loading or
427
+ * saving.
428
+ *
429
+ * @param frame
430
+ * parent frame
431
+ * @param title
432
+ * dialog title
433
+ * @param path
434
+ * base directory (or null)
435
+ * @param formats
436
+ * an array of allowed file extensions (or null to allow all)
437
+ * @param mode
438
+ * either FileUtils.LOAD or FileUtils.SAVE
439
+ * @return path to chosen file or null, if user has canceled
440
+ */
441
+ public static String showFileDialog(final Frame frame, final String title,
442
+ String path, final String[] formats, final int mode) {
443
+ String fileID = null;
444
+ FileDialog fd = new FileDialog(frame, title, mode);
445
+ if (path != null) {
446
+ fd.setDirectory(path);
447
+ }
448
+ if (formats != null) {
449
+ fd.setFilenameFilter((File dir, String name) -> {
450
+ boolean isAccepted = false;
451
+ for (String ext : formats) {
452
+ if (name.contains(ext)) {
453
+ isAccepted = true;
454
+ break;
455
+ }
456
+ }
457
+ return isAccepted;
458
+ });
459
+ }
460
+ fd.setVisible(true);
461
+ if (fd.getFile() != null) {
462
+ fileID = fd.getFile();
463
+ fileID = fd.getDirectory() + fileID;
464
+ }
465
+ return fileID;
466
+ }
467
+ }