diff options
Diffstat (limited to 'kbarcode/tbarcode2.cpp')
-rw-r--r-- | kbarcode/tbarcode2.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/kbarcode/tbarcode2.cpp b/kbarcode/tbarcode2.cpp new file mode 100644 index 0000000..a07ff41 --- /dev/null +++ b/kbarcode/tbarcode2.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + tbarcode2.cpp - description + ------------------- + begin : Mon Feb 20 2006 + copyright : (C) 2006 by Dominik Seichter + email : domseichter@web.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "tbarcode2.h" +#include "barkode.h" + +#include <stdlib.h> + +#include <qdom.h> +#include <qfile.h> + +#include <kprocess.h> +#include <ktempfile.h> + +TBarcodeOptions::TBarcodeOptions() +{ + defaults(); +} + +void TBarcodeOptions::defaults() +{ + m_escape = false; + m_above = false; + m_autocorrect = false; + m_checksum = 0; + m_modulewidth = 0.353; + m_height = 20; +} + +void TBarcodeOptions::load( const QDomElement* tag ) +{ + this->setModuleWidth( tag->attribute( "tbarcode.modulewidth", "0.353" ).toDouble() ); + this->setEscape( tag->attribute( "tbarcode.escape", "0" ).toInt() ); + this->setAbove( tag->attribute( "tbarcode.above", "0" ).toInt() ); + this->setAutocorrect( tag->attribute ( "tbarcode.autocorrect", "0" ).toInt() ); + this->setCheckSum( tag->attribute( "tbarcode.checksum", "0" ).toInt() ); + this->setHeight( tag->attribute( "tbarcode.height", "0" ).toInt() ); +} + +void TBarcodeOptions::save( QDomElement* tag ) +{ + tag->setAttribute( "tbarcode.modulewidth", this->moduleWidth() ); + tag->setAttribute( "tbarcode.escape", this->escape() ); + tag->setAttribute( "tbarcode.above", this->above() ); + tag->setAttribute( "tbarcode.autocorrect", this->autocorrect() ); + tag->setAttribute( "tbarcode.checksum", this->checksum() ); + tag->setAttribute( "tbarcode.height", this->height() ); +} + +const TBarcodeOptions& TBarcodeOptions::operator=( const BarkodeEngineOptions& rhs ) +{ + const TBarcodeOptions* tbarcode = (dynamic_cast<const TBarcodeOptions*>(&rhs)); + + this->m_escape = tbarcode->m_escape; + this->m_above = tbarcode->m_above; + this->m_autocorrect = tbarcode->m_autocorrect; + this->m_checksum = tbarcode->m_checksum; + this->m_modulewidth = tbarcode->m_modulewidth; + this->m_height = tbarcode->m_height; + + return *this; +} + +TBarcode2::TBarcode2() + : PixmapBarcode() +{ + +} + +TBarcode2::~TBarcode2() +{ + +} + +const TBarcode2 & TBarcode2::operator=( const BarkodeEngine & rhs ) +{ + const TBarcode2* barcode = dynamic_cast<const TBarcode2*>(&rhs); + + if( barcode ) + { + m_options = barcode->m_options; + } + + return *this; +} + +bool TBarcode2::createPostscript( char** postscript, long* postscript_size ) +{ + QString cmd; + const char* text; + + const TBarcodeOptions* tbarcode = (dynamic_cast<TBarcodeOptions*>(barkode->engine()->options())); + if( !tbarcode ) + return false; + + if( !barkode->textVisible() ) + text = "hide"; + else if( tbarcode->above() ) + text = "above"; + else + text = "below"; + + cmd = cmd.sprintf( "tbarcode -f PS -b %s -d %s -t %s --translation=%s --autocorrect=%s --modulewidth=%.3f -h %i --checkdigit=%i --72dpiraster\n", + barkode->type().latin1(), KShellProcess::quote( barkode->parsedValue() ).latin1(), + text, tbarcode->escape() ? "on" : "off", + tbarcode->autocorrect() ? "on" : "off", + tbarcode->moduleWidth(), + tbarcode->height(), + tbarcode->checksum() ); + + qDebug( "Cmd = " + cmd ); + if( !readFromPipe( cmd.latin1(), postscript, postscript_size ) ) + return false; + + return true; +} + +QRect TBarcode2::bbox( const char* postscript, long postscript_size ) +{ + const char* gs_bbox = "gs -sDEVICE=bbox -sNOPAUSE -q %1 -c showpage quit 2>&1"; + + char* buffer = NULL; + long len = 0; + QRect size; + + KTempFile psfile( QString::null, ".ps" ); + psfile.file()->writeBlock( postscript, postscript_size ); + psfile.file()->close(); + + if( !readFromPipe( QString( gs_bbox ).arg( psfile.file()->name() ).latin1(), &buffer, &len ) || !len ) + { + psfile.unlink(); + return QRect( 0, 0, 0, 0 ); + } + else + psfile.unlink(); + + size = PixmapBarcode::bbox( buffer, len ); + free( buffer ); + + return size; + +} + |