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.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +675 -0
- data/README.md +12 -5
- data/Rakefile +25 -82
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +75 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +44 -0
- data/examples/povmesh/ftest.rb +46 -0
- data/examples/povmesh/tentacle.rb +73 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +91 -32
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.xml +122 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +94 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +34 -0
- 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
|
+
}
|