package main.java.src2.main.java.controlP5.controlP5; /** * controlP5 is a processing gui library. * * 2006-2015 by Andreas Schlegel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA * * @author Andreas Schlegel (http://www.sojamo.de) * @modified ##date## * @version ##version## * */ import java.io.UnsupportedEncodingException; import java.lang.reflect.Array; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.CharacterIterator; import java.text.StringCharacterIterator; import java.util.List; public class CP { /** * borrowed from http://www.javapractices.com/Topic96.cjp * * * @param aURLFragment String * @return String */ static public String forURL( String aURLFragment ) { String result = null; try { result = URLEncoder.encode( aURLFragment , "UTF-8" ); } catch ( UnsupportedEncodingException ex ) { throw new RuntimeException( "UTF-8 not supported" , ex ); } return result; } /** * borrowed from http://www.javapractices.com/Topic96.cjp * * @param aTagFragment String * @return String */ static public String forHTMLTag( String aTagFragment ) { final StringBuffer result = new StringBuffer( ); final StringCharacterIterator iterator = new StringCharacterIterator( aTagFragment ); char character = iterator.current( ); while ( character != CharacterIterator.DONE ) { if ( character == '<' ) { result.append( "<" ); } else if ( character == '>' ) { result.append( ">" ); } else if ( character == '\"' ) { result.append( """ ); } else if ( character == '\'' ) { result.append( "'" ); } else if ( character == '\\' ) { result.append( "\" ); } else if ( character == '&' ) { result.append( "&" ); } else { // the char is not a special one // add it to the result as is result.append( character ); } character = iterator.next( ); } return result.toString( ); } /** * http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Programs;action= * display;num=1159828167;start=0#0 * * @param string String * @return String */ String URLEncode( String string ) { String output = ""; byte[] input = string.getBytes(StandardCharsets.UTF_8); for ( int i = 0 ; i < input.length ; i++ ) { if ( input[ i ] < 0 ) { // output += ('%' + hex(input[i])); // see hex method in // processing } else if ( input[ i ] == 32 ) { output += '+'; } else { output += ( char ) ( input[ i ] ); } } return output; } static public String replace( String theSourceString , String theSearchForString , String theReplaceString ) { if ( theSourceString.length( ) < 1 ) { return ""; } int p = 0; while ( p < theSourceString.length( ) && ( p = theSourceString.indexOf( theSearchForString , p ) ) >= 0 ) { theSourceString = theSourceString.substring( 0 , p ) + theReplaceString + theSourceString.substring( p + theSearchForString.length( )); p += theReplaceString.length( ); } return theSourceString; } /** * convert a hex number into an int * * @param theHex * @return */ static public int parseHex( String theHex ) { int myLen = theHex.length( ); int a , r , b , g; switch ( myLen ) { case ( 8 ): break; case ( 6 ): theHex = "ff" + theHex; break; default: theHex = "ff000000"; break; } a = (Integer.valueOf(Integer.parseInt(theHex.substring(0, 2), 16))).intValue( ); r = (Integer.valueOf(Integer.parseInt(theHex.substring(2, 4), 16))).intValue( ); g = (Integer.valueOf(Integer.parseInt(theHex.substring(4, 6), 16))).intValue( ); b = (Integer.valueOf(Integer.parseInt(theHex.substring(6, 8), 16))).intValue( ); return ( a << 24 | r << 16 | g << 8 | b ); } static public String intToString( int theInt ) { int a = ( ( theInt >> 24 ) & 0xff ); int r = ( ( theInt >> 16 ) & 0xff ); int g = ( ( theInt >> 8 ) & 0xff ); int b = ( ( theInt >> 0 ) & 0xff ); String sa = ( ( Integer.toHexString( a ) ).length( ) == 1 ) ? "0" + Integer.toHexString( a ) : Integer.toHexString( a ); String sr = ( ( Integer.toHexString( r ) ).length( ) == 1 ) ? "0" + Integer.toHexString( r ) : Integer.toHexString( r ); String sg = ( ( Integer.toHexString( g ) ).length( ) == 1 ) ? "0" + Integer.toHexString( g ) : Integer.toHexString( g ); String sb = ( ( Integer.toHexString( b ) ).length( ) == 1 ) ? "0" + Integer.toHexString( b ) : Integer.toHexString( b ); return sa + sr + sg + sb; } /** * @deprecated */ @Deprecated protected boolean save( ControlP5 theControlP5 , String theFilePath ) { ControlP5.logger( ).info( "Saving ControlP5 settings in XML format has been removed, have a look at controlP5's properties instead." ); return false; } /** * * Convenience method for producing a simple textual representation of an array. * *
* The format of the returned String
is the same as
* AbstractCollection.toString
:
*
aArray
is a possibly-null array whose elements are primitives or objects; arrays
* of arrays are also valid, in which case aArray
is rendered in a nested,
* recursive fashion.
*
* @author Jerome Lacoste
* @author www.javapractices.com
*/
static public String arrayToString( Object aArray ) {
if ( aArray == null ) {
return fNULL;
}
checkObjectIsArray( aArray );
StringBuilder result = new StringBuilder( fSTART_CHAR );
int length = Array.getLength( aArray );
for ( int idx = 0 ; idx < length ; ++idx ) {
Object item = Array.get( aArray , idx );
if ( isNonNullArray( item ) ) {
// recursive call!
result.append( arrayToString( item ) );
} else {
result.append( item );
}
if ( !isLastItem( idx , length ) ) {
result.append( fSEPARATOR );
}
}
result.append( fEND_CHAR );
return result.toString( );
}
// PRIVATE //
private static final String fSTART_CHAR = "[";
private static final String fEND_CHAR = "]";
private static final String fSEPARATOR = ", ";
private static final String fNULL = "null";
private static void checkObjectIsArray( Object aArray ) {
if ( !aArray.getClass( ).isArray( ) ) {
throw new IllegalArgumentException( "Object is not an array." );
}
}
private static boolean isNonNullArray( Object aItem ) {
return aItem != null && aItem.getClass( ).isArray( );
}
private static boolean isLastItem( int aIdx , int aLength ) {
return ( aIdx == aLength - 1 );
}
protected static String formatGetClass( Class< ? > c ) {
if ( c == null )
return null;
final String pattern = "class ";
return c.toString( ).startsWith( pattern ) ? c.toString( ).substring( pattern.length( ) ) : c.toString( );
}
static public boolean inside( int[] theRect , float theX , float theY ) {
if ( theRect.length == 4 ) {
return ( theX > theRect[ 0 ] && theX < theRect[ 2 ] && theY > theRect[ 1 ] && theY < theRect[ 3 ] );
} else {
return false;
}
}
/* Base64 static methods to encode and decode
* bytes into a String and back
*
* from
* http://examples.oreilly.com/javacrypt/files/oreilly/jonathan/util/
* http://oreilly.com/catalog/javacrypt/chapter/ch06.html */
static public String encodeBase64( byte[] raw ) {
StringBuffer encoded = new StringBuffer( );
for ( int i = 0 ; i < raw.length ; i += 3 ) {
encoded.append( encodeBlock( raw , i ) );
}
return encoded.toString( );
}
protected static char[] encodeBlock( byte[] raw , int offset ) {
int block = 0;
int slack = raw.length - offset - 1;
int end = ( slack >= 2 ) ? 2 : slack;
for ( int i = 0 ; i <= end ; i++ ) {
byte b = raw[ offset + i ];
int neuter = ( b < 0 ) ? b + 256 : b;
block += neuter << ( 8 * ( 2 - i ) );
}
char[] base64 = new char[ 4 ];
for ( int i = 0 ; i < 4 ; i++ ) {
int sixbit = ( block >>> ( 6 * ( 3 - i ) ) ) & 0x3f;
base64[ i ] = getBase64Char( sixbit );
}
if ( slack < 1 )
base64[ 2 ] = '=';
if ( slack < 2 )
base64[ 3 ] = '=';
return base64;
}
static char getBase64Char( int sixBit ) {
if ( sixBit >= 0 && sixBit <= 25 )
return ( char ) ( 'A' + sixBit );
if ( sixBit >= 26 && sixBit <= 51 )
return ( char ) ( 'a' + ( sixBit - 26 ) );
if ( sixBit >= 52 && sixBit <= 61 )
return ( char ) ( '0' + ( sixBit - 52 ) );
if ( sixBit == 62 )
return '+';
if ( sixBit == 63 )
return '/';
return '?';
}
static public byte[] decodeBase64( String base64 ) {
int pad = 0;
for ( int i = base64.length( ) - 1 ; base64.charAt( i ) == '=' ; i-- )
pad++;
int length = base64.length( ) * 6 / 8 - pad;
byte[] raw = new byte[ length ];
int rawIndex = 0;
for ( int i = 0 ; i < base64.length( ) ; i += 4 ) {
int block = ( getBase64Value( base64.charAt( i ) ) << 18 ) + ( getBase64Value( base64.charAt( i + 1 ) ) << 12 ) + ( getBase64Value( base64.charAt( i + 2 ) ) << 6 ) + ( getBase64Value( base64.charAt( i + 3 ) ) );
for ( int j = 0 ; j < 3 && rawIndex + j < raw.length ; j++ )
raw[ rawIndex + j ] = ( byte ) ( ( block >> ( 8 * ( 2 - j ) ) ) & 0xff );
rawIndex += 3;
}
return raw;
}
static int getBase64Value( char c ) {
if ( c >= 'A' && c <= 'Z' )
return c - 'A';
if ( c >= 'a' && c <= 'z' )
return c - 'a' + 26;
if ( c >= '0' && c <= '9' )
return c - '0' + 52;
if ( c == '+' )
return 62;
if ( c == '/' )
return 63;
if ( c == '=' )
return 0;
return -1;
}
static public int getBit( int theByte , int theIndex ) {
int bitmask = 1 << theIndex;
return ( ( theByte & bitmask ) > 0 ) ? 1 : 0;
}
static public byte setHigh( byte theByte , int theIndex ) {
return ( byte ) ( theByte | ( 1 << theIndex ) );
}
static public byte setLow( byte theByte , int theIndex ) {
return ( byte ) ( theByte & ~ ( 1 << theIndex ) );
}
static public byte[] intToByteArray( int a ) {
byte[] ret = new byte[ 2 ];
ret[ 1 ] = ( byte ) ( a & 0xFF );
ret[ 0 ] = ( byte ) ( ( a >> 8 ) & 0xFF );
//ret[0] = (byte) ((a >> 16) & 0xFF);
//ret[0] = (byte) ((a >> 24) & 0xFF);
return ret;
}
static public int byteArrayToInt( byte[] b ) {
int value = 0;
for ( int i = 0 ; i < 2 ; i++ ) {
int shift = ( 2 - 1 - i ) * 8;
value += ( b[ i ] & 0x00FF ) << shift;
}
return value;
}
static String join( List< String > list , String delimiter ) {
StringBuilder b = new StringBuilder( );
for ( String item : list ) {
b.append( item ).append( delimiter );
}
return b.toString( );
}
}