Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/xpdf/XPixmapOutputDev.cc
blob: d55b2d2a74b6f7de27872f52483cd104389a6f03 (plain)
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();
}