package com.ftloverdrive.io;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader;
import com.badlogic.gdx.assets.loaders.BitmapFontLoader.BitmapFontParameter;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;
import com.badlogic.gdx.utils.Array;
/**
* AssetLoader for BitmapFont instances generated from ttf files via FreeType.
* The instance is loaded synchronously.
*
* The font size can be specified by appending to the fileName: "...?size=10".
*/
public class FreeTypeFontLoader extends AsynchronousAssetLoader<BitmapFont, BitmapFontParameter> {
protected Pattern argsPtn;
public FreeTypeFontLoader( FileHandleResolver resolver ) {
super( resolver );
argsPtn = Pattern.compile( "&?([A-Za-z0-9]+)=([A-Za-z0-9]+)(#?)" );
}
@Override
public FileHandle resolve( String fileName ) {
String scrubbedFileName = fileName;
int qMark = fileName.lastIndexOf( "?" );
if ( qMark != -1 ) {
scrubbedFileName = scrubbedFileName.substring( 0, qMark );
}
return super.resolve( scrubbedFileName );
}
@Override
public BitmapFont loadSync( AssetManager manager, String fileName, FileHandle file, BitmapFontParameter parameter ) {
int fontSize = 10;
String scrubbedFileName = fileName;
int qMark = fileName.lastIndexOf( "?" );
if ( qMark != -1 ) {
scrubbedFileName = scrubbedFileName.substring( 0, qMark );
Matcher m = argsPtn.matcher( fileName );
m.region( qMark+1, fileName.length() );
while ( m.lookingAt() ) {
if ( m.group( 1 ).equals( "size" ) ) {
fontSize = Integer.parseInt( m.group( 2 ) );
}
if ( m.group( 3 ).length() > 0 ) break; // Hit the "#" separator.
m.region( m.end(), fileName.length() );
}
}
boolean flip = parameter != null ? parameter.flip : false;
FreeTypeFontGenerator generator = new FreeTypeFontGenerator( file );
FreeTypeBitmapFontData data = generator.generateData( fontSize, FreeTypeFontGenerator.DEFAULT_CHARS, flip );
generator.dispose();
return new BitmapFont( data, data.getTextureRegions(), true );
}
@Override
public void loadAsync( AssetManager manager, String fileName, FileHandle file, BitmapFontParameter parameter ) {
// No-op.
}
@Override
public Array<AssetDescriptor> getDependencies( String fileName, FileHandle file, BitmapFontParameter parameter ) {
return new Array<AssetDescriptor>();
}
}