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
|
//========================================================================
//
// XPixmapOutputDev.cc
//
// Copyright 2002-2003 Glyph & Cog, LLC
//
//========================================================================
#include <aconf.h>
#ifdef USE_GCC_PRAGMAS
#pragma implementation
#endif
#include "Object.h"
#include "GfxState.h"
#include "XPixmapOutputDev.h"
//------------------------------------------------------------------------
#define xoutRound(x) ((int)(x + 0.5))
//------------------------------------------------------------------------
XPixmapOutputDev::XPixmapOutputDev(Display *displayA, int screenNumA,
Visual *visualA, Colormap colormapA,
GBool reverseVideoA, Gulong paperColorA,
GBool installCmapA, int rgbCubeSizeA,
GBool incrementalUpdateA,
void (*redrawCbkA)(void *data),
void *redrawCbkDataA):
XOutputDev(displayA, screenNumA, visualA, colormapA,
reverseVideoA, paperColorA, installCmapA, rgbCubeSizeA)
{
incrementalUpdate = incrementalUpdateA;
redrawCbk = redrawCbkA;
redrawCbkData = redrawCbkDataA;
}
XPixmapOutputDev::~XPixmapOutputDev() {
if (getPixmapWidth() > 0) {
XFreePixmap(getDisplay(), getPixmap());
}
}
void XPixmapOutputDev::clear() {
startDoc(NULL);
startPage(0, NULL);
}
void XPixmapOutputDev::startPage(int pageNum, GfxState *state) {
int oldPixmapW, oldPixmapH, newPixmapW, newPixmapH;
// resize the off-screen pixmap (if needed)
oldPixmapW = getPixmapWidth();
oldPixmapH = getPixmapHeight();
newPixmapW = xoutRound(state ? state->getPageWidth() : 1);
newPixmapH = xoutRound(state ? state->getPageHeight() : 1);
if (oldPixmapW == 0 ||
newPixmapW != oldPixmapW || newPixmapH != oldPixmapH) {
if (oldPixmapW > 0) {
XFreePixmap(getDisplay(), getPixmap());
}
setPixmap(XCreatePixmap(getDisplay(), win, newPixmapW, newPixmapH,
getDepth()),
newPixmapW, newPixmapH);
}
XOutputDev::startPage(pageNum, state);
}
void XPixmapOutputDev::endPage() {
if (!incrementalUpdate) {
(*redrawCbk)(redrawCbkData);
}
XOutputDev::endPage();
}
void XPixmapOutputDev::dump() {
if (incrementalUpdate) {
(*redrawCbk)(redrawCbkData);
}
XOutputDev::dump();
}
|