beta-0.89.2
[luatex.git] / source / libs / poppler / poppler-src / poppler / OptionalContent.h
blob2e416462003b827eed11f0f032a785563bd3d188
1 //========================================================================
2 //
3 // OptionalContent.h
4 //
5 // Copyright 2007 Brad Hards <bradh@kde.org>
6 // Copyright 2008 Carlos Garcia Campos <carlosgc@gnome.org>
7 // Copyright 2013 Albert Astals Cid <aacid@kde.org>
8 //
9 // Released under the GPL (version 2, or later, at your option)
11 //========================================================================
13 #ifndef OPTIONALCONTENT_H
14 #define OPTIONALCONTENT_H
16 #ifdef USE_GCC_PRAGMAS
17 #pragma interface
18 #endif
20 #include "Object.h"
21 #include "CharTypes.h"
23 class GooString;
24 class GooList;
25 class XRef;
27 class OptionalContentGroup;
28 class OCDisplayNode;
30 //------------------------------------------------------------------------
32 class OCGs {
33 public:
35 OCGs(Object *ocgObject, XRef *xref);
36 ~OCGs();
38 // Is OCGS valid?
39 GBool isOk() { return ok; }
41 bool hasOCGs();
42 GooList *getOCGs() const { return optionalContentGroups; }
44 OptionalContentGroup* findOcgByRef( const Ref &ref);
46 // Get the root node of the optional content group display tree
47 // (which does not necessarily include all of the OCGs).
48 OCDisplayNode *getDisplayRoot();
50 Array* getOrderArray()
51 { return (order.isArray() && order.arrayGetLength() > 0) ? order.getArray() : NULL; }
52 Array* getRBGroupsArray()
53 { return (rbgroups.isArray() && rbgroups.arrayGetLength()) ? rbgroups.getArray() : NULL; }
55 bool optContentIsVisible( Object *dictRef );
57 private:
58 GBool ok;
60 GBool evalOCVisibilityExpr(Object *expr, int recursion);
61 bool allOn( Array *ocgArray );
62 bool allOff( Array *ocgArray );
63 bool anyOn( Array *ocgArray );
64 bool anyOff( Array *ocgArray );
66 GooList *optionalContentGroups;
68 Object order;
69 Object rbgroups;
70 XRef *m_xref;
71 OCDisplayNode *display; // root node of display tree
74 //------------------------------------------------------------------------
76 class OptionalContentGroup {
77 public:
78 enum State { On, Off };
80 // Values from the optional content usage dictionary.
81 enum UsageState {
82 ocUsageOn,
83 ocUsageOff,
84 ocUsageUnset
87 OptionalContentGroup(Dict *dict);
89 OptionalContentGroup(GooString *label);
91 ~OptionalContentGroup();
93 GooString* getName() const;
95 Ref getRef() const;
96 void setRef(const Ref ref);
98 State getState() { return m_state; };
99 void setState(State state) { m_state = state; };
101 UsageState getViewState() { return viewState; }
102 UsageState getPrintState() { return printState; }
104 private:
105 GooString *m_name;
106 Ref m_ref;
107 State m_state;
108 UsageState viewState; // suggested state when viewing
109 UsageState printState; // suggested state when printing
112 //------------------------------------------------------------------------
114 class OCDisplayNode {
115 public:
117 static OCDisplayNode *parse(Object *obj, OCGs *oc, XRef *xref, int recursion = 0);
118 OCDisplayNode();
119 ~OCDisplayNode();
121 GooString *getName() { return name; }
122 OptionalContentGroup *getOCG() { return ocg; }
123 int getNumChildren();
124 OCDisplayNode *getChild(int idx);
126 private:
128 OCDisplayNode(GooString *nameA);
129 OCDisplayNode(OptionalContentGroup *ocgA);
130 void addChild(OCDisplayNode *child);
131 void addChildren(GooList *childrenA);
132 GooList *takeChildren();
134 GooString *name; // display name (may be NULL)
135 OptionalContentGroup *ocg; // NULL for display labels
136 GooList *children; // NULL if there are no children
137 // [OCDisplayNode]
140 #endif