1
//========================================================================
3
// GDKSplashOutputDev.cc
5
// Copyright 2003 Glyph & Cog, LLC
6
// Copyright 2004 Red Hat, Inc. (GDK port)
8
//========================================================================
12
#ifdef USE_GCC_PRAGMAS
13
#pragma implementation
17
#include <splash/SplashTypes.h>
18
#include <splash/SplashBitmap.h>
20
#include "SplashOutputDev.h"
26
#include "GlobalParams.h"
27
#include "ErrorCodes.h"
30
//------------------------------------------------------------------------
32
#define xOutMaxRGBCube 6 // max size of RGB color cube
34
//------------------------------------------------------------------------
36
//------------------------------------------------------------------------
38
class GDKSplashOutputDev: public SplashOutputDev {
41
GDKSplashOutputDev(GdkScreen *screen,
42
void (*redrawCbkA)(void *data),
43
void *redrawCbkDataA, SplashColor sc);
45
virtual ~GDKSplashOutputDev();
47
//----- initialization and control
50
virtual void endPage();
52
// Dump page contents to display.
55
//----- update text state
56
virtual void updateFont(GfxState *state);
58
//----- special access
60
// Clear out the document (used when displaying an empty window).
63
// Copy the rectangle (srcX, srcY, width, height) to (destX, destY)
65
void redraw(int srcX, int srcY,
66
GdkDrawable *drawable,
68
int width, int height);
72
int incrementalUpdate;
73
void (*redrawCbk)(void *data);
77
//------------------------------------------------------------------------
78
// Constants and macros
79
//------------------------------------------------------------------------
81
#define xoutRound(x) ((int)(x + 0.5))
83
//------------------------------------------------------------------------
85
//------------------------------------------------------------------------
87
GDKSplashOutputDev::GDKSplashOutputDev(GdkScreen *screen,
88
void (*redrawCbkA)(void *data),
89
void *redrawCbkDataA, SplashColor sc):
90
SplashOutputDev(splashModeRGB8, 4, gFalse, sc),
93
redrawCbk = redrawCbkA;
94
redrawCbkData = redrawCbkDataA;
97
GDKSplashOutputDev::~GDKSplashOutputDev() {
100
void GDKSplashOutputDev::clear() {
105
void GDKSplashOutputDev::endPage() {
106
SplashOutputDev::endPage();
107
if (!incrementalUpdate) {
108
(*redrawCbk)(redrawCbkData);
112
void GDKSplashOutputDev::dump() {
113
if (incrementalUpdate && redrawCbk) {
114
(*redrawCbk)(redrawCbkData);
118
void GDKSplashOutputDev::updateFont(GfxState *state) {
119
SplashOutputDev::updateFont(state);
122
void GDKSplashOutputDev::redraw(int srcX, int srcY,
123
GdkDrawable *drawable,
124
int destX, int destY,
125
int width, int height) {
129
gdk_rowstride = getBitmap()->getRowSize();
130
gc = gdk_gc_new (drawable);
132
gdk_draw_rgb_image (drawable, gc,
135
GDK_RGB_DITHER_NORMAL,
136
getBitmap()->getDataPtr() + srcY * gdk_rowstride + srcX * 3,
147
GtkWidget *drawing_area;
148
GDKSplashOutputDev *out;
153
drawing_area_expose (GtkWidget *drawing_area,
154
GdkEventExpose *event,
157
View *v = (View*) data;
158
GdkRectangle document;
161
gdk_window_clear (drawing_area->window);
165
document.width = v->out->getBitmapWidth();
166
document.height = v->out->getBitmapHeight();
168
if (gdk_rectangle_intersect (&document, &event->area, &draw))
170
v->out->redraw (draw.x, draw.y,
171
drawing_area->window,
173
draw.width, draw.height);
179
const char *filename)
183
GooString *filename_g;
186
filename_g = new GooString (filename);
189
newDoc = new PDFDoc(filename_g, 0, 0);
195
err = newDoc->getErrorCode();
204
v->out->startDoc(v->doc->getXRef());
206
v->doc->displayPage (v->out, 1, 72, 72, 0, gFalse, gTrue, gTrue);
208
w = v->out->getBitmapWidth();
209
h = v->out->getBitmapHeight();
211
gtk_widget_set_size_request (v->drawing_area, w, h);
219
gtk_widget_show (v->window);
223
redraw_callback (void *data)
225
View *v = (View*) data;
227
gtk_widget_queue_draw (v->drawing_area);
235
GtkWidget *drawing_area;
238
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
240
drawing_area = gtk_drawing_area_new ();
242
sw = gtk_scrolled_window_new (NULL, NULL);
244
gtk_container_add (GTK_CONTAINER (window), sw);
245
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), drawing_area);
247
gtk_widget_show_all (sw);
249
v = g_new0 (View, 1);
252
v->drawing_area = drawing_area;
258
v->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
259
redraw_callback, (void*) v, sc);
262
g_signal_connect (drawing_area,
264
G_CALLBACK (drawing_area_expose),
271
main (int argc, char *argv [])
276
gtk_init (&argc, &argv);
278
globalParams = new GlobalParams();
282
fprintf (stderr, "usage: %s PDF-FILES...\n", argv[0]);
294
err = view_load (v, argv[i]);
297
g_printerr ("Error loading document!\n");