Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * output.c
 * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL
 *
 * Description:
 * Generic output generating functions
 */

#include "antiword.h"

static conversion_type  eConversionType = conversion_unknown;
static encoding_type    eEncoding = encoding_neutral;


/*
 * vPrologue1 - get options and call a specific initialization
 */
static void
vPrologue1(diagram_type *pDiag, const char *szTask, const char *szFilename)
{
        options_type    tOptions;

        fail(pDiag == NULL);
        fail(szTask == NULL || szTask[0] == '\0');

        vGetOptions(&tOptions);
        eConversionType = tOptions.eConversionType;
        eEncoding = tOptions.eEncoding;

        switch (eConversionType) {
        case conversion_text:
                vPrologueTXT(pDiag, &tOptions);
                break;
        case conversion_fmt_text:
                vPrologueFMT(pDiag, &tOptions);
                break;
        case conversion_ps:
                vProloguePS(pDiag, szTask, szFilename, &tOptions);
                break;
        case conversion_xml:
                vPrologueXML(pDiag, &tOptions);
                break;
        case conversion_pdf:
                vProloguePDF(pDiag, szTask, &tOptions);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vPrologue1 */

/*
 * vEpilogue - clean up after everything is done
 */
static void
vEpilogue(diagram_type *pDiag)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                vEpilogueTXT(pDiag->pOutFile);
                break;
        case conversion_ps:
                vEpiloguePS(pDiag);
                break;
        case conversion_xml:
                vEpilogueXML(pDiag);
                break;
        case conversion_pdf:
                vEpiloguePDF(pDiag);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vEpilogue */

/*
 * vImagePrologue - perform image initialization
 */
void
vImagePrologue(diagram_type *pDiag, const imagedata_type *pImg)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                vImageProloguePS(pDiag, pImg);
                break;
        case conversion_xml:
                break;
        case conversion_pdf:
                vImageProloguePDF(pDiag, pImg);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vImagePrologue */

/*
 * vImageEpilogue - clean up an image
 */
void
vImageEpilogue(diagram_type *pDiag)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                vImageEpiloguePS(pDiag);
                break;
        case conversion_xml:
                break;
        case conversion_pdf:
                vImageEpiloguePDF(pDiag);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vImageEpilogue */

/*
 * bAddDummyImage - add a dummy image
 *
 * return TRUE when successful, otherwise FALSE
 */
BOOL
bAddDummyImage(diagram_type *pDiag, const imagedata_type *pImg)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                return FALSE;
        case conversion_ps:
                return bAddDummyImagePS(pDiag, pImg);
        case conversion_xml:
                return FALSE;
        case conversion_pdf:
                return bAddDummyImagePDF(pDiag, pImg);
        default:
                DBG_DEC(eConversionType);
                return FALSE;
        }
} /* end of bAddDummyImage */

/*
 * pCreateDiagram - create and initialize a diagram
 *
 * remark: does not return if the diagram can't be created
 */
diagram_type *
pCreateDiagram(const char *szTask, const char *szFilename)
{
        diagram_type    *pDiag;

        fail(szTask == NULL || szTask[0] == '\0');
        DBG_MSG("pCreateDiagram");

        /* Get the necessary memory */
        pDiag = xmalloc(sizeof(diagram_type));
        /* Initialization */
        pDiag->pOutFile = stdout;
        vPrologue1(pDiag, szTask, szFilename);
        /* Return success */
        return pDiag;
} /* end of pCreateDiagram */

/*
 * vDestroyDiagram - remove a diagram by freeing the memory it uses
 */
void
vDestroyDiagram(diagram_type *pDiag)
{
        DBG_MSG("vDestroyDiagram");

        fail(pDiag == NULL);

        if (pDiag == NULL) {
                return;
        }
        vEpilogue(pDiag);
        pDiag = xfree(pDiag);
} /* end of vDestroyDiagram */

/*
 * vPrologue2 - call a specific initialization
 */
void
vPrologue2(diagram_type *pDiag, int iWordVersion)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                vAddFontsPS(pDiag);
                break;
        case conversion_xml:
                vCreateBookIntro(pDiag, iWordVersion);
                break;
        case conversion_pdf:
                vCreateInfoDictionary(pDiag, iWordVersion);
                vAddFontsPDF(pDiag);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vPrologue2 */

/*
 * vMove2NextLine - move to the next line
 */
void
vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef,
        USHORT usFontSize)
{
        fail(pDiag == NULL);
        fail(pDiag->pOutFile == NULL);
        fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);

        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                vMove2NextLineTXT(pDiag);
                break;
        case conversion_ps:
                vMove2NextLinePS(pDiag, usFontSize);
                break;
        case conversion_xml:
                vMove2NextLineXML(pDiag);
                break;
        case conversion_pdf:
                vMove2NextLinePDF(pDiag, usFontSize);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vMove2NextLine */

/*
 * vSubstring2Diagram - put a sub string into a diagram
 */
void
vSubstring2Diagram(diagram_type *pDiag,
        char *szString, size_t tStringLength, long lStringWidth,
        UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef,
        USHORT usFontSize, USHORT usMaxFontSize)
{
        switch (eConversionType) {
        case conversion_text:
                vSubstringTXT(pDiag, szString, tStringLength, lStringWidth);
                break;
        case conversion_fmt_text:
                vSubstringFMT(pDiag, szString, tStringLength, lStringWidth,
                                usFontstyle);
                break;
        case conversion_ps:
                vSubstringPS(pDiag, szString, tStringLength, lStringWidth,
                                ucFontColor, usFontstyle, tFontRef,
                                usFontSize, usMaxFontSize);
                break;
        case conversion_xml:
                vSubstringXML(pDiag, szString, tStringLength, lStringWidth,
                                usFontstyle);
                break;
        case conversion_pdf:
                vSubstringPDF(pDiag, szString, tStringLength, lStringWidth,
                                ucFontColor, usFontstyle, tFontRef,
                                usFontSize, usMaxFontSize);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
        pDiag->lXleft += lStringWidth;
} /* end of vSubstring2Diagram */

/*
 * Create a start of paragraph (phase 1)
 * Before indentation, list numbering, bullets etc.
 */
void
vStartOfParagraph1(diagram_type *pDiag, long lBeforeIndentation)
{
        fail(pDiag == NULL);

        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                vStartOfParagraphTXT(pDiag, lBeforeIndentation);
                break;
        case conversion_ps:
                vStartOfParagraphPS(pDiag, lBeforeIndentation);
                break;
        case conversion_xml:
                break;
        case conversion_pdf:
                vStartOfParagraphPDF(pDiag, lBeforeIndentation);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vStartOfParagraph1 */

/*
 * Create a start of paragraph (phase 2)
 * After indentation, list numbering, bullets etc.
 */
void
vStartOfParagraph2(diagram_type *pDiag)
{
        fail(pDiag == NULL);

        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vStartOfParagraphXML(pDiag, 1);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vStartOfParagraph2 */

/*
 * Create an end of paragraph
 */
void
vEndOfParagraph(diagram_type *pDiag,
        drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation)
{
        fail(pDiag == NULL);
        fail(pDiag->pOutFile == NULL);
        fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
        fail(lAfterIndentation < 0);

        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                vEndOfParagraphTXT(pDiag, lAfterIndentation);
                break;
        case conversion_ps:
                vEndOfParagraphPS(pDiag, usFontSize, lAfterIndentation);
                break;
        case conversion_xml:
                vEndOfParagraphXML(pDiag, 1);
                break;
        case conversion_pdf:
                vEndOfParagraphPDF(pDiag, usFontSize, lAfterIndentation);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vEndOfParagraph */

/*
 * Create an end of page
 */
void
vEndOfPage(diagram_type *pDiag, long lAfterIndentation, BOOL bNewSection)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                vEndOfPageTXT(pDiag, lAfterIndentation);
                break;
        case conversion_ps:
                vEndOfPagePS(pDiag, bNewSection);
                break;
        case conversion_xml:
                vEndOfPageXML(pDiag);
                break;
        case conversion_pdf:
                vEndOfPagePDF(pDiag, bNewSection);
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vEndOfPage */

/*
 * vSetHeaders - set the headers
 */
void
vSetHeaders(diagram_type *pDiag, USHORT usIstd)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vSetHeadersXML(pDiag, usIstd);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vSetHeaders */

/*
 * Create a start of list
 */
void
vStartOfList(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vStartOfListXML(pDiag, ucNFC, bIsEndOfTable);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vStartOfList */

/*
 * Create an end of list
 */
void
vEndOfList(diagram_type *pDiag)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vEndOfListXML(pDiag);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vEndOfList */

/*
 * Create a start of a list item
 */
void
vStartOfListItem(diagram_type *pDiag, BOOL bNoMarks)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vStartOfListItemXML(pDiag, bNoMarks);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vStartOfListItem */

/*
 * Create an end of a table
 */
void
vEndOfTable(diagram_type *pDiag)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vEndOfTableXML(pDiag);
                break;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
} /* end of vEndOfTable */

/*
 * Add a table row
 *
 * Returns TRUE when conversion type is XML
 */
BOOL
bAddTableRow(diagram_type *pDiag, char **aszColTxt,
        int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo)
{
        switch (eConversionType) {
        case conversion_text:
        case conversion_fmt_text:
                break;
        case conversion_ps:
                break;
        case conversion_xml:
                vAddTableRowXML(pDiag, aszColTxt,
                                iNbrOfColumns, asColumnWidth,
                                ucBorderInfo);
                return TRUE;
        case conversion_pdf:
                break;
        default:
                DBG_DEC(eConversionType);
                break;
        }
        return FALSE;
} /* end of bAddTableRow */