blob: 426d3fbdf01a5bb6073017f814bb27424b441936 [file] [log] [blame]
// ABWOutputDev.h
// Copyright 2006-2007 Jauco Noordzij <>
#ifdef __GNUC__
#pragma interface
#include <stdio.h>
#include "goo/gtypes.h"
#include "goo/GooList.h"
#include "GfxFont.h"
#include "OutputDev.h"
#include "Catalog.h"
#include "UnicodeMap.h"
#include "PDFDoc.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#ifdef WIN32
# define SLASH '\\'
# define SLASH '/'
#define xoutRound(x) ((int)(x + 0.5))
class GfxState;
class GooString;
// ABWOutputDev
class ABWOutputDev: public OutputDev {
// Open a text output file. If <fileName> is NULL, no file is written
// (this is useful, e.g., for searching text). If <useASCII7> is true,
// text is converted to 7-bit ASCII; otherwise, text is converted to
// 8-bit ISO Latin-1. <useASCII7> should also be set for Japanese
// (EUC-JP) text. If <rawOrder> is true, the text is kept in content
// stream order.
ABWOutputDev(xmlDocPtr ext_doc);
// Destructor.
virtual ~ABWOutputDev();
// Check if file was successfully created.
virtual GBool isOk() { return gTrue; }
//---- get info about output device
// Does this device use upside-down coordinates?
// (Upside-down means (0,0) is the top left corner of the page.)
virtual GBool upsideDown() { return gTrue; }
// Does this device use drawChar() or drawString()?
virtual GBool useDrawChar() { return gTrue; }
// Does this device use beginType3Char/endType3Char? Otherwise,
// text in Type 3 fonts will be drawn with drawChar/drawString.
virtual GBool interpretType3Chars() { return gFalse; }
// Does this device need non-text content?
virtual GBool needNonText() { return gFalse; }
//----- initialization and control
// Start a page.
virtual void startPage(int pageNum, GfxState *state);
// End a page.
virtual void endPage();
//----- update text state
virtual void updateFont(GfxState *state);
//----- text drawing
//new feature
virtual int DevType() {return 1234;}
int getPageWidth() { return maxPageWidth; }
int getPageHeight() { return maxPageHeight; }
float getBiggestSeperator(xmlNodePtr N_set, unsigned int direction, float * C1, float * C2);
void recursiveXYC(xmlNodePtr nodeset);
void splitNodes(float splitValue, unsigned int direction, xmlNodePtr N_parent, double extravalue);
virtual void beginString(GfxState *state, GooString *s);
virtual void endString(GfxState *state);
virtual void drawChar(GfxState *state, double x, double y,
double dx, double dy,
double originX, double originY,
CharCode code, int nBytes, Unicode *u, int uLen);
void beginWord(GfxState *state, double x, double y);
void endWord();
void beginTextBlock(GfxState *state, double x, double y);
void endTextBlock();
void interpretXYTree();
void ATP_recursive(xmlNodePtr N_cur);
void cleanUpNode(xmlNodePtr N_parent, bool aggregateInfo);
void transformPage(xmlNodePtr N_parent);
void generateParagraphs();
void addAlignment(xmlNodePtr N_parent);
void setPDFDoc(PDFDoc *priv_pdfdoc);
void createABW();
int maxPageWidth;
int maxPageHeight;
int G_pageNum;
int Style, maxStyle;
//A lot of values are nice to have around. I think that declaring some
//global variables that contain these values is faster & easier than reading
//them from the xml tree every time.
double height;
double wordSpace, charSpace;
double X1,X2,Y1,Y2,horDist, verDist, curDx, curDy;
bool mightBreak;
xmlDocPtr doc;
/* node pointers */
xmlNodePtr N_root, N_content, N_page, N_style, N_text, N_styleset, N_Block, N_word, N_column, N_colset;
xmlNodePtr outputDoc;
xmlXPathContextPtr xpathCtx;
static const unsigned int HORIZONTAL = 0;
static const unsigned int VERTICAL = 1;
UnicodeMap *uMap;
PDFDoc *pdfdoc;
int xmlLsCountNode(xmlNodePtr node);