/*
 *******************************************************************************
 *
 *   Copyright (C) 1999-2001, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 *   file name:  Paragraph.h
 *
 *   created on: 09/06/2000
 *   created by: Eric R. Mader
 */
#ifndef __PARAGRAPH_H
#define __PARAGRAPH_H

#include "unicode/utypes.h"
#include "unicode/uscript.h"
#include "unicode/brkiter.h"

#include "GUISupport.h"
#include "RenderingFontInstance.h"
#include "FontMap.h"

U_NAMESPACE_USE

#define MARGIN 10

struct RunParams
{
    const RenderingFontInstance *fontInstance;
    UChar *text;
    int32_t count;
    UScriptCode scriptCode;
    UBool rightToLeft;
};

struct RunInfo
{
    const RenderingFontInstance *fontInstance;
    int32_t charBase;
    int32_t glyphBase;
    UBool rightToLeft;
};

class Paragraph
{
public:
    Paragraph(void *surface,RunParams runs[], int32_t count);

    ~Paragraph();

    int32_t getAscent();
    int32_t getLineHeight();
    int32_t getLineCount();
    void breakLines(int32_t width, int32_t height);
    void draw(void *surface, int32_t firstLine, int32_t lastLine);

    static Paragraph *paragraphFactory(const char *fileName, FontMap *fontMap, GUISupport *guiSupport, void *surface);

protected:
    int32_t previousBreak(int32_t charIndex);
    int32_t getCharRun(int32_t ch, int32_t startingRun, int32_t direction);
    int32_t getGlyphRun(int32_t glyph, int32_t startingRun, int32_t direction);

    int32_t getRunWidth(int32_t startGlyph, int32_t endGlyph);
    int32_t drawRun(void *surface, const RenderingFontInstance *fontInstance, int32_t firstChar, int32_t lastChar,
                     int32_t x, int32_t y);


private:
    int32_t fRunCount;
    RunInfo *fRunInfo;

    int32_t fCharCount;
    UChar *fText;
    BreakIterator *fBrkiter;

    int32_t fGlyphCount;
    LEGlyphID *fGlyphs;
    int32_t *fCharIndices;
    int32_t *fGlyphIndices;
    int32_t *fDX;
    int32_t *fDY;

    int32_t fBreakCount;
    int32_t *fBreakArray;

    int32_t fLineHeight;
    int32_t fAscent;
    int32_t fWidth;
    int32_t fHeight;
};

#endif


