/* * 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; import static com.metsci.glimpse.dnc.DncProjections.canProjectBrowse; import static java.lang.Math.max; import static java.lang.Math.min; import java.util.Collection; import com.metsci.glimpse.axis.Axis2D; import com.metsci.glimpse.dnc.DncProjections.DncProjection; public class DncPainterSettingsImpl implements DncPainterSettings { protected final double ppvMultiplier; protected final boolean useBrowseLibrary; public DncPainterSettingsImpl( DncProjection proj ) { this( proj, canProjectBrowse( proj ) ); } public DncPainterSettingsImpl( DncProjection proj, boolean useBrowseLibrary ) { this( proj.suggestedPpvMultiplier( ), useBrowseLibrary ); } public DncPainterSettingsImpl( double ppvMultiplier, boolean useBrowseLibrary ) { this.ppvMultiplier = ppvMultiplier; this.useBrowseLibrary = useBrowseLibrary; } @Override public boolean areAreasVisible( Axis2D axis ) { return true; } @Override public boolean areLinesVisible( Axis2D axis ) { // If we are using the browse library, then we can show its lines even when // zoomed way out, because they are coarse enough not to clutter things up. // // If we aren't using the browse library, then we stick with the general // library when zoomed way out. In such cases, we want only the polygons, // to keep things from looking cluttered. // return ( useBrowseLibrary || ppvMultiplier * ppv( axis ) >= 50 ); } @Override public boolean areIconsVisible( Axis2D axis ) { return ( ppvMultiplier * ppv( axis ) >= 150 ); } @Override public boolean areLabelsVisible( Axis2D axis ) { return ( ppvMultiplier * ppv( axis ) >= 300 ); } @Override public float iconsGlobalScale( Axis2D axis ) { double ppvMax = 10000; double scaleMax = 1.0; double ppvMin = 10; double scaleMin = 0.6; double ppv = ppvMultiplier * ppv( axis ); double scale = scaleMin + ( ( scaleMax - scaleMin ) / ( ppvMax - ppvMin ) ) * ppv; return ( float ) min( scaleMax, max( scaleMin, scale ) ); } @Override public boolean isLibraryActive( DncLibrary library, Axis2D axis ) { // If we aren't using the browse library, then stick with // the general library when zoomed way out return isLibraryActive( library, axis, ppvMultiplier, ( useBrowseLibrary ? 50 : Double.MIN_VALUE ), 2000, 8000, 23000 ); } public static boolean isLibraryPositionVisible( DncLibrary library, Axis2D axis ) { double xMin = axis.getMinX( ); double yMin = axis.getMinY( ); double xMax = axis.getMaxX( ); double yMax = axis.getMaxY( ); return ( xMin <= library.xMax && library.xMin <= xMax && yMin <= library.yMax && library.yMin <= yMax ); } public static boolean isLibraryOfType( DncLibrary library, char type ) { return ( Character.toUpperCase( library.libraryName.charAt( 0 ) ) == Character.toUpperCase( type ) ); } public static boolean isLibraryActive( DncLibrary library, Axis2D axis, double ppvMultiplier, double bgThreshold, double gcThreshold, double caThreshold, double ahThreshold ) { if ( !isLibraryPositionVisible( library, axis ) ) { return false; } double ppvMin; double ppvMax; switch ( library.libraryName.charAt( 0 ) ) { case 'B': case 'b': ppvMin = Double.MIN_VALUE; ppvMax = bgThreshold; break; case 'G': case 'g': ppvMin = bgThreshold; ppvMax = gcThreshold; break; case 'C': case 'c': ppvMin = gcThreshold; ppvMax = caThreshold; break; case 'A': case 'a': ppvMin = caThreshold; ppvMax = ahThreshold; break; case 'H': case 'h': ppvMin = ahThreshold; ppvMax = Double.MAX_VALUE; break; default: ppvMin = Double.MAX_VALUE; ppvMax = Double.MIN_VALUE; break; } double ppv = ppvMultiplier * ppv( axis ); return ( ppvMin <= ppv && ppv < ppvMax ); } @Override public boolean isLibraryActive( DncLibrary library, Collection<Axis2D> axes ) { for ( Axis2D axis : axes ) { if ( isLibraryActive( library, axis ) ) { return true; } } return false; } public static double ppv( Axis2D axis ) { return axis.getAxisX( ).getPixelsPerValue( ); } }