Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

187 lines
4.9 KiB
C++

//========================================================================
//
// Annot.h
//
// Copyright 2000-2003 Glyph & Cog, LLC
//
//========================================================================
#ifndef ANNOT_H
#define ANNOT_H
#include <aconf.h>
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
class XRef;
class Catalog;
class Gfx;
class GfxFontDict;
class PDFDoc;
//------------------------------------------------------------------------
// AnnotBorderStyle
//------------------------------------------------------------------------
enum AnnotBorderType {
annotBorderSolid,
annotBorderDashed,
annotBorderBeveled,
annotBorderInset,
annotBorderUnderlined
};
class AnnotBorderStyle {
public:
AnnotBorderStyle(AnnotBorderType typeA, double widthA,
double *dashA, int dashLengthA,
double *colorA, int nColorCompsA);
~AnnotBorderStyle();
AnnotBorderType getType() { return type; }
double getWidth() { return width; }
void getDash(double **dashA, int *dashLengthA)
{ *dashA = dash; *dashLengthA = dashLength; }
int getNumColorComps() { return nColorComps; }
double *getColor() { return color; }
private:
AnnotBorderType type;
double width;
double *dash;
int dashLength;
double color[4];
int nColorComps;
};
//------------------------------------------------------------------------
enum AnnotLineEndType {
annotLineEndNone,
annotLineEndSquare,
annotLineEndCircle,
annotLineEndDiamond,
annotLineEndOpenArrow,
annotLineEndClosedArrow,
annotLineEndButt,
annotLineEndROpenArrow,
annotLineEndRClosedArrow,
annotLineEndSlash
};
//------------------------------------------------------------------------
// Annot
//------------------------------------------------------------------------
class Annot {
public:
Annot(PDFDoc *docA, Dict *dict, Ref *refA, const char* AP = "N", const char* AS = 0);
~Annot();
GBool isOk() { return ok; }
void draw(Gfx *gfx, GBool printing);
GString *getType() { return type; }
double getXMin() { return xMin; }
double getYMin() { return yMin; }
double getXMax() { return xMax; }
double getYMax() { return yMax; }
Object *getObject(Object *obj);
// Check if point is inside the annotation rectangle.
GBool inRect(double x, double y)
{ return xMin <= x && x <= xMax && yMin <= y && y <= yMax; }
// Get appearance object.
Object *getAppearance(Object *obj) { return appearance.fetch(xref, obj); }
AnnotBorderStyle *getBorderStyle() { return borderStyle; }
GBool match(Ref *refA)
{ return ref.num == refA->num && ref.gen == refA->gen; }
void generateAnnotAppearance();
private:
void generateLineAppearance();
void generatePolyLineAppearance();
void generatePolygonAppearance();
void generateFreeTextAppearance();
void generateTextAppearance();
void setLineStyle(AnnotBorderStyle *bs, double *lineWidth);
void setStrokeColor(double *color, int nComps);
GBool setFillColor(Object *colorObj);
AnnotLineEndType parseLineEndType(Object *obj);
void adjustLineEndpoint(AnnotLineEndType lineEnd,
double x, double y, double dx, double dy,
double w, double *tx, double *ty);
void drawLineArrow(AnnotLineEndType lineEnd,
double x, double y, double dx, double dy,
double w, GBool fill);
void drawCircle(double cx, double cy, double r, const char *cmd);
void drawCircleTopLeft(double cx, double cy, double r);
void drawCircleBottomRight(double cx, double cy, double r);
void drawText(GString *text, GString *da, int quadding, double margin,
int rot);
PDFDoc *doc;
XRef *xref; // the xref table for this PDF file
Ref ref; // object ref identifying this annotation
GString *type; // annotation type
GString *appearanceState; // appearance state name
Object appearance; // a reference to the Form XObject stream
// for the normal appearance
GString *appearBuf;
double xMin, yMin, // annotation rectangle
xMax, yMax;
Guint flags;
AnnotBorderStyle *borderStyle;
Object ocObj; // optional content entry
GBool ok;
};
//------------------------------------------------------------------------
// Annots
//------------------------------------------------------------------------
class Annots {
public:
// Build a list of Annot objects.
Annots(PDFDoc *docA, Object *annotsObj);
~Annots();
// Iterate through list of annotations.
int getNumAnnots() { return nAnnots; }
Annot *getAnnot(int i) { return annots[i]; }
// If point <x>,<y> is in an annotation, return the associated
// annotation; else return NULL.
Annot *find(double x, double y);
int findIdx(double x, double y);
// Generate an appearance stream for any non-form-field annotation
// that is missing it.
void generateAnnotAppearances();
private:
void scanFieldAppearances(Dict *node, Ref *ref, Dict *parent,
Dict *acroForm);
Annot *findAnnot(Ref *ref);
PDFDoc *doc;
Annot **annots;
int nAnnots;
};
#endif