/*
 *  ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one or more
 *    contributor license agreements.  See the NOTICE file distributed with
 *    this work for additional information regarding copyright ownership.
 *    The ASF licenses this file to You under the Apache License, Version 2.0
 *    (the "License"); you may not use this file except in compliance with
 *    the License.  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 * ====================================================================
 */

package org.apache.poi.sl.draw;

/**
 * Manages fonts when rendering slides.
 *
 * Use this class to handle unknown / missing fonts or to substitute fonts
 */
public interface DrawFontManager {

    /**
     * select a font to be used to paint text
     *
     * @param typeface the font family as defined in the .pptx file.
     * This can be unknown or missing in the graphic environment.
     * @param pitchFamily a pitch-and-family,
     * see {@link org.apache.poi.hwmf.record.HwmfFont#getFamily()} and
     * {@link org.apache.poi.hwmf.record.HwmfFont#getPitch()}
     * for how to calculate those (ancient) values
     *
     * @return the font to be used to paint text
     */
    String getRendererableFont(String typeface, int pitchFamily);

    /**
     * In case the original font doesn't contain a glyph, use the
     * returned fallback font as an alternative
     *
     * @param typeface the font family as defined in the .pptx file.
     * @param pitchFamily a pitch-and-family,
     * see {@link org.apache.poi.hwmf.record.HwmfFont#getFamily()} and
     * {@link org.apache.poi.hwmf.record.HwmfFont#getPitch()}
     * for how to calculate those (ancient) values
     * 
     * @return the font to be used as a fallback for the original typeface
     */
    String getFallbackFont(String typeface, int pitchFamily);
}
