/* seqOut - stuff to output sequences and alignments in web 
 * or ascii viewable form. */


struct cfm
/* Colored web character output formatter. */
    {
    int wordLen;	/* Number of characters between spaces (often 10) */
    int lineLen;        /* Number of characters between lines (often 50) */
    int inWord, inLine; /* Position in word and line. */
    bool lineNumbers;   /* True if write position at end of line. */
    bool countDown;     /* True if want numbers counting down. */
    long charCount;     /* Number of characters written total. */
    FILE *out;          /* File to write to. */
    int numOff;         /* Number to start with. */
    int color;          /* Cache last color here. */
    bool underline;	/* Underline? */
    bool bold;		/* Font in bold. */
    bool italic;	/* Italic? */
    };

struct cfm *cfmNew(int wordLen, int lineLen, 
	boolean lineNumbers, boolean countDown, FILE *out, int numOff);
/* Set up colored sequence formatting for html. */

void cfmOut(struct cfm *cfm, char c, int color);
/* Write out a byte, and depending on color formatting extras  */

void cfmOutExt(struct cfm *cfm, char c, int color, boolean underline, boolean bold, boolean italic);
/* Write out a byte, and formatting extras  */

void cfmFree(struct cfm **pCfm);
/* Finish and free up cfm formatting job. */

enum seqOutColor
/* Symbolic color for sequence output. */
    {
    socBlack = 0,		/* Not aligning. */
    socBlue = 1,		/* Aligning. */
    socBrightBlue = 2,		/* End of an aligning block. */
    socRed = 3, 		/* Aligning UTR. */
    socOrange = 4,		/* End of an aligning UTR block. */
    };
extern int seqOutColorLookup[];		/* Converts these to html format colors. */

struct baf
/* Block allignment formatter. */
    {
    char nChars[256];
    char hChars[256];
    int cix;
    int nLineStart;
    int hLineStart;
    int nCurPos;
    int hCurPos;
    DNA *needle, *haystack;
    int nNumOff, hNumOff;
    FILE *out;
    int lineSize;
    bool hCountDown;     /* True if want numbers counting down. */
    bool isTrans;	 /* True if haystack is translated. */
    bool nCountDown;	 /* True if want needle numbers counting down. */
    };

void bafInit(struct baf *baf, DNA *needle, int nNumOff, boolean nCountDown,
	DNA *haystack, int hNumOff, boolean hCountDown, 
	FILE *out, int lineSize, boolean isTrans);
/* Initialize block alignment formatter. */

void bafSetAli(struct baf *baf, struct ffAli *ali);
/* Set up block formatter around an ffAli block. */

void bafSetPos(struct baf *baf, int nStart, int hStart);
/* Set up block formatter starting at nStart/hStart. */

void bafStartLine(struct baf *baf);
/* Set up block formatter to start new line at current position. */

void bafWriteLine(struct baf *baf);
/* Write out a line of an alignment (which takes up
 * three lines on the screen. */

void bafOut(struct baf *baf, char n, char h);
/* Write a pair of character to block alignment. */

void bafFlushLine(struct baf *baf);
/* Write out alignment line if it has any characters in it. */

