- gvinterpreter using libgs, doesnt work, gsapi fails to provide an instance, no idea why... moving to owrk on commandline gs

svn path=/trunk/playground/graphics/oKular/kpdf/; revision=437870
remotes/origin/okular3-playground
Piotr Szymanski 21 years ago
parent 9d66ee1670
commit fdf0f2ff51
  1. 14
      generators/ghostview/Makefile.am
  2. 253
      generators/ghostview/interpreter.cpp
  3. 37
      generators/ghostview/interpreter.h

@ -0,0 +1,14 @@
kde_module_LTLIBRARIES = \
libokularGenerator_ghostview.la
INCLUDES = -I$(srcdir)/../.. -I$(top_builddir)/kpdf $(all_includes)
libokularGenerator_ghostview_la_LIBADD = $(top_builddir)/kpdf/core/libkpdfcore.la $(top_builddir)/kpdf/conf/libkpdfconf.la -lgs -lkdeui -lkdeprint
libokularGenerator_ghostview_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
libokularGenerator_ghostview_la_SOURCES = generator_ghostview.cpp dscparse_adapter.cpp dscparse.cpp interpreter_comm.cpp
KDE_OPTIONS = nofinal
kde_services_DATA = libokularGenerator_ghostview.desktop
# generator_pdf.lo: ../../conf/settings.h

@ -0,0 +1,253 @@
/***************************************************************************
* Copyright (C) 1997-2005 the KGhostView authors. See file GV_AUTHORS. *
* Copyright (C) 2005 by Piotr Szymanski <niedakh@gmail.com> *
* *
* Many portions of this file are based on kghostview's kpswidget code *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include <kdebug.h>
#include <qpixmap.h>
#include "interpreter.h"
#include "gs/iapi.h"
#include "gs/ierrors.h"
int intPow(int x, int n)
{
int z;
if (n == 0)
return 1;
else if (n == 1)
return x;
else if ((n%2)==0)
{
// x^2n=x^n * x^n;
z=intPow(x,n/2);
return z*z;
}
else
{
// x^(2n+1)=x^2n * x;
z=intPow(x,(n-1)/2);
return z*z*x;
}
}
QImage* generatedImage=0;
int size(void *handle, void *device, int width, int height,
int raster, unsigned int format, unsigned char *pimage)
{
int depth = format & DISPLAY_DEPTH_MASK;
int color = format & DISPLAY_COLORS_MASK;
bool lEndian = (format & DISPLAY_ENDIAN_MASK) == DISPLAY_LITTLEENDIAN ;
int dep= QPixmap::defaultDepth () ;
int numCol = (color == DISPLAY_COLORS_GRAY ) ? 1 : intPow( 2, dep ) ;
switch (depth)
{
case DISPLAY_DEPTH_1:
numCol=2;
dep=1;
case DISPLAY_DEPTH_2:
dep=2;
numCol=4;
break;
case DISPLAY_DEPTH_4:
dep=4;
numCol=16;
break;
case DISPLAY_DEPTH_8:
dep=8;
numCol=256;
break;
case DISPLAY_DEPTH_12:
dep=12;
numCol=4096;
break;
case DISPLAY_DEPTH_16:
dep=16;
numCol=65536;
break;
}
kdDebug() << "size called" << endl;
generatedImage = new QImage (pimage, width, height,
dep, (QRgb*) 0, numCol, (lEndian) ? QImage::LittleEndian : QImage::BigEndian );
return 0;
}
/*
device.size = sizeof ( display_callback );
device.version_major = DISPLAY_VERSION_MAJOR;
device.version_minor = DISPLAY_VERSION_MINOR;
device.display_open = NULL;
device.display_preclose = NULL;
device.display_close = NULL;
device.display_presize = NULL;
device.display_size = & size;
device.display_sync = NULL;
device.display_page = NULL;
device.display_update = NULL;
device.display_memalloc = NULL;
device.display_memfree = NULL; */
display_callback device=
{
sizeof ( display_callback ),
DISPLAY_VERSION_MAJOR,
DISPLAY_VERSION_MINOR,
NULL,
NULL,
NULL,
NULL,
& size,
NULL,
NULL,
NULL,
NULL, /* memalloc */
NULL
#if DISPLAY_VERSION_MAJOR >= 2
,NULL
#endif
};
GVInterpreter::GVInterpreter(QStringList *list)
{
gsArgs=list;
int exit=gsapi_new_instance(&ghostScriptInstance,NULL);
if (exit != 0)
{
kdDebug() << "sth is very wrong! " << endl;
}
int exit_i=gsapi_init_with_args (&ghostScriptInstance,gsArgs->count(),argsToChar());
if (exit_i != 0)
{
kdDebug() << "screwed sth with args?! " << endl;
}
}
GVInterpreter::~GVInterpreter()
{
gsapi_exit(&ghostScriptInstance);
gsapi_delete_instance(&ghostScriptInstance);
delete gsArgs;
}
bool GVInterpreter::run(FILE * tmp, long begin , unsigned int lenght)
{
if (fseek(tmp,begin, SEEK_SET))
return false;
char * buf = new char [4096];
int read=4096;
int exit_code, left=lenght;
bool errorExit=false;
interpreterLock.lock();
gsapi_set_display_callback(&ghostScriptInstance, &device);
gsapi_run_string_begin (&ghostScriptInstance, 0, &exit_code);
if (exit_code)
errorExit=handleExit(exit_code);
if (errorExit)
return false;
while (lenght)
{
read=fread (buf,sizeof(char),read,tmp);
gsapi_run_string_continue (&ghostScriptInstance, buf, read, 0, &exit_code);;
if (exit_code)
errorExit=handleExit(exit_code);
if (errorExit)
return false;
left-=read;
}
gsapi_run_string_end (&ghostScriptInstance, 0, &exit_code);
if (exit_code)
errorExit=handleExit(exit_code);
if (errorExit)
return false;
gsapi_set_display_callback(&ghostScriptInstance, NULL);
interpreterLock.unlock();
m_img=generatedImage;
return true;
}
bool GVInterpreter::handleExit(int code)
{
switch (code)
{
// quit was issued
case e_Quit:
// gs -h was run
case e_Info:
//gsapi_exit
return false;
// no error or we need further input
case 0:
case e_NeedInput:
return true;
// <0 - error
default:
return false;
}
}
char** GVInterpreter::argsToChar()
{
char ** ret;
int i,size=gsArgs->count()+1;
ret = static_cast <char **> (new char* [size]);
for (i=0;i<size;i++)
{
ret[i+1]=const_cast <char*> ((*gsArgs)[i].ascii());
kdDebug() << "Arg nr " << i << " : " << (*gsArgs)[i].ascii() << endl ;
}
//ret[size+1]=0;
return ret;
}
/*
bool GVInterpreter::x11Event( XEvent* e )
{
if( e->type == ClientMessage )
{
_gsWindow = e->xclient.data.l[0];
if( e->xclient.message_type == _atoms[PAGE] )
{
kdDebug(4500) << "KPSWidget: received PAGE" << endl;
interpreterLock.unLock();
unsetCursor();
emit newPageImage( _backgroundPixmap );
if ( _doubleBuffer )
setErasePixmap( _backgroundPixmap );
return true;
}
else if( e->xclient.message_type == _atoms[DONE] )
{
kdDebug(4500) << "KPSWidget: received DONE" << endl;
stopInterpreter();
return true;
}
}
return QWidget::x11Event( e );
}*/

@ -0,0 +1,37 @@
/***************************************************************************
* Copyright (C) 2005 by Piotr Szymanski <niedakh@gmail.com> *
* *
* Many portions of this file are based on kghostview's kpswidget code *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include <gs/gdevdsp.h>
#include <stdio.h>
#include <qimage.h>
#include <qstringlist.h>
#include <qmutex.h>
class GVInterpreter
{
public:
GVInterpreter(QStringList * list );
~GVInterpreter();
bool handleExit(int code);
bool run (FILE * tmp, long begin , unsigned int lenght);
void setGhostscriptArguments( QStringList* list)
{ interpreterLock.lock(); gsArgs=list; interpreterLock.unlock(); };
bool locked () { return interpreterLock.locked() ;} ;
QImage* m_img;
private:
char** argsToChar();
void * ghostScriptInstance;
QString gsPath;
QStringList *gsArgs;
QMutex interpreterLock;
};
Loading…
Cancel
Save