/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



/**
 *
 * @file ttcr.h
 * @brief TrueType font creator
 * @author Alexander Gelfenbain
 */

#ifndef __TTCR_H
#define __TTCR_H

#include "sft.hxx"

namespace vcl
{
    typedef struct _TrueTypeCreator TrueTypeCreator;

/* TrueType data types */
    typedef struct {
        sal_uInt16 aw;
        sal_Int16  lsb;
    } longHorMetrics;

/* A generic base class for all TrueType tables */
    struct TrueTypeTable {
        sal_uInt32  tag;                         /* table tag                                                */
        sal_uInt8   *rawdata;                    /* raw data allocated by GetRawData_*()                     */
        void        *data;                       /* table specific data                                      */
    };

/** Error codes for most functions */
    enum TTCRErrCodes {                     
        TTCR_OK = 0,                        /**< no error                                               */
        TTCR_ZEROGLYPHS = 1,                /**< At least one glyph should be defined                   */
        TTCR_UNKNOWN = 2,                   /**< Unknown TrueType table                                 */
        TTCR_GLYPHSEQ = 3,                  /**< Glyph IDs are not sequential in the glyf table         */
        TTCR_NONAMES = 4,                   /**< 'name' table does not contain any names                */
        TTCR_NAMETOOLONG = 5,               /**< 'name' table is too long (string data > 64K)           */
        TTCR_POSTFORMAT = 6                 /**< unsupported format of a 'post' table                   */
    };

/* ============================================================================
 *
 * TrueTypeCreator methods
 *
 * ============================================================================ */

/**
 * TrueTypeCreator constructor.
 * Allocates all internal structures.
 */
    void TrueTypeCreatorNewEmpty(sal_uInt32 tag, TrueTypeCreator **_this);

/**
 * Adds a TrueType table to the TrueType creator.
 * SF_TABLEFORMAT value.
 * @return value of SFErrCodes type
 */
    int AddTable(TrueTypeCreator *_this, TrueTypeTable *table);

/**
 * Removes a TrueType table from the TrueType creator if it is stored there.
 * It also calls a TrueTypeTable destructor.
 * Note: all generic tables (with tag 0) will be removed if this function is
 * called with the second argument of 0.
 * @return value of SFErrCodes type
 */
    void RemoveTable(TrueTypeCreator *_this, sal_uInt32 tag);



/**
 * Writes a TrueType font generated by the TrueTypeCreator to a segment of
 * memory that this method allocates. When it is not needed anymore the caller
 * is supposed to call free() on it.
 * @return value of SFErrCodes type
 */
    int StreamToMemory(TrueTypeCreator *_this, sal_uInt8 **ptr, sal_uInt32 *length);

/**
 * Writes a TrueType font  generated by the TrueTypeCreator to a file
 * @return value of SFErrCodes type
 */
    int StreamToFile(TrueTypeCreator *_this, const char* fname);


/* ============================================================================
 *
 * TrueTypeTable methods
 *
 * ============================================================================ */


/**
 * This function converts the data of a TrueType table to a raw array of bytes.
 * It may allocates the memory for it and returns the size of the raw data in bytes.
 * If memory is allocated it does not need to be freed by the caller of this function,
 * since the pointer to it is stored in the TrueTypeTable and it is freed by the destructor
 * @return TTCRErrCode
 *
 */

    int GetRawData(TrueTypeTable *, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag);

/**
 *
 * Creates a new raw TrueType table. The difference between this constructor and
 * TrueTypeTableNew_tag constructors is that the latter create structured tables
 * while this constructor just copies memory pointed to by ptr to its buffer
 * and stores its length. This constructor is suitable for data that is not
 * supposed to be processed in any way, just written to the resulting TTF file.
 */
    TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag,
                                    sal_uInt32 nbytes,
                                    const sal_uInt8* ptr);

/**
 * Creates a new 'head' table for a TrueType font.
 * Allocates memory for it. Since a lot of values in the 'head' table depend on the
 * rest of the tables in the TrueType font this table should be the last one added
 * to the font.
 */
    TrueTypeTable *TrueTypeTableNew_head(sal_uInt32 fontRevision,
                                         sal_uInt16 flags,
                                         sal_uInt16 unitsPerEm,
                                         const sal_uInt8  *created,
                                         sal_uInt16 macStyle,
                                         sal_uInt16 lowestRecPPEM,
                                         sal_Int16  fontDirectionHint);

/**
 * Creates a new 'hhea' table for a TrueType font.
 * Allocates memory for it and stores it in the hhea pointer.
 */
    TrueTypeTable *TrueTypeTableNew_hhea(sal_Int16  ascender,
                                         sal_Int16  descender,
                                         sal_Int16  linegap,
                                         sal_Int16  caretSlopeRise,
                                         sal_Int16  caretSlopeRun);

/**
 * Creates a new empty 'loca' table for a TrueType font.
 *
 * INTERNAL: gets called only from ProcessTables();
 */
    TrueTypeTable *TrueTypeTableNew_loca(void);

/**
 * Creates a new 'maxp' table based on an existing maxp table.
 * If maxp is 0, a new empty maxp table is created
 * size specifies the size of existing maxp table for
 * error-checking purposes
 */
    TrueTypeTable *TrueTypeTableNew_maxp( const sal_uInt8* maxp, int size);

/**
 * Creates a new empty 'glyf' table.
 */
    TrueTypeTable *TrueTypeTableNew_glyf(void);

/**
 * Creates a new empty 'cmap' table.
 */
    TrueTypeTable *TrueTypeTableNew_cmap(void);

/**
 * Creates a new 'name' table. If n != 0 the table gets populated by
 * the Name Records stored in the nr array. This function allocates
 * memory for its own copy of NameRecords, so nr array has to
 * be explicitly deallocated when it is not needed.
 */
    TrueTypeTable *TrueTypeTableNew_name(int n, NameRecord *nr);

/**
 * Creates a new 'post' table of one of the supported formats
 */
    TrueTypeTable *TrueTypeTableNew_post(sal_uInt32 format,
                                         sal_uInt32 italicAngle,
                                         sal_Int16 underlinePosition,
                                         sal_Int16 underlineThickness,
                                         sal_uInt32 isFixedPitch);


/*------------------------------------------------------------------------------
 *
 *  Table manipulation functions
 *
 *------------------------------------------------------------------------------*/
 

/**
 * Add a character/glyph pair to a cmap table
 */
    void cmapAdd(TrueTypeTable *, sal_uInt32 id, sal_uInt32 c, sal_uInt32 g);

/**
 * Add a glyph to a glyf table.
 *
 * @return glyphID of the glyph in the new font
 *
 * NOTE: This function does not duplicate GlyphData, so memory will be
 * deallocated in the table destructor
 */
    sal_uInt32 glyfAdd(TrueTypeTable *, GlyphData *glyphdata, TrueTypeFont *fnt);

/**
 * Query the number of glyphs currently stored in the 'glyf' table
 *
 */
    sal_uInt32 glyfCount(const TrueTypeTable *);

/**
 * Add a Name Record to a name table.
 * NOTE: This function duplicates NameRecord, so the argument
 * has to be deallocated by the caller (unlike glyfAdd)
 */
    void nameAdd(TrueTypeTable *, NameRecord *nr);

} // namespace                  


extern "C"
{
/**
 * Destructor for the TrueTypeTable object.
 */
 void TrueTypeTableDispose(vcl::TrueTypeTable *);

/**
 * TrueTypeCreator destructor. It calls destructors for all TrueTypeTables added to it.
 */
 void TrueTypeCreatorDispose(vcl::TrueTypeCreator *_this);
}

#endif /* __TTCR_H */
