/*
* Copyright (c) 2016, Metron, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Metron, Inc. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL METRON, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.metsci.glimpse.dnc.convert;
import static com.google.common.base.Charsets.US_ASCII;
import static java.lang.Float.parseFloat;
import static java.lang.Integer.parseInt;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.LongBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import com.google.common.io.Files;
import com.metsci.glimpse.dnc.DncCoverage;
import com.metsci.glimpse.dnc.DncLibrary;
import com.metsci.glimpse.dnc.DncChunks.DncChunkKey;
public class Render
{
public static final String renderFormatVersion = "12";
public static final String renderCharsetFilename = "charset";
public static final String renderConfigFilename = "config";
public static final String renderLibrariesFilename = "libraries";
public static final String renderCoveragesFilename = "coverages";
public static final String renderMutexFilename = "mutex";
public static final String renderCursorFilename = "cursor";
public static final String renderChunksFilename = "chunks";
public static final String renderGroupsFilename = "groups";
public static final String renderLabelCharsFilename = "label-chars";
public static final String renderLabelLengthsFilename = "label-lengths";
public static final String renderVerticesFilename = "vertices";
public static final int longsPerRenderChunk = 11;
public static final int intsPerRenderGroup = 11;
public static final int floatsPerRenderLibrary = 4;
// x, y, featureNum
public static final int coordsPerRenderTriangleVertex = 3;
// x, y, featureNum, cumulativeDistance
public static final int coordsPerRenderLineVertex = 4;
// x, y, featureNum, rotation_CCWRAD
public static final int coordsPerRenderIconVertex = 4;
// x, y, featureNum
public static final int coordsPerRenderLabelVertex = 3;
public static Charset readRenderCharset( File renderDir ) throws IOException
{
File charsetFile = new File( renderDir, renderCharsetFilename );
return Charset.forName( Files.toString( charsetFile, US_ASCII ).trim( ) );
}
public static void writeRenderCharset( File renderDir, Charset charset ) throws IOException
{
File charsetFile = new File( renderDir, renderCharsetFilename );
Files.write( charset.name( ), charsetFile, US_ASCII );
}
public static String readRenderConfig( File renderDir, Charset charset ) throws IOException
{
File configFile = new File( renderDir, renderConfigFilename );
return Files.toString( configFile, charset );
}
public static void writeRenderConfig( File renderDir, String configString, Charset charset ) throws IOException
{
File configFile = new File( renderDir, renderConfigFilename );
Files.write( configString, configFile, charset );
}
public static List<DncLibrary> readRenderLibrariesFile( File file, Charset charset ) throws IOException
{
BufferedReader reader = null;
try
{
reader = new BufferedReader( new InputStreamReader( new FileInputStream( file ), charset ) );
List<DncLibrary> libraries = new ArrayList<>( );
for ( int i = 0; true; i++ )
{
String line = reader.readLine( );
if ( line == null ) break;
String[] tokens = line.split( " " );
if ( tokens.length != 6 ) throw new IOException( "Format error in " + file.getAbsolutePath( ) + " on line " + i );
int databaseNum = parseInt( tokens[ 0 ] );
String libraryName = tokens[ 1 ];
float xMin = parseFloat( tokens[ 2 ] );
float xMax = parseFloat( tokens[ 3 ] );
float yMin = parseFloat( tokens[ 4 ] );
float yMax = parseFloat( tokens[ 5 ] );
libraries.add( new DncLibrary( databaseNum, libraryName, xMin, xMax, yMin, yMax ) );
}
return libraries;
}
finally
{
if ( reader != null ) reader.close( );
}
}
public static List<DncCoverage> readRenderCoveragesFile( File file, Charset charset ) throws IOException
{
BufferedReader reader = null;
try
{
reader = new BufferedReader( new InputStreamReader( new FileInputStream( file ), charset ) );
List<DncCoverage> coverages = new ArrayList<>( );
for ( int i = 0; true; i++ )
{
String line = reader.readLine( );
if ( line == null ) break;
String[] tokens = line.split( " " );
if ( tokens.length != 1 ) throw new IOException( "Format error in " + file.getAbsolutePath( ) + " on line " + i );
String coverageName = tokens[ 0 ];
coverages.add( new DncCoverage( coverageName ) );
}
return coverages;
}
finally
{
if ( reader != null ) reader.close( );
}
}
public static class RenderChunk
{
public final DncChunkKey chunkKey;
public final int featureCount;
public final int groupFirst;
public final int groupCount;
public final int labelCharFirst;
public final int labelCharCount;
public final int labelLengthFirst;
public final int labelLengthCount;
public final long vertexCoordFirst;
public final int vertexCoordCount;
public RenderChunk( DncChunkKey chunkKey,
int featureCount,
int groupFirst,
int groupCount,
int labelCharFirst,
int labelCharCount,
int labelLengthFirst,
int labelLengthCount,
long vertexCoordFirst,
int vertexCoordCount )
{
this.chunkKey = chunkKey;
this.featureCount = featureCount;
this.groupFirst = groupFirst;
this.groupCount = groupCount;
this.labelCharFirst = labelCharFirst;
this.labelCharCount = labelCharCount;
this.labelLengthFirst = labelLengthFirst;
this.labelLengthCount = labelLengthCount;
this.vertexCoordFirst = vertexCoordFirst;
this.vertexCoordCount = vertexCoordCount;
}
}
public static List<RenderChunk> readRenderChunks( LongBuffer chunksBuf, List<DncLibrary> libraries, List<DncCoverage> coverages )
{
List<RenderChunk> chunks = new ArrayList<>( );
while ( chunksBuf.hasRemaining( ) )
{
int libraryNum = ( int ) chunksBuf.get( );
int coverageNum = ( int ) chunksBuf.get( );
int featureCount = ( int ) chunksBuf.get( );
int groupFirst = ( int ) chunksBuf.get( );
int groupCount = ( int ) chunksBuf.get( );
int labelCharFirst = ( int ) chunksBuf.get( );
int labelCharCount = ( int ) chunksBuf.get( );
int labelLengthFirst = ( int ) chunksBuf.get( );
int labelLengthCount = ( int ) chunksBuf.get( );
long vertexCoordFirst = chunksBuf.get( );
int vertexCoordCount = ( int ) chunksBuf.get( );
DncLibrary library = libraries.get( libraryNum );
DncCoverage coverage = coverages.get( coverageNum );
DncChunkKey chunkKey = new DncChunkKey( library, coverage );
chunks.add( new RenderChunk( chunkKey, featureCount, groupFirst, groupCount, labelCharFirst, labelCharCount, labelLengthFirst, labelLengthCount, vertexCoordFirst, vertexCoordCount ) );
}
return chunks;
}
}