/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2006 - 2013 Pentaho Corporation and Contributors. All rights reserved.
*/
package org.pentaho.reporting.libraries.fonts.encoding;
import org.pentaho.reporting.libraries.fonts.encoding.manual.Utf16LE;
/**
* Creation-Date: 01.06.2006, 18:10:19
*
* @author Thomas Morgner
*/
public class CodePointUtilities {
public static boolean isValidCodePoint( final int cp ) {
if ( cp > 0x10FFFF ) {
return false;
}
if ( cp > 0xDFFF ) {
return true;
}
if ( cp >= 0xDC00 ) {
return false;
}
if ( cp < 0 ) {
return false;
}
return true;
}
/**
* Converts the given codepoint into the given character array. The return value indicates either success or failure.
* The conversion will fail, if the given array does not contain enough space for the decoded character. In that case
* either -1 (one char missing) or -2 (two chars missing) is returned. On success either 1 or 2 is returned to
* indicate the number of chars added.
* <p/>
* If the buffer has space for at least two chars, then the negative index will never be returned.
*
* @param cp
* @param buffer
* @param offset
* @return the number of chars added or the number of additional chars required.
*/
public static int toChars( final int cp, final char[] buffer, final int offset ) {
if ( cp < 0x10000 ) {
if ( offset >= buffer.length ) {
return -1;
}
// maybe simple ..
if ( cp < 0 ) {
// invalid ..
buffer[ offset ] = 0xffff;
} else if ( cp >= 0xdc00 && cp < 0xE000 ) {
// invalid ..
buffer[ offset ] = 0xffff;
} else {
buffer[ offset ] = (char) ( cp & 0xFFFF );
}
return 1;
} else {
if ( cp > 0x10FFFF ) {
if ( offset >= buffer.length ) {
return -1;
}
// invalid ..
buffer[ offset ] = 0xffff;
return 1;
}
if ( offset + 1 >= buffer.length ) {
return -2;
}
// convert ...
final int derivedSourceItem = cp - 0x10000;
final int highWord = 0xD800 | ( ( derivedSourceItem & 0xFFC00 ) >> 10 );
final int lowWord = 0xDC00 | ( derivedSourceItem & 0x3FF );
buffer[ offset ] = (char) highWord;
buffer[ offset + 1 ] = (char) lowWord;
return 2;
}
}
public static int[] charsToCodepoint( final String text ) {
final CodePointBuffer buffer = Utf16LE.getInstance().decodeString( text, null );
return buffer.getBuffer();
}
public static String codepointToChars( final int[] text ) {
final CodePointBuffer buffer = new CodePointBuffer( text );
buffer.setCursor( text.length );
return Utf16LE.getInstance().encodeString( buffer );
}
private CodePointUtilities() {
}
}