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,1677 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Some classes in this package have been partly inspired by & bits ported from
|
|
3
|
+
* Python code written by Tom De Smedt & Frederik De Bleser for the "colors" library
|
|
4
|
+
* of Nodebox.net.
|
|
5
|
+
*
|
|
6
|
+
* http://nodebox.net/code/index.php/Colors
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
9
|
+
*
|
|
10
|
+
* This library is free software; you can redistribute it and/or
|
|
11
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
12
|
+
* License as published by the Free Software Foundation; either
|
|
13
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
14
|
+
*
|
|
15
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
16
|
+
*
|
|
17
|
+
* This library is distributed in the hope that it will be useful,
|
|
18
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
20
|
+
* Lesser General Public License for more details.
|
|
21
|
+
*
|
|
22
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
23
|
+
* License along with this library; if not, write to the Free Software
|
|
24
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
package toxi.color;
|
|
28
|
+
|
|
29
|
+
import toxi.geom.ReadonlyVec3D;
|
|
30
|
+
import toxi.geom.Vec2D;
|
|
31
|
+
import toxi.geom.Vec3D;
|
|
32
|
+
import toxi.math.MathUtils;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Floating point color class with implicit RGB, HSV, CMYK access modes,
|
|
36
|
+
* conversion and color theory utils. Based on the <a href="">Colors library</a>
|
|
37
|
+
* for <a href="http:/Nodebox.net/">NodeBox</a>
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
public class TColor implements ReadonlyTColor {
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
protected static final float INV60DEGREES = 60.0f / 360;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
*/
|
|
50
|
+
protected static final float INV8BIT = 1f / 255;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
55
|
+
protected static final double EPS = .001;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
*
|
|
59
|
+
*/
|
|
60
|
+
protected static final Vec2D[] RYB_WHEEL = new Vec2D[] {
|
|
61
|
+
new Vec2D(0, 0), new Vec2D(15, 8), new Vec2D(30, 17),
|
|
62
|
+
new Vec2D(45, 26), new Vec2D(60, 34), new Vec2D(75, 41),
|
|
63
|
+
new Vec2D(90, 48), new Vec2D(105, 54), new Vec2D(120, 60),
|
|
64
|
+
new Vec2D(135, 81), new Vec2D(150, 103), new Vec2D(165, 123),
|
|
65
|
+
new Vec2D(180, 138), new Vec2D(195, 155), new Vec2D(210, 171),
|
|
66
|
+
new Vec2D(225, 187), new Vec2D(240, 204), new Vec2D(255, 219),
|
|
67
|
+
new Vec2D(270, 234), new Vec2D(285, 251), new Vec2D(300, 267),
|
|
68
|
+
new Vec2D(315, 282), new Vec2D(330, 298), new Vec2D(345, 329),
|
|
69
|
+
new Vec2D(360, 0)
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Maximum rgb component value for a color to be classified as black.
|
|
74
|
+
*
|
|
75
|
+
* @see #isBlack()
|
|
76
|
+
*/
|
|
77
|
+
public static float BLACK_POINT = 0.08f;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Minimum rgb component value for a color to be classified as white.
|
|
81
|
+
*
|
|
82
|
+
* @see #isWhite()
|
|
83
|
+
*/
|
|
84
|
+
public static float WHITE_POINT = 1f;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Maximum saturations value for a color to be classified as grey
|
|
88
|
+
*
|
|
89
|
+
* @see #isGrey()
|
|
90
|
+
*/
|
|
91
|
+
public static float GREY_THRESHOLD = 0.01f;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
*
|
|
95
|
+
*/
|
|
96
|
+
public static final ReadonlyTColor RED = newRGB(1, 0, 0);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
*/
|
|
101
|
+
public static final ReadonlyTColor GREEN = newRGB(0, 1, 0);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
*/
|
|
106
|
+
public static final ReadonlyTColor BLUE = newRGB(0, 0, 1);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
*
|
|
110
|
+
*/
|
|
111
|
+
public static final ReadonlyTColor CYAN = newRGB(0, 1, 1);
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
*
|
|
115
|
+
*/
|
|
116
|
+
public static final ReadonlyTColor MAGENTA = newRGB(1, 0, 1);
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
*
|
|
120
|
+
*/
|
|
121
|
+
public static final ReadonlyTColor YELLOW = newRGB(1, 1, 0);
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
*
|
|
125
|
+
*/
|
|
126
|
+
public static final ReadonlyTColor BLACK = newRGB(0, 0, 0);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
*/
|
|
131
|
+
public static final ReadonlyTColor WHITE = newRGB(1, 1, 1);
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Converts CMYK floats into an RGB array.
|
|
135
|
+
*
|
|
136
|
+
* @param c
|
|
137
|
+
* @param m
|
|
138
|
+
* @param y
|
|
139
|
+
* @param k
|
|
140
|
+
* @return rgb array
|
|
141
|
+
*/
|
|
142
|
+
public static final float[] cmykToRGB(float c, float m, float y, float k) {
|
|
143
|
+
return cmykToRGB(c, m, y, k, new float[3]);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Converts CMYK floats into the given RGB array.
|
|
148
|
+
*
|
|
149
|
+
* @param c
|
|
150
|
+
* @param m
|
|
151
|
+
* @param y
|
|
152
|
+
* @param k
|
|
153
|
+
* @param rgb
|
|
154
|
+
* @return rgb array
|
|
155
|
+
*/
|
|
156
|
+
public static final float[] cmykToRGB(float c, float m, float y, float k,
|
|
157
|
+
float[] rgb) {
|
|
158
|
+
rgb[0] = 1.0f - MathUtils.min(1.0f, c + k);
|
|
159
|
+
rgb[1] = 1.0f - MathUtils.min(1.0f, m + k);
|
|
160
|
+
rgb[2] = 1.0f - MathUtils.min(1.0f, y + k);
|
|
161
|
+
return rgb;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Converts hex string into a RGB array.
|
|
166
|
+
*
|
|
167
|
+
* @param hexRGB
|
|
168
|
+
* @return rgb array
|
|
169
|
+
*/
|
|
170
|
+
public static final float[] hexToRGB(String hexRGB) {
|
|
171
|
+
return hexToRGB(hexRGB, new float[3]);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
*
|
|
176
|
+
* @param hexRGB
|
|
177
|
+
* @param rgb
|
|
178
|
+
* @return
|
|
179
|
+
*/
|
|
180
|
+
public static final float[] hexToRGB(String hexRGB, float[] rgb) {
|
|
181
|
+
try {
|
|
182
|
+
if (hexRGB.length() > 6) {
|
|
183
|
+
hexRGB = hexRGB.substring(hexRGB.length() - 6);
|
|
184
|
+
}
|
|
185
|
+
int rgbInt = Integer.parseInt(hexRGB, 16);
|
|
186
|
+
rgb[0] = ((rgbInt >> 16) & 0xff) * INV8BIT;
|
|
187
|
+
rgb[1] = ((rgbInt >> 8) & 0xff) * INV8BIT;
|
|
188
|
+
rgb[2] = (rgbInt & 0xff) * INV8BIT;
|
|
189
|
+
} catch (NumberFormatException e) {
|
|
190
|
+
rgb[0] = rgb[1] = rgb[2] = 0;
|
|
191
|
+
}
|
|
192
|
+
return rgb;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Converts HSV values into RGB array.
|
|
197
|
+
*
|
|
198
|
+
* @param h
|
|
199
|
+
* @param s
|
|
200
|
+
* @param v
|
|
201
|
+
* @return rgb array
|
|
202
|
+
*/
|
|
203
|
+
public static final float[] hsvToRGB(float h, float s, float v) {
|
|
204
|
+
return hsvToRGB(h, s, v, new float[3]);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
*
|
|
209
|
+
* @param h
|
|
210
|
+
* @param s
|
|
211
|
+
* @param v
|
|
212
|
+
* @param rgb
|
|
213
|
+
* @return
|
|
214
|
+
*/
|
|
215
|
+
public static final float[] hsvToRGB(float h, float s, float v, float[] rgb) {
|
|
216
|
+
if (Float.compare(s, 0.0f) == 0) {
|
|
217
|
+
rgb[0] = rgb[1] = rgb[2] = v;
|
|
218
|
+
} else {
|
|
219
|
+
h /= INV60DEGREES;
|
|
220
|
+
int i = (int) h;
|
|
221
|
+
float f = h - i;
|
|
222
|
+
float p = v * (1 - s);
|
|
223
|
+
float q = v * (1 - s * f);
|
|
224
|
+
float t = v * (1 - s * (1 - f));
|
|
225
|
+
|
|
226
|
+
if (i == 0) {
|
|
227
|
+
rgb[0] = v;
|
|
228
|
+
rgb[1] = t;
|
|
229
|
+
rgb[2] = p;
|
|
230
|
+
} else if (i == 1) {
|
|
231
|
+
rgb[0] = q;
|
|
232
|
+
rgb[1] = v;
|
|
233
|
+
rgb[2] = p;
|
|
234
|
+
} else if (i == 2) {
|
|
235
|
+
rgb[0] = p;
|
|
236
|
+
rgb[1] = v;
|
|
237
|
+
rgb[2] = t;
|
|
238
|
+
} else if (i == 3) {
|
|
239
|
+
rgb[0] = p;
|
|
240
|
+
rgb[1] = q;
|
|
241
|
+
rgb[2] = v;
|
|
242
|
+
} else if (i == 4) {
|
|
243
|
+
rgb[0] = t;
|
|
244
|
+
rgb[1] = p;
|
|
245
|
+
rgb[2] = v;
|
|
246
|
+
} else {
|
|
247
|
+
rgb[0] = v;
|
|
248
|
+
rgb[1] = p;
|
|
249
|
+
rgb[2] = q;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return rgb;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
*
|
|
257
|
+
* @param l
|
|
258
|
+
* @param a
|
|
259
|
+
* @param b
|
|
260
|
+
* @return
|
|
261
|
+
*/
|
|
262
|
+
public static final float[] labToRGB(float l, float a, float b) {
|
|
263
|
+
return labToRGB(l, a, b, new float[3]);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Converts CIE Lab to RGB components.
|
|
268
|
+
*
|
|
269
|
+
* First we have to convert to XYZ color space. Conversion involves using a
|
|
270
|
+
* white point, in this case D65 which represents daylight illumination.
|
|
271
|
+
*
|
|
272
|
+
* Algorithm adopted from: http://www.easyrgb.com/math.php
|
|
273
|
+
*
|
|
274
|
+
* @param l
|
|
275
|
+
* @param a
|
|
276
|
+
* @param b
|
|
277
|
+
* @param rgb
|
|
278
|
+
* @return rgb array
|
|
279
|
+
*/
|
|
280
|
+
public static final float[] labToRGB(float l, float a, float b, float[] rgb) {
|
|
281
|
+
float y = (l + 16) / 116.0f;
|
|
282
|
+
float x = a / 500.0f + y;
|
|
283
|
+
float z = y - b / 200.0f;
|
|
284
|
+
rgb[0] = x;
|
|
285
|
+
rgb[1] = y;
|
|
286
|
+
rgb[2] = z;
|
|
287
|
+
for (int i = 0; i < 3; i++) {
|
|
288
|
+
float p = (float) Math.pow(rgb[i], 3);
|
|
289
|
+
if (p > 0.008856) {
|
|
290
|
+
rgb[i] = p;
|
|
291
|
+
} else {
|
|
292
|
+
rgb[i] = (rgb[i] - 16 / 116.0f) / 7.787f;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Observer = 2, Illuminant = D65
|
|
297
|
+
x = rgb[0] * 0.95047f;
|
|
298
|
+
y = rgb[1];
|
|
299
|
+
z = rgb[2] * 1.08883f;
|
|
300
|
+
|
|
301
|
+
rgb[0] = x * 3.2406f + y * -1.5372f + z * -0.4986f;
|
|
302
|
+
rgb[1] = x * -0.9689f + y * 1.8758f + z * 0.0415f;
|
|
303
|
+
rgb[2] = x * 0.0557f + y * -0.2040f + z * 1.0570f;
|
|
304
|
+
double tpow = 1 / 2.4;
|
|
305
|
+
for (int i = 0; i < 3; i++) {
|
|
306
|
+
if (rgb[i] > 0.0031308) {
|
|
307
|
+
rgb[i] = (float) (1.055 * Math.pow(rgb[i], tpow) - 0.055);
|
|
308
|
+
} else {
|
|
309
|
+
rgb[i] = 12.92f * rgb[i];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return rgb;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Factory method. Creates new color from ARGB int.
|
|
317
|
+
*
|
|
318
|
+
* @param argb
|
|
319
|
+
* @return new color
|
|
320
|
+
*/
|
|
321
|
+
public static final TColor newARGB(int argb) {
|
|
322
|
+
return newRGBA(((argb >> 16) & 0xff) * INV8BIT, ((argb >> 8) & 0xff)
|
|
323
|
+
* INV8BIT, (argb & 0xff) * INV8BIT, (argb >>> 24) * INV8BIT);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Factory method. Creates new color from CMYK values.
|
|
328
|
+
*
|
|
329
|
+
* @param c
|
|
330
|
+
* @param m
|
|
331
|
+
* @param y
|
|
332
|
+
* @param k
|
|
333
|
+
* @return new color
|
|
334
|
+
*/
|
|
335
|
+
public static final TColor newCMYK(float c, float m, float y, float k) {
|
|
336
|
+
return newCMYKA(c, m, y, k, 1);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Factory method. Creates new color from CMYK + alpha values.
|
|
341
|
+
*
|
|
342
|
+
* @param c
|
|
343
|
+
* @param m
|
|
344
|
+
* @param y
|
|
345
|
+
* @param k
|
|
346
|
+
* @param a
|
|
347
|
+
* @return new color
|
|
348
|
+
*/
|
|
349
|
+
public static final TColor newCMYKA(float c, float m, float y, float k,
|
|
350
|
+
float a) {
|
|
351
|
+
TColor col = new TColor();
|
|
352
|
+
col.setCMYK(new float[] {
|
|
353
|
+
c, m, y, k
|
|
354
|
+
});
|
|
355
|
+
col.alpha = MathUtils.clip(a, 0, 1);
|
|
356
|
+
return col;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Factory method. Creates a new shade of gray with alpha set to 100%.
|
|
361
|
+
*
|
|
362
|
+
* @param gray
|
|
363
|
+
* @return new color.
|
|
364
|
+
*/
|
|
365
|
+
public static final TColor newGray(float gray) {
|
|
366
|
+
return newGrayAlpha(gray, 1);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Factory method. Creates a new shade of gray + alpha.
|
|
371
|
+
*
|
|
372
|
+
* @param gray
|
|
373
|
+
* @param alpha
|
|
374
|
+
* @return new color.
|
|
375
|
+
*/
|
|
376
|
+
public static final TColor newGrayAlpha(float gray, float alpha) {
|
|
377
|
+
TColor c = new TColor();
|
|
378
|
+
c.setRGB(new float[] {
|
|
379
|
+
gray, gray, gray
|
|
380
|
+
});
|
|
381
|
+
c.alpha = alpha;
|
|
382
|
+
return c;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Factory method. Creates a new color from hex string. Supports standard 6
|
|
387
|
+
* digit RGB colors or 8 digit ARGB.
|
|
388
|
+
*
|
|
389
|
+
* @param hexRGB
|
|
390
|
+
* @return new color
|
|
391
|
+
*/
|
|
392
|
+
public static final TColor newHex(String hexRGB) {
|
|
393
|
+
TColor c = new TColor();
|
|
394
|
+
if (hexRGB.length() <= 6) {
|
|
395
|
+
c.setRGB(hexToRGB(hexRGB));
|
|
396
|
+
c.alpha = 1;
|
|
397
|
+
} else if (hexRGB.length() == 8) {
|
|
398
|
+
c.setRGB(hexToRGB(hexRGB));
|
|
399
|
+
c.setAlpha(Integer.parseInt(hexRGB.substring(0, 2), 16) * INV8BIT);
|
|
400
|
+
}
|
|
401
|
+
return c;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Factory method. New color from hsv values.
|
|
406
|
+
*
|
|
407
|
+
* @param h
|
|
408
|
+
* @param s
|
|
409
|
+
* @param v
|
|
410
|
+
* @return new color
|
|
411
|
+
*/
|
|
412
|
+
public static final TColor newHSV(float h, float s, float v) {
|
|
413
|
+
return newHSVA(h, s, v, 1);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
*
|
|
418
|
+
* @param h
|
|
419
|
+
* @param s
|
|
420
|
+
* @param v
|
|
421
|
+
* @return
|
|
422
|
+
*/
|
|
423
|
+
public static ReadonlyTColor newHSV(Hue h, float s, float v) {
|
|
424
|
+
return newHSV(h.getHue(), s, v);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
*
|
|
429
|
+
* @param h
|
|
430
|
+
* @param s
|
|
431
|
+
* @param v
|
|
432
|
+
* @param a
|
|
433
|
+
* @return
|
|
434
|
+
*/
|
|
435
|
+
public static final TColor newHSVA(float h, float s, float v, float a) {
|
|
436
|
+
TColor c = new TColor();
|
|
437
|
+
c.setHSV(h, s, v);
|
|
438
|
+
c.alpha = MathUtils.clip(a, 0, 1);
|
|
439
|
+
return c;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Factory method. Creates new random color. Alpha is always 1.0.
|
|
444
|
+
*
|
|
445
|
+
* @return random color
|
|
446
|
+
*/
|
|
447
|
+
public static final TColor newRandom() {
|
|
448
|
+
return newRGBA(MathUtils.random(1f), MathUtils.random(1f),
|
|
449
|
+
MathUtils.random(1f), 1);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Factory method. Creates new color from RGB values. Alpha is set to 1.0.
|
|
454
|
+
*
|
|
455
|
+
* @param r
|
|
456
|
+
* @param g
|
|
457
|
+
* @param b
|
|
458
|
+
* @return new color
|
|
459
|
+
*/
|
|
460
|
+
public static final TColor newRGB(float r, float g, float b) {
|
|
461
|
+
return newRGBA(r, g, b, 1);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
*
|
|
466
|
+
* @param r
|
|
467
|
+
* @param g
|
|
468
|
+
* @param b
|
|
469
|
+
* @param a
|
|
470
|
+
* @return
|
|
471
|
+
*/
|
|
472
|
+
public static final TColor newRGBA(float r, float g, float b, float a) {
|
|
473
|
+
TColor c = new TColor();
|
|
474
|
+
c.setRGB(new float[] {
|
|
475
|
+
r, g, b
|
|
476
|
+
});
|
|
477
|
+
c.alpha = MathUtils.clip(a, 0, 1);
|
|
478
|
+
return c;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Converts the RGB values into a CMYK array.
|
|
483
|
+
*
|
|
484
|
+
* @param r
|
|
485
|
+
* @param g
|
|
486
|
+
* @param b
|
|
487
|
+
* @return cmyk array
|
|
488
|
+
*/
|
|
489
|
+
public static final float[] rgbToCMYK(float r, float g, float b) {
|
|
490
|
+
return rgbToCMYK(r, g, b, new float[4]);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
*
|
|
495
|
+
* @param r
|
|
496
|
+
* @param g
|
|
497
|
+
* @param b
|
|
498
|
+
* @param cmyk
|
|
499
|
+
* @return
|
|
500
|
+
*/
|
|
501
|
+
public static final float[] rgbToCMYK(float r, float g, float b,
|
|
502
|
+
float[] cmyk) {
|
|
503
|
+
cmyk[0] = 1 - r;
|
|
504
|
+
cmyk[1] = 1 - g;
|
|
505
|
+
cmyk[2] = 1 - b;
|
|
506
|
+
cmyk[3] = MathUtils.min(cmyk[0], cmyk[1], cmyk[2]);
|
|
507
|
+
cmyk[0] = MathUtils.clip(cmyk[0] - cmyk[3], 0, 1);
|
|
508
|
+
cmyk[1] = MathUtils.clip(cmyk[1] - cmyk[3], 0, 1);
|
|
509
|
+
cmyk[2] = MathUtils.clip(cmyk[2] - cmyk[3], 0, 1);
|
|
510
|
+
cmyk[3] = MathUtils.clip(cmyk[3], 0, 1);
|
|
511
|
+
return cmyk;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Formats the RGB float values into hex integers.
|
|
516
|
+
*
|
|
517
|
+
* @param r
|
|
518
|
+
* @param g
|
|
519
|
+
* @param b
|
|
520
|
+
* @return hex string
|
|
521
|
+
*/
|
|
522
|
+
public static final String rgbToHex(float r, float g, float b) {
|
|
523
|
+
String hex = Integer
|
|
524
|
+
.toHexString((int) (MathUtils.clip(r, 0, 1) * 0xff))
|
|
525
|
+
+ Integer.toHexString((int) (MathUtils.clip(g, 0, 1) * 0xff))
|
|
526
|
+
+ Integer.toHexString((int) (MathUtils.clip(b, 0, 1) * 0xff));
|
|
527
|
+
return hex;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Converts the RGB values into an HSV array.
|
|
532
|
+
*
|
|
533
|
+
* @param r
|
|
534
|
+
* @param g
|
|
535
|
+
* @param b
|
|
536
|
+
* @return hsv array
|
|
537
|
+
*/
|
|
538
|
+
public static final float[] rgbToHSV(float r, float g, float b) {
|
|
539
|
+
return rgbToHSV(r, g, b, new float[3]);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
*
|
|
544
|
+
* @param r
|
|
545
|
+
* @param g
|
|
546
|
+
* @param b
|
|
547
|
+
* @param hsv
|
|
548
|
+
* @return
|
|
549
|
+
*/
|
|
550
|
+
public static final float[] rgbToHSV(float r, float g, float b, float[] hsv) {
|
|
551
|
+
float h = 0, s = 0;
|
|
552
|
+
float v = MathUtils.max(r, g, b);
|
|
553
|
+
float d = v - MathUtils.min(r, g, b);
|
|
554
|
+
|
|
555
|
+
if (v != 0.0) {
|
|
556
|
+
s = d / v;
|
|
557
|
+
}
|
|
558
|
+
if (s != 0.0) {
|
|
559
|
+
if (Float.compare(r, v) == 0) {
|
|
560
|
+
h = (g - b) / d;
|
|
561
|
+
} else if (Float.compare(g, v) == 0) {
|
|
562
|
+
h = 2 + (b - r) / d;
|
|
563
|
+
} else {
|
|
564
|
+
h = 4 + (r - g) / d;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
h *= INV60DEGREES;
|
|
569
|
+
|
|
570
|
+
if (h < 0) {
|
|
571
|
+
h += 1.0f;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
hsv[0] = h;
|
|
575
|
+
hsv[1] = s;
|
|
576
|
+
hsv[2] = v;
|
|
577
|
+
return hsv;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
*
|
|
582
|
+
*/
|
|
583
|
+
protected float[] rgb;
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
*
|
|
587
|
+
*/
|
|
588
|
+
protected float[] cmyk;
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
*
|
|
592
|
+
*/
|
|
593
|
+
protected float[] hsv;
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
*
|
|
597
|
+
*/
|
|
598
|
+
public float alpha;
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Only for internal use. Color instances should be created with factory
|
|
602
|
+
* methods.
|
|
603
|
+
*/
|
|
604
|
+
protected TColor() {
|
|
605
|
+
rgb = new float[3];
|
|
606
|
+
hsv = new float[3];
|
|
607
|
+
cmyk = new float[4];
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Creates a deep copy of the given color.
|
|
612
|
+
*
|
|
613
|
+
* @param c
|
|
614
|
+
*/
|
|
615
|
+
public TColor(ReadonlyTColor c) {
|
|
616
|
+
this();
|
|
617
|
+
float[] buffer = c.toCMYKAArray(null);
|
|
618
|
+
cmyk[0] = buffer[0];
|
|
619
|
+
cmyk[1] = buffer[1];
|
|
620
|
+
cmyk[2] = buffer[2];
|
|
621
|
+
cmyk[3] = buffer[3];
|
|
622
|
+
c.toHSVAArray(buffer);
|
|
623
|
+
hsv[0] = buffer[0];
|
|
624
|
+
hsv[1] = buffer[1];
|
|
625
|
+
hsv[2] = buffer[2];
|
|
626
|
+
c.toRGBAArray(buffer);
|
|
627
|
+
rgb[0] = buffer[0];
|
|
628
|
+
rgb[1] = buffer[1];
|
|
629
|
+
rgb[2] = buffer[2];
|
|
630
|
+
this.alpha = c.alpha();
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
*
|
|
635
|
+
* @param c
|
|
636
|
+
* @return
|
|
637
|
+
*/
|
|
638
|
+
public TColor add(TColor c) {
|
|
639
|
+
return copy().addSelf(c);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
*
|
|
644
|
+
* @param c
|
|
645
|
+
* @return
|
|
646
|
+
*/
|
|
647
|
+
public TColor addSelf(TColor c) {
|
|
648
|
+
rgb[0] = MathUtils.min(rgb[0] + c.rgb[0], 1);
|
|
649
|
+
rgb[1] = MathUtils.min(rgb[1] + c.rgb[1], 1);
|
|
650
|
+
rgb[2] = MathUtils.min(rgb[2] + c.rgb[2], 1);
|
|
651
|
+
return setRGB(rgb);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* Changes the brightness of the color by the given amount in the direction
|
|
656
|
+
* towards either the black or white point (depending on if current
|
|
657
|
+
* brightness >= 50%)
|
|
658
|
+
*
|
|
659
|
+
* @param amount
|
|
660
|
+
* @return itself
|
|
661
|
+
*/
|
|
662
|
+
public TColor adjustConstrast(float amount) {
|
|
663
|
+
return hsv[2] < 0.5 ? darken(amount) : lighten(amount);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Adds the given HSV values as offsets to the current color. Hue will
|
|
668
|
+
* automatically wrap.
|
|
669
|
+
*
|
|
670
|
+
* @param h
|
|
671
|
+
* @param s
|
|
672
|
+
* @param v
|
|
673
|
+
* @return itself
|
|
674
|
+
*/
|
|
675
|
+
public TColor adjustHSV(float h, float s, float v) {
|
|
676
|
+
return setHSV(new float[] {
|
|
677
|
+
hsv[0] + h, hsv[1] + s, hsv[2] + v
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/**
|
|
682
|
+
* Adds the given RGB values as offsets to the current color. TColor will
|
|
683
|
+
* clip at black or white.
|
|
684
|
+
*
|
|
685
|
+
* @param r
|
|
686
|
+
* @param g
|
|
687
|
+
* @param b
|
|
688
|
+
* @return itself
|
|
689
|
+
*/
|
|
690
|
+
public TColor adjustRGB(float r, float g, float b) {
|
|
691
|
+
return setRGB(new float[] {
|
|
692
|
+
rgb[0] + r, rgb[1] + g, rgb[2] + b
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/*
|
|
697
|
+
* (non-Javadoc)
|
|
698
|
+
*
|
|
699
|
+
* @see toxi.color.ReadonlyTColor#alpha()
|
|
700
|
+
*/
|
|
701
|
+
@Override
|
|
702
|
+
public float alpha() {
|
|
703
|
+
return alpha;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Rotates this color by a random amount (not exceeding the one specified)
|
|
708
|
+
* and creates variations in saturation and brightness based on the 2nd
|
|
709
|
+
* parameter.
|
|
710
|
+
*
|
|
711
|
+
* @param theta
|
|
712
|
+
* max. rotation angle (in radians)
|
|
713
|
+
* @param delta
|
|
714
|
+
* max. sat/bri variance
|
|
715
|
+
* @return itself
|
|
716
|
+
*/
|
|
717
|
+
public TColor analog(float theta, float delta) {
|
|
718
|
+
return analog((int) MathUtils.degrees(theta), delta);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
*
|
|
723
|
+
* @param angle
|
|
724
|
+
* @param delta
|
|
725
|
+
* @return
|
|
726
|
+
*/
|
|
727
|
+
public TColor analog(int angle, float delta) {
|
|
728
|
+
rotateRYB((int) (angle * MathUtils.normalizedRandom()));
|
|
729
|
+
hsv[1] += delta * MathUtils.normalizedRandom();
|
|
730
|
+
hsv[2] += delta * MathUtils.normalizedRandom();
|
|
731
|
+
return setHSV(hsv);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/*
|
|
735
|
+
* (non-Javadoc)
|
|
736
|
+
*
|
|
737
|
+
* @see toxi.color.ReadonlyTColor#black()
|
|
738
|
+
*/
|
|
739
|
+
@Override
|
|
740
|
+
public float black() {
|
|
741
|
+
return cmyk[3];
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* Blends the color with the given one by the stated amount
|
|
746
|
+
*
|
|
747
|
+
* @param c
|
|
748
|
+
* target color
|
|
749
|
+
* @param t
|
|
750
|
+
* interpolation factor
|
|
751
|
+
* @return itself
|
|
752
|
+
*/
|
|
753
|
+
public TColor blend(ReadonlyTColor c, float t) {
|
|
754
|
+
float[] crgb = c.toRGBAArray(null);
|
|
755
|
+
rgb[0] += (crgb[0] - rgb[0]) * t;
|
|
756
|
+
rgb[1] += (crgb[1] - rgb[1]) * t;
|
|
757
|
+
rgb[2] += (crgb[2] - rgb[2]) * t;
|
|
758
|
+
alpha += (c.alpha() - alpha) * t;
|
|
759
|
+
return setRGB(rgb);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/*
|
|
763
|
+
* (non-Javadoc)
|
|
764
|
+
*
|
|
765
|
+
* @see toxi.color.ReadonlyTColor#blue()
|
|
766
|
+
*/
|
|
767
|
+
@Override
|
|
768
|
+
public float blue() {
|
|
769
|
+
return rgb[2];
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/*
|
|
773
|
+
* (non-Javadoc)
|
|
774
|
+
*
|
|
775
|
+
* @see toxi.color.ReadonlyTColor#brightness()
|
|
776
|
+
*/
|
|
777
|
+
@Override
|
|
778
|
+
public float brightness() {
|
|
779
|
+
return hsv[2];
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* @return ifself, as complementary color
|
|
784
|
+
*/
|
|
785
|
+
public TColor complement() {
|
|
786
|
+
return rotateRYB(180);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
/*
|
|
790
|
+
* (non-Javadoc)
|
|
791
|
+
*
|
|
792
|
+
* @see toxi.color.ReadonlyTColor#copy()
|
|
793
|
+
*/
|
|
794
|
+
@Override
|
|
795
|
+
public TColor copy() {
|
|
796
|
+
return new TColor(this);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/*
|
|
800
|
+
* (non-Javadoc)
|
|
801
|
+
*
|
|
802
|
+
* @see toxi.color.ReadonlyTColor#cyan()
|
|
803
|
+
*/
|
|
804
|
+
@Override
|
|
805
|
+
public float cyan() {
|
|
806
|
+
return cmyk[0];
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* Reduces the color's brightness by the given amount (e.g 0.1 = 10%
|
|
811
|
+
* darker).
|
|
812
|
+
*
|
|
813
|
+
* @param step
|
|
814
|
+
* @return itself
|
|
815
|
+
*/
|
|
816
|
+
public TColor darken(float step) {
|
|
817
|
+
return setBrightness(hsv[2] - step);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Reduced the color's saturation by the given amount.
|
|
822
|
+
*
|
|
823
|
+
* @param step
|
|
824
|
+
* @return itself
|
|
825
|
+
*/
|
|
826
|
+
public TColor desaturate(float step) {
|
|
827
|
+
return setSaturation(hsv[1] - step);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
*
|
|
832
|
+
* @param c
|
|
833
|
+
* @return
|
|
834
|
+
*/
|
|
835
|
+
public TColor differenceTo(TColor c) {
|
|
836
|
+
return TColor.newRGB(MathUtils.abs(rgb[0] - c.rgb[0]),
|
|
837
|
+
MathUtils.abs(rgb[1] - c.rgb[1]),
|
|
838
|
+
MathUtils.abs(rgb[2] - c.rgb[2]));
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
/*
|
|
842
|
+
* (non-Javadoc)
|
|
843
|
+
*
|
|
844
|
+
* @see toxi.color.ReadonlyTColor#distanceToCMYK(toxi.color.TColor)
|
|
845
|
+
*/
|
|
846
|
+
@Override
|
|
847
|
+
public float distanceToCMYK(ReadonlyTColor c) {
|
|
848
|
+
float[] ccmyk = c.toCMYKAArray(null);
|
|
849
|
+
float dc = cmyk[0] - ccmyk[0];
|
|
850
|
+
float dm = cmyk[1] - ccmyk[1];
|
|
851
|
+
float dy = cmyk[2] - ccmyk[2];
|
|
852
|
+
float dk = cmyk[3] - ccmyk[3];
|
|
853
|
+
return (float) Math.sqrt(dc * dc + dm * dm + dy * dy + dk * dk);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/*
|
|
857
|
+
* (non-Javadoc)
|
|
858
|
+
*
|
|
859
|
+
* @see toxi.color.ReadonlyTColor#distanceToHSV(toxi.color.TColor)
|
|
860
|
+
*/
|
|
861
|
+
@Override
|
|
862
|
+
public float distanceToHSV(ReadonlyTColor c) {
|
|
863
|
+
float hue = hsv[0] * MathUtils.TWO_PI;
|
|
864
|
+
float hue2 = c.hue() * MathUtils.TWO_PI;
|
|
865
|
+
ReadonlyVec3D v1 = new Vec3D((MathUtils.cos(hue) * hsv[1]),
|
|
866
|
+
(MathUtils.sin(hue) * hsv[1]), hsv[2]);
|
|
867
|
+
Vec3D v2 = new Vec3D((MathUtils.cos(hue2) * c.saturation()),
|
|
868
|
+
(MathUtils.sin(hue2) * c.saturation()), c.brightness());
|
|
869
|
+
return v1.distanceTo(v2);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/*
|
|
873
|
+
* (non-Javadoc)
|
|
874
|
+
*
|
|
875
|
+
* @see toxi.color.ReadonlyTColor#distanceToRGB(toxi.color.TColor)
|
|
876
|
+
*/
|
|
877
|
+
@Override
|
|
878
|
+
public float distanceToRGB(ReadonlyTColor c) {
|
|
879
|
+
float[] crgb = c.toRGBAArray(null);
|
|
880
|
+
float dr = rgb[0] - crgb[0];
|
|
881
|
+
float dg = rgb[1] - crgb[1];
|
|
882
|
+
float db = rgb[2] - crgb[2];
|
|
883
|
+
return (float) Math.sqrt(dr * dr + dg * dg + db * db);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/**
|
|
887
|
+
*
|
|
888
|
+
* @param o
|
|
889
|
+
* @return
|
|
890
|
+
*/
|
|
891
|
+
@Override
|
|
892
|
+
public boolean equals(Object o) {
|
|
893
|
+
if (o != null && o instanceof TColor) {
|
|
894
|
+
TColor c = (TColor) o;
|
|
895
|
+
float dr = c.rgb[0] - rgb[0];
|
|
896
|
+
float dg = c.rgb[1] - rgb[1];
|
|
897
|
+
float db = c.rgb[2] - rgb[2];
|
|
898
|
+
float da = c.alpha - alpha;
|
|
899
|
+
double d = Math.sqrt(dr * dr + dg * dg + db * db + da * da);
|
|
900
|
+
return d < EPS;
|
|
901
|
+
}
|
|
902
|
+
return false;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
/*
|
|
906
|
+
* (non-Javadoc)
|
|
907
|
+
*
|
|
908
|
+
* @see toxi.color.ReadonlyTColor#getAnalog(float, float)
|
|
909
|
+
*/
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
*
|
|
913
|
+
* @param theta
|
|
914
|
+
* @param delta
|
|
915
|
+
* @return
|
|
916
|
+
*/
|
|
917
|
+
|
|
918
|
+
@Override
|
|
919
|
+
public TColor getAnalog(float theta, float delta) {
|
|
920
|
+
return new TColor(this).analog(theta, delta);
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/*
|
|
924
|
+
* (non-Javadoc)
|
|
925
|
+
*
|
|
926
|
+
* @see toxi.color.ReadonlyTColor#getAnalog(int, float)
|
|
927
|
+
*/
|
|
928
|
+
|
|
929
|
+
/**
|
|
930
|
+
*
|
|
931
|
+
* @param angle
|
|
932
|
+
* @param delta
|
|
933
|
+
* @return
|
|
934
|
+
*/
|
|
935
|
+
|
|
936
|
+
@Override
|
|
937
|
+
public TColor getAnalog(int angle, float delta) {
|
|
938
|
+
return new TColor(this).analog(angle, delta);
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/*
|
|
942
|
+
* (non-Javadoc)
|
|
943
|
+
*
|
|
944
|
+
* @see toxi.color.ReadonlyTColor#getBlended(toxi.color.ReadonlyTColor,
|
|
945
|
+
* float)
|
|
946
|
+
*/
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
*
|
|
950
|
+
* @param c
|
|
951
|
+
* @param t
|
|
952
|
+
* @return
|
|
953
|
+
*/
|
|
954
|
+
|
|
955
|
+
@Override
|
|
956
|
+
public TColor getBlended(ReadonlyTColor c, float t) {
|
|
957
|
+
return new TColor(this).blend(c, t);
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
/*
|
|
961
|
+
* (non-Javadoc)
|
|
962
|
+
*
|
|
963
|
+
* @see toxi.color.ReadonlyTColor#getClosestHue()
|
|
964
|
+
*/
|
|
965
|
+
@Override
|
|
966
|
+
public Hue getClosestHue() {
|
|
967
|
+
return Hue.getClosest(hsv[0], false);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/*
|
|
971
|
+
* (non-Javadoc)
|
|
972
|
+
*
|
|
973
|
+
* @see toxi.color.ReadonlyTColor#getClosestHue(boolean)
|
|
974
|
+
*/
|
|
975
|
+
@Override
|
|
976
|
+
public Hue getClosestHue(boolean primaryOnly) {
|
|
977
|
+
return Hue.getClosest(hsv[0], primaryOnly);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
/*
|
|
981
|
+
* (non-Javadoc)
|
|
982
|
+
*
|
|
983
|
+
* @see toxi.color.ReadonlyTColor#getComplement()
|
|
984
|
+
*/
|
|
985
|
+
|
|
986
|
+
/**
|
|
987
|
+
*
|
|
988
|
+
* @return
|
|
989
|
+
*/
|
|
990
|
+
|
|
991
|
+
@Override
|
|
992
|
+
public TColor getComplement() {
|
|
993
|
+
return new TColor(this).complement();
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
/*
|
|
997
|
+
* (non-Javadoc)
|
|
998
|
+
*
|
|
999
|
+
* @see
|
|
1000
|
+
* toxi.color.ReadonlyTColor#getComponentValue(toxi.color.AccessCriteria)
|
|
1001
|
+
*/
|
|
1002
|
+
|
|
1003
|
+
/**
|
|
1004
|
+
*
|
|
1005
|
+
* @param criteria
|
|
1006
|
+
* @return
|
|
1007
|
+
*/
|
|
1008
|
+
|
|
1009
|
+
@Override
|
|
1010
|
+
public float getComponentValue(AccessCriteria criteria) {
|
|
1011
|
+
return criteria.getComponentValueFor(this);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
/*
|
|
1015
|
+
* (non-Javadoc)
|
|
1016
|
+
*
|
|
1017
|
+
* @see toxi.color.ReadonlyTColor#getDarkened(float)
|
|
1018
|
+
*/
|
|
1019
|
+
@Override
|
|
1020
|
+
public TColor getDarkened(float step) {
|
|
1021
|
+
return new TColor(this).darken(step);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
/*
|
|
1025
|
+
* (non-Javadoc)
|
|
1026
|
+
*
|
|
1027
|
+
* @see toxi.color.ReadonlyTColor#getDesaturated(float)
|
|
1028
|
+
*/
|
|
1029
|
+
@Override
|
|
1030
|
+
public TColor getDesaturated(float step) {
|
|
1031
|
+
return new TColor(this).desaturate(step);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
/**
|
|
1035
|
+
*
|
|
1036
|
+
* @param c
|
|
1037
|
+
* @return
|
|
1038
|
+
*/
|
|
1039
|
+
public TColor getDifferenceTo(TColor c) {
|
|
1040
|
+
return copy().differenceTo(c);
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
/*
|
|
1044
|
+
* (non-Javadoc)
|
|
1045
|
+
*
|
|
1046
|
+
* @see toxi.color.ReadonlyTColor#getInverted()
|
|
1047
|
+
*/
|
|
1048
|
+
@Override
|
|
1049
|
+
public TColor getInverted() {
|
|
1050
|
+
return new TColor(this).invert();
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/*
|
|
1054
|
+
* (non-Javadoc)
|
|
1055
|
+
*
|
|
1056
|
+
* @see toxi.color.ReadonlyTColor#getLightened(float)
|
|
1057
|
+
*/
|
|
1058
|
+
@Override
|
|
1059
|
+
public TColor getLightened(float step) {
|
|
1060
|
+
return new TColor(this).lighten(step);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
/*
|
|
1064
|
+
* (non-Javadoc)
|
|
1065
|
+
*
|
|
1066
|
+
* @see toxi.color.ReadonlyTColor#getRotatedRYB(float)
|
|
1067
|
+
*/
|
|
1068
|
+
@Override
|
|
1069
|
+
public TColor getRotatedRYB(float theta) {
|
|
1070
|
+
return new TColor(this).rotateRYB(theta);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
/*
|
|
1074
|
+
* (non-Javadoc)
|
|
1075
|
+
*
|
|
1076
|
+
* @see toxi.color.ReadonlyTColor#getRotatedRYB(int)
|
|
1077
|
+
*/
|
|
1078
|
+
@Override
|
|
1079
|
+
public TColor getRotatedRYB(int angle) {
|
|
1080
|
+
return new TColor(this).rotateRYB(angle);
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
/*
|
|
1084
|
+
* (non-Javadoc)
|
|
1085
|
+
*
|
|
1086
|
+
* @see toxi.color.ReadonlyTColor#getSaturated(float)
|
|
1087
|
+
*/
|
|
1088
|
+
@Override
|
|
1089
|
+
public TColor getSaturated(float step) {
|
|
1090
|
+
return new TColor(this).saturate(step);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
/*
|
|
1094
|
+
* (non-Javadoc)
|
|
1095
|
+
*
|
|
1096
|
+
* @see toxi.color.ReadonlyTColor#green()
|
|
1097
|
+
*/
|
|
1098
|
+
@Override
|
|
1099
|
+
public float green() {
|
|
1100
|
+
return rgb[1];
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/**
|
|
1104
|
+
*
|
|
1105
|
+
* @return
|
|
1106
|
+
*/
|
|
1107
|
+
@Override
|
|
1108
|
+
public int hashCode() {
|
|
1109
|
+
int hash = 37;
|
|
1110
|
+
hash += 37 * hash + Float.floatToIntBits(rgb[0]);
|
|
1111
|
+
hash += 37 * hash + Float.floatToIntBits(rgb[1]);
|
|
1112
|
+
hash += 37 * hash + Float.floatToIntBits(rgb[2]);
|
|
1113
|
+
hash += 37 * hash + Float.floatToIntBits(alpha);
|
|
1114
|
+
return hash;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
/*
|
|
1118
|
+
* (non-Javadoc)
|
|
1119
|
+
*
|
|
1120
|
+
* @see toxi.color.ReadonlyTColor#hue()
|
|
1121
|
+
*/
|
|
1122
|
+
@Override
|
|
1123
|
+
public float hue() {
|
|
1124
|
+
return hsv[0];
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
/**
|
|
1128
|
+
* Inverts the color.
|
|
1129
|
+
*
|
|
1130
|
+
* @return itself
|
|
1131
|
+
*/
|
|
1132
|
+
public TColor invert() {
|
|
1133
|
+
rgb[0] = 1 - rgb[0];
|
|
1134
|
+
rgb[1] = 1 - rgb[1];
|
|
1135
|
+
rgb[2] = 1 - rgb[2];
|
|
1136
|
+
return setRGB(rgb);
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
/*
|
|
1140
|
+
* (non-Javadoc)
|
|
1141
|
+
*
|
|
1142
|
+
* @see toxi.color.ReadonlyTColor#isBlack()
|
|
1143
|
+
*/
|
|
1144
|
+
@Override
|
|
1145
|
+
public boolean isBlack() {
|
|
1146
|
+
return (rgb[0] <= BLACK_POINT && Float.compare(rgb[0], rgb[1]) == 0 && Float
|
|
1147
|
+
.compare(rgb[0], rgb[2]) == 0);
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/*
|
|
1151
|
+
* (non-Javadoc)
|
|
1152
|
+
*
|
|
1153
|
+
* @see toxi.color.ReadonlyTColor#isGrey()
|
|
1154
|
+
*/
|
|
1155
|
+
@Override
|
|
1156
|
+
public boolean isGrey() {
|
|
1157
|
+
return hsv[1] < GREY_THRESHOLD;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
/*
|
|
1161
|
+
* (non-Javadoc)
|
|
1162
|
+
*
|
|
1163
|
+
* @see toxi.color.ReadonlyTColor#isPrimary()
|
|
1164
|
+
*/
|
|
1165
|
+
@Override
|
|
1166
|
+
public boolean isPrimary() {
|
|
1167
|
+
return Hue.isPrimary(hsv[0]);
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
/*
|
|
1171
|
+
* (non-Javadoc)
|
|
1172
|
+
*
|
|
1173
|
+
* @see toxi.color.ReadonlyTColor#isWhite()
|
|
1174
|
+
*/
|
|
1175
|
+
@Override
|
|
1176
|
+
public boolean isWhite() {
|
|
1177
|
+
return (rgb[0] >= WHITE_POINT && Float.compare(rgb[0], rgb[1]) == 0 && Float
|
|
1178
|
+
.compare(rgb[0], rgb[2]) == 0);
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
/**
|
|
1182
|
+
* Lightens the color by stated amount.
|
|
1183
|
+
*
|
|
1184
|
+
* @param step
|
|
1185
|
+
* lighten amount
|
|
1186
|
+
* @return itself
|
|
1187
|
+
*/
|
|
1188
|
+
public TColor lighten(float step) {
|
|
1189
|
+
return setBrightness(hsv[2] + step);
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
/*
|
|
1193
|
+
* (non-Javadoc)
|
|
1194
|
+
*
|
|
1195
|
+
* @see toxi.color.ReadonlyTColor#luminance()
|
|
1196
|
+
*/
|
|
1197
|
+
@Override
|
|
1198
|
+
public float luminance() {
|
|
1199
|
+
return rgb[0] * 0.299f + rgb[1] * 0.587f + rgb[2] * 0.114f;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/*
|
|
1203
|
+
* (non-Javadoc)
|
|
1204
|
+
*
|
|
1205
|
+
* @see toxi.color.ReadonlyTColor#magenta()
|
|
1206
|
+
*/
|
|
1207
|
+
@Override
|
|
1208
|
+
public float magenta() {
|
|
1209
|
+
return cmyk[1];
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
/*
|
|
1213
|
+
* (non-Javadoc)
|
|
1214
|
+
*
|
|
1215
|
+
* @see toxi.color.ReadonlyTColor#red()
|
|
1216
|
+
*/
|
|
1217
|
+
@Override
|
|
1218
|
+
public float red() {
|
|
1219
|
+
return rgb[0];
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/**
|
|
1223
|
+
*
|
|
1224
|
+
* @param theta
|
|
1225
|
+
* @return
|
|
1226
|
+
*/
|
|
1227
|
+
public TColor rotateRYB(float theta) {
|
|
1228
|
+
return rotateRYB((int) MathUtils.degrees(theta));
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
/**
|
|
1232
|
+
* Rotates the color by x degrees along the <a
|
|
1233
|
+
* href="http://en.wikipedia.org/wiki/RYB_color_model">RYB color wheel</a>
|
|
1234
|
+
*
|
|
1235
|
+
* @param theta
|
|
1236
|
+
* @return itself
|
|
1237
|
+
*/
|
|
1238
|
+
public TColor rotateRYB(int theta) {
|
|
1239
|
+
float h = hsv[0] * 360;
|
|
1240
|
+
theta %= 360;
|
|
1241
|
+
|
|
1242
|
+
float resultHue = 0;
|
|
1243
|
+
for (int i = 0; i < RYB_WHEEL.length - 1; i++) {
|
|
1244
|
+
Vec2D p = RYB_WHEEL[i];
|
|
1245
|
+
Vec2D q = RYB_WHEEL[i + 1];
|
|
1246
|
+
if (q.y < p.y) {
|
|
1247
|
+
q.y += 360;
|
|
1248
|
+
}
|
|
1249
|
+
if (p.y <= h && h <= q.y) {
|
|
1250
|
+
resultHue = p.x + (q.x - p.x) * (h - p.y) / (q.y - p.y);
|
|
1251
|
+
break;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// And the user-given angle (e.g. complement).
|
|
1256
|
+
resultHue = (resultHue + theta) % 360;
|
|
1257
|
+
|
|
1258
|
+
// For the given angle, find out what hue is
|
|
1259
|
+
// located there on the artistic color wheel.
|
|
1260
|
+
for (int i = 0; i < RYB_WHEEL.length - 1; i++) {
|
|
1261
|
+
Vec2D p = RYB_WHEEL[i];
|
|
1262
|
+
Vec2D q = RYB_WHEEL[i + 1];
|
|
1263
|
+
if (q.y < p.y) {
|
|
1264
|
+
q.y += 360;
|
|
1265
|
+
}
|
|
1266
|
+
if (p.x <= resultHue && resultHue <= q.x) {
|
|
1267
|
+
h = p.y + (q.y - p.y) * (resultHue - p.x) / (q.x - p.x);
|
|
1268
|
+
break;
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
hsv[0] = (h % 360) / 360.0f;
|
|
1273
|
+
return setHSV(hsv);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
/**
|
|
1277
|
+
* Adds the given value to the current saturation component.
|
|
1278
|
+
*
|
|
1279
|
+
* @param step
|
|
1280
|
+
* @return itself
|
|
1281
|
+
*/
|
|
1282
|
+
public TColor saturate(float step) {
|
|
1283
|
+
return setSaturation(hsv[1] + step);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
/*
|
|
1287
|
+
* (non-Javadoc)
|
|
1288
|
+
*
|
|
1289
|
+
* @see toxi.color.ReadonlyTColor#saturation()
|
|
1290
|
+
*/
|
|
1291
|
+
@Override
|
|
1292
|
+
public float saturation() {
|
|
1293
|
+
return hsv[1];
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/**
|
|
1297
|
+
*
|
|
1298
|
+
* @param alpha
|
|
1299
|
+
* @return
|
|
1300
|
+
*/
|
|
1301
|
+
public TColor setAlpha(float alpha) {
|
|
1302
|
+
this.alpha = alpha;
|
|
1303
|
+
return this;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
/**
|
|
1307
|
+
* Sets all color components to new values interpreted from the given packed
|
|
1308
|
+
* ARGB 32bit color value.
|
|
1309
|
+
*
|
|
1310
|
+
* @param argb
|
|
1311
|
+
* @return itself
|
|
1312
|
+
*/
|
|
1313
|
+
public TColor setARGB(int argb) {
|
|
1314
|
+
setRGB(((argb >> 16) & 0xff) * INV8BIT, ((argb >> 8) & 0xff) * INV8BIT,
|
|
1315
|
+
(argb & 0xff) * INV8BIT);
|
|
1316
|
+
alpha = (argb >>> 24) * INV8BIT;
|
|
1317
|
+
return this;
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
/**
|
|
1321
|
+
*
|
|
1322
|
+
* @param val
|
|
1323
|
+
* @return
|
|
1324
|
+
*/
|
|
1325
|
+
public TColor setBlack(float val) {
|
|
1326
|
+
cmyk[3] = MathUtils.clip(val, 0f, 1f);
|
|
1327
|
+
cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
|
|
1328
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1329
|
+
return this;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
/**
|
|
1333
|
+
*
|
|
1334
|
+
* @param blue
|
|
1335
|
+
* @return
|
|
1336
|
+
*/
|
|
1337
|
+
public TColor setBlue(float blue) {
|
|
1338
|
+
rgb[2] = MathUtils.clip(blue, 0f, 1f);
|
|
1339
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1340
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1341
|
+
return this;
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
/**
|
|
1345
|
+
*
|
|
1346
|
+
* @param brightness
|
|
1347
|
+
* @return
|
|
1348
|
+
*/
|
|
1349
|
+
public TColor setBrightness(float brightness) {
|
|
1350
|
+
hsv[2] = MathUtils.clip(brightness, 0, 1);
|
|
1351
|
+
hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
|
|
1352
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1353
|
+
return this;
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
/**
|
|
1357
|
+
*
|
|
1358
|
+
* @param c
|
|
1359
|
+
* @param m
|
|
1360
|
+
* @param y
|
|
1361
|
+
* @param k
|
|
1362
|
+
* @return
|
|
1363
|
+
*/
|
|
1364
|
+
public TColor setCMYK(float c, float m, float y, float k) {
|
|
1365
|
+
cmyk[0] = c;
|
|
1366
|
+
cmyk[1] = m;
|
|
1367
|
+
cmyk[2] = y;
|
|
1368
|
+
cmyk[3] = k;
|
|
1369
|
+
return setCMYK(cmyk);
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
/**
|
|
1373
|
+
*
|
|
1374
|
+
* @param newCMYK
|
|
1375
|
+
* @return
|
|
1376
|
+
*/
|
|
1377
|
+
public TColor setCMYK(float[] newCMYK) {
|
|
1378
|
+
cmyk[0] = MathUtils.clip(newCMYK[0], 0, 1);
|
|
1379
|
+
cmyk[1] = MathUtils.clip(newCMYK[1], 0, 1);
|
|
1380
|
+
cmyk[2] = MathUtils.clip(newCMYK[2], 0, 1);
|
|
1381
|
+
cmyk[3] = MathUtils.clip(newCMYK[3], 0, 1);
|
|
1382
|
+
cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
|
|
1383
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1384
|
+
return this;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
/**
|
|
1388
|
+
* Sets a color component by name.
|
|
1389
|
+
*
|
|
1390
|
+
* @param criteria
|
|
1391
|
+
* @param val
|
|
1392
|
+
* @return itself
|
|
1393
|
+
*
|
|
1394
|
+
* @see AccessCriteria
|
|
1395
|
+
*/
|
|
1396
|
+
public TColor setComponent(AccessCriteria criteria, float val) {
|
|
1397
|
+
criteria.setComponentValueFor(this, val);
|
|
1398
|
+
return this;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
/**
|
|
1402
|
+
*
|
|
1403
|
+
* @param val
|
|
1404
|
+
* @return
|
|
1405
|
+
*/
|
|
1406
|
+
public TColor setCyan(float val) {
|
|
1407
|
+
cmyk[0] = MathUtils.clip(val, 0f, 1f);
|
|
1408
|
+
cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
|
|
1409
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1410
|
+
return this;
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
/**
|
|
1414
|
+
*
|
|
1415
|
+
* @param green
|
|
1416
|
+
* @return
|
|
1417
|
+
*/
|
|
1418
|
+
public TColor setGreen(float green) {
|
|
1419
|
+
rgb[1] = MathUtils.clip(green, 0f, 1f);
|
|
1420
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1421
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1422
|
+
return this;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/**
|
|
1426
|
+
*
|
|
1427
|
+
* @param h
|
|
1428
|
+
* @param s
|
|
1429
|
+
* @param v
|
|
1430
|
+
* @return
|
|
1431
|
+
*/
|
|
1432
|
+
public TColor setHSV(float h, float s, float v) {
|
|
1433
|
+
hsv[0] = h;
|
|
1434
|
+
hsv[1] = s;
|
|
1435
|
+
hsv[2] = v;
|
|
1436
|
+
return setHSV(hsv);
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
/**
|
|
1440
|
+
*
|
|
1441
|
+
* @param newHSV
|
|
1442
|
+
* @return
|
|
1443
|
+
*/
|
|
1444
|
+
public TColor setHSV(float[] newHSV) {
|
|
1445
|
+
hsv[0] = newHSV[0] % 1;
|
|
1446
|
+
if (hsv[0] < 0) {
|
|
1447
|
+
hsv[0]++;
|
|
1448
|
+
}
|
|
1449
|
+
hsv[1] = MathUtils.clip(newHSV[1], 0, 1);
|
|
1450
|
+
hsv[2] = MathUtils.clip(newHSV[2], 0, 1);
|
|
1451
|
+
hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
|
|
1452
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1453
|
+
return this;
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
/**
|
|
1457
|
+
*
|
|
1458
|
+
* @param hue
|
|
1459
|
+
* @return
|
|
1460
|
+
*/
|
|
1461
|
+
public TColor setHue(float hue) {
|
|
1462
|
+
hue %= 1.0;
|
|
1463
|
+
if (hue < 0.0) {
|
|
1464
|
+
hue++;
|
|
1465
|
+
}
|
|
1466
|
+
hsv[0] = hue;
|
|
1467
|
+
hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
|
|
1468
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1469
|
+
return this;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
/**
|
|
1473
|
+
*
|
|
1474
|
+
* @param val
|
|
1475
|
+
* @return
|
|
1476
|
+
*/
|
|
1477
|
+
public TColor setMagenta(float val) {
|
|
1478
|
+
cmyk[1] = MathUtils.clip(val, 0f, 1f);
|
|
1479
|
+
cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
|
|
1480
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1481
|
+
return this;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
/**
|
|
1485
|
+
*
|
|
1486
|
+
* @param red
|
|
1487
|
+
* @return
|
|
1488
|
+
*/
|
|
1489
|
+
public TColor setRed(float red) {
|
|
1490
|
+
rgb[0] = MathUtils.clip(red, 0f, 1f);
|
|
1491
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1492
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1493
|
+
return this;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
/**
|
|
1497
|
+
*
|
|
1498
|
+
* @param r
|
|
1499
|
+
* @param g
|
|
1500
|
+
* @param b
|
|
1501
|
+
* @return
|
|
1502
|
+
*/
|
|
1503
|
+
public TColor setRGB(float r, float g, float b) {
|
|
1504
|
+
rgb[0] = r;
|
|
1505
|
+
rgb[1] = g;
|
|
1506
|
+
rgb[2] = b;
|
|
1507
|
+
return setRGB(rgb);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
/**
|
|
1511
|
+
*
|
|
1512
|
+
* @param newRGB
|
|
1513
|
+
* @return
|
|
1514
|
+
*/
|
|
1515
|
+
public TColor setRGB(float[] newRGB) {
|
|
1516
|
+
rgb[0] = MathUtils.clip(newRGB[0], 0, 1);
|
|
1517
|
+
rgb[1] = MathUtils.clip(newRGB[1], 0, 1);
|
|
1518
|
+
rgb[2] = MathUtils.clip(newRGB[2], 0, 1);
|
|
1519
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1520
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1521
|
+
return this;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
/**
|
|
1525
|
+
*
|
|
1526
|
+
* @param saturation
|
|
1527
|
+
* @return
|
|
1528
|
+
*/
|
|
1529
|
+
public TColor setSaturation(float saturation) {
|
|
1530
|
+
hsv[1] = MathUtils.clip(saturation, 0, 1);
|
|
1531
|
+
hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
|
|
1532
|
+
rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
|
|
1533
|
+
return this;
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
/**
|
|
1537
|
+
*
|
|
1538
|
+
* @param val
|
|
1539
|
+
* @return
|
|
1540
|
+
*/
|
|
1541
|
+
public TColor setYellow(float val) {
|
|
1542
|
+
cmyk[2] = MathUtils.clip(val, 0f, 1f);
|
|
1543
|
+
cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
|
|
1544
|
+
rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
|
|
1545
|
+
return this;
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
/**
|
|
1549
|
+
*
|
|
1550
|
+
* @param c
|
|
1551
|
+
* @return
|
|
1552
|
+
*/
|
|
1553
|
+
public TColor sub(TColor c) {
|
|
1554
|
+
return copy().subSelf(c);
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/**
|
|
1558
|
+
*
|
|
1559
|
+
* @param c
|
|
1560
|
+
* @return
|
|
1561
|
+
*/
|
|
1562
|
+
public TColor subSelf(TColor c) {
|
|
1563
|
+
rgb[0] = MathUtils.max(rgb[0] - c.rgb[0], 0);
|
|
1564
|
+
rgb[1] = MathUtils.max(rgb[1] - c.rgb[1], 0);
|
|
1565
|
+
rgb[2] = MathUtils.max(rgb[2] - c.rgb[2], 0);
|
|
1566
|
+
return setRGB(rgb);
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
/*
|
|
1570
|
+
* (non-Javadoc)
|
|
1571
|
+
*
|
|
1572
|
+
* @see toxi.color.ReadonlyTColor#toARGB()
|
|
1573
|
+
*/
|
|
1574
|
+
@Override
|
|
1575
|
+
public int toARGB() {
|
|
1576
|
+
return (int) (rgb[0] * 255) << 16 | (int) (rgb[1] * 255) << 8
|
|
1577
|
+
| (int) (rgb[2] * 255) | (int) (alpha * 255) << 24;
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
/*
|
|
1581
|
+
* (non-Javadoc)
|
|
1582
|
+
*
|
|
1583
|
+
* @see toxi.color.ReadonlyTColor#toCMYKAArray(float[])
|
|
1584
|
+
*/
|
|
1585
|
+
@Override
|
|
1586
|
+
public float[] toCMYKAArray(float[] cmyka) {
|
|
1587
|
+
if (cmyka == null || cmyka.length < 5) {
|
|
1588
|
+
cmyka = new float[5];
|
|
1589
|
+
}
|
|
1590
|
+
cmyka[0] = cmyk[0];
|
|
1591
|
+
cmyka[1] = cmyk[1];
|
|
1592
|
+
cmyka[2] = cmyk[2];
|
|
1593
|
+
cmyka[3] = cmyk[3];
|
|
1594
|
+
cmyka[4] = alpha;
|
|
1595
|
+
return cmyka;
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
/**
|
|
1599
|
+
* Converts the color into a 6 digit hex string.
|
|
1600
|
+
*
|
|
1601
|
+
* @return color as hex
|
|
1602
|
+
*/
|
|
1603
|
+
public String toHex() {
|
|
1604
|
+
String hex = Integer.toHexString(toARGB());
|
|
1605
|
+
if (hex.length() > 6) {
|
|
1606
|
+
hex = hex.substring(2);
|
|
1607
|
+
}
|
|
1608
|
+
return hex;
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
/*
|
|
1612
|
+
* (non-Javadoc)
|
|
1613
|
+
*
|
|
1614
|
+
* @see toxi.color.ReadonlyTColor#toHSVAArray(float[])
|
|
1615
|
+
*/
|
|
1616
|
+
@Override
|
|
1617
|
+
public float[] toHSVAArray(float[] hsva) {
|
|
1618
|
+
if (hsva == null || hsva.length < 4) {
|
|
1619
|
+
hsva = new float[4];
|
|
1620
|
+
}
|
|
1621
|
+
hsva[0] = hsv[0];
|
|
1622
|
+
hsva[1] = hsv[1];
|
|
1623
|
+
hsva[2] = hsv[2];
|
|
1624
|
+
hsva[3] = alpha;
|
|
1625
|
+
return hsva;
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
/*
|
|
1629
|
+
* (non-Javadoc)
|
|
1630
|
+
*
|
|
1631
|
+
* @see toxi.color.ReadonlyTColor#toRGBAArray(float[])
|
|
1632
|
+
*/
|
|
1633
|
+
@Override
|
|
1634
|
+
public float[] toRGBAArray(float[] rgba) {
|
|
1635
|
+
return toRGBAArray(rgba, 0);
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
/*
|
|
1639
|
+
* (non-Javadoc)
|
|
1640
|
+
*
|
|
1641
|
+
* @see toxi.color.ReadonlyTColor#toRGBAArray(float[], int)
|
|
1642
|
+
*/
|
|
1643
|
+
@Override
|
|
1644
|
+
public float[] toRGBAArray(float[] rgba, int offset) {
|
|
1645
|
+
if (rgba == null || rgba.length < offset + 4) {
|
|
1646
|
+
rgba = new float[4];
|
|
1647
|
+
offset = 0;
|
|
1648
|
+
}
|
|
1649
|
+
rgba[offset++] = rgb[0];
|
|
1650
|
+
rgba[offset++] = rgb[1];
|
|
1651
|
+
rgba[offset++] = rgb[2];
|
|
1652
|
+
rgba[offset] = alpha;
|
|
1653
|
+
return rgba;
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
/**
|
|
1657
|
+
*
|
|
1658
|
+
* @return
|
|
1659
|
+
*/
|
|
1660
|
+
@Override
|
|
1661
|
+
public String toString() {
|
|
1662
|
+
return "TColor: rgb: " + rgb[0] + "," + rgb[1] + "," + rgb[2]
|
|
1663
|
+
+ " hsv: " + hsv[0] + "," + hsv[1] + "," + hsv[2] + " cmyk: "
|
|
1664
|
+
+ cmyk[0] + "," + cmyk[1] + "," + cmyk[2] + "," + cmyk[3]
|
|
1665
|
+
+ " alpha: " + alpha;
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
/*
|
|
1669
|
+
* (non-Javadoc)
|
|
1670
|
+
*
|
|
1671
|
+
* @see toxi.color.ReadonlyTColor#yellow()
|
|
1672
|
+
*/
|
|
1673
|
+
@Override
|
|
1674
|
+
public float yellow() {
|
|
1675
|
+
return cmyk[2];
|
|
1676
|
+
}
|
|
1677
|
+
}
|