/*
* Copyright (C) 2011 Laurent Caillette
*
* This program 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 3 of the License, or (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.novelang.rendering.font;
import java.util.List;
import java.util.Set;
import com.google.common.base.Predicate;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import org.apache.fop.fonts.EmbedFontInfo;
import org.apache.fop.fonts.FontTriplet;
import org.novelang.configuration.FontQuadruplet;
import org.novelang.configuration.FopFontStatus;
/**
* @author Laurent Caillette
*/
public class SyntheticFontMap {
private SyntheticFontMap() { }
public static Iterable<FontQuadruplet> retainPriorityAboveZero(
final Iterable< FontQuadruplet > quadruplets
) {
return Iterables.filter( quadruplets, new Predicate< FontQuadruplet >() {
@Override
public boolean apply( final FontQuadruplet quadruplet ) {
return quadruplet.getFontTriplet().getPriority() > 0 ;
}
} ) ;
}
public static Iterable< FontQuadruplet > retainPriorityZero(
final Iterable< FontQuadruplet > quadruplets
) {
return Iterables.filter( quadruplets, new Predicate< FontQuadruplet >() {
@Override
public boolean apply( final FontQuadruplet quadruplet ) {
return quadruplet.getFontTriplet().getPriority() == 0 ;
}
} ) ;
}
public static Multimap< String, FontQuadruplet > mapQuadrupletsByCleanNames(
final Iterable< FontQuadruplet > quadruplets
) {
final Multimap< String, FontQuadruplet > map = HashMultimap.create() ;
for( final FontQuadruplet quadruplet : quadruplets ) {
map.put( quadruplet.getFontTriplet().getName(), quadruplet ) ;
}
return ImmutableMultimap.copyOf( map ) ;
}
public static Multimap< String, FontQuadruplet > extractTripletsWithKnownName(
final Set< String > names,
final Iterable< FontQuadruplet > quadruplets
) {
final Multimap< String, FontQuadruplet > extracted = HashMultimap.create() ;
for( final FontQuadruplet quadruplet : quadruplets ) {
final String name = quadruplet.getFontTriplet().getName() ;
if( names.contains( name ) ) {
extracted.put( name, quadruplet ) ;
}
}
return extracted ;
}
public static Multimap< String, FontQuadruplet > createSyntheticFontMap(
final FopFontStatus fontStatus
) {
final List< FontQuadruplet > quadruplets = Lists.newArrayList() ;
for( final EmbedFontInfo fontInfo : fontStatus.getFontInfos() ) {
for( final Object fontTripletAsObject : fontInfo.getFontTriplets() ) {
final FontTriplet fontTriplet = ( FontTriplet ) fontTripletAsObject ;
final FontQuadruplet fontQuadruplet =
new FontQuadruplet( fontInfo.getEmbedFile(), fontTriplet ) ;
quadruplets.add( fontQuadruplet ) ;
}
}
final Iterable< FontQuadruplet > quadrupletsPriorityAboveZero =
retainPriorityAboveZero( quadruplets ) ;
final Iterable< FontQuadruplet > quadrupletsPriorityZero =
retainPriorityZero( quadruplets ) ;
final Multimap< String, FontQuadruplet > quadrupletsByCleanNames =
HashMultimap.create(
mapQuadrupletsByCleanNames( quadrupletsPriorityAboveZero ) ) ;
quadrupletsByCleanNames.putAll(
extractTripletsWithKnownName( quadrupletsByCleanNames.keySet(), quadrupletsPriorityZero )
) ;
return quadrupletsByCleanNames ;
}
}