1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
//========================================================================
//
// FormWidget.cc
//
// Copyright 2000 Derek B. Noonburg
//
//========================================================================
#ifdef __GNUC__
#pragma implementation
#endif
#include "gmem.h"
#include "Object.h"
#include "Gfx.h"
#include "FormWidget.h"
//------------------------------------------------------------------------
// FormWidget
//------------------------------------------------------------------------
FormWidget::FormWidget(Dict *dict) {
Object obj1, obj2;
double t;
ok = gFalse;
if (dict->lookup("AP", &obj1)->isDict()) {
obj1.dictLookupNF("N", &obj2);
//~ this doesn't handle appearances with multiple states --
//~ need to look at AS key to get state and then get the
//~ corresponding entry from the N dict
if (obj2.isRef()) {
obj2.copy(&appearance);
ok = gTrue;
}
obj2.free();
}
obj1.free();
if (dict->lookup("Rect", &obj1)->isArray() &&
obj1.arrayGetLength() == 4) {
//~ should check object types here
obj1.arrayGet(0, &obj2);
xMin = obj2.getNum();
obj2.free();
obj1.arrayGet(1, &obj2);
yMin = obj2.getNum();
obj2.free();
obj1.arrayGet(2, &obj2);
xMax = obj2.getNum();
obj2.free();
obj1.arrayGet(3, &obj2);
yMax = obj2.getNum();
obj2.free();
if (xMin > xMax) {
t = xMin; xMin = xMax; xMax = t;
}
if (yMin > yMax) {
t = yMin; yMin = yMax; yMax = t;
}
} else {
//~ this should return an error
xMin = yMin = 0;
xMax = yMax = 1;
}
obj1.free();
}
FormWidget::~FormWidget() {
appearance.free();
}
void FormWidget::draw(Gfx *gfx) {
Object obj;
if (appearance.fetch(&obj)->isStream()) {
gfx->doWidgetForm(&obj, xMin, yMin, xMax, yMax);
}
obj.free();
}
//------------------------------------------------------------------------
// FormWidgets
//------------------------------------------------------------------------
FormWidgets::FormWidgets(Object *annots) {
FormWidget *widget;
Object obj1, obj2;
int size;
int i;
widgets = NULL;
size = 0;
nWidgets = 0;
if (annots->isArray()) {
for (i = 0; i < annots->arrayGetLength(); ++i) {
if (annots->arrayGet(i, &obj1)->isDict()) {
obj1.dictLookup("Subtype", &obj2);
if (obj2.isName("Widget") ||
obj2.isName("Stamp")) {
widget = new FormWidget(obj1.getDict());
if (widget->isOk()) {
if (nWidgets >= size) {
size += 16;
widgets = (FormWidget **)grealloc(widgets,
size * sizeof(FormWidget *));
}
widgets[nWidgets++] = widget;
} else {
delete widget;
}
}
obj2.free();
}
obj1.free();
}
}
}
FormWidgets::~FormWidgets() {
int i;
for (i = 0; i < nWidgets; ++i) {
delete widgets[i];
}
gfree(widgets);
}
|