diff options
Diffstat (limited to 'dviware/epson/eps-0.2/eps/epson.c')
-rw-r--r-- | dviware/epson/eps-0.2/eps/epson.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dviware/epson/eps-0.2/eps/epson.c b/dviware/epson/eps-0.2/eps/epson.c new file mode 100644 index 0000000000..8963e0baeb --- /dev/null +++ b/dviware/epson/eps-0.2/eps/epson.c @@ -0,0 +1,157 @@ +static const char rcsid[] = "$Header: c:/mctex/imagen/rcs/epson.c 1.1 91/08/05 23:40:37 ROOT_DOS Exp Locker: ROOT_DOS $"; + +/* Copyright (c) 1993 Neal Becker + * All rights reserved. + * Permission to copy for any purpose is hereby granted + * so long as this copyright notice remains intact. +*/ + +/* +$Log: epson.c $ + * Revision 1.1 91/08/05 23:40:37 ROOT_DOS + * Initial revision + * +*/ + +#include "epson.h" + + +#if defined( __MSDOS__ ) && !defined( __GNUC__ ) +# include <mem.h> +#endif /* __MSDOS__ */ + +#include <stdlib.h> +#include "PROTO.h" + +BitMapRow::BitMapRow() { + if( ( Bits = new char[ HBytes ] ) == 0 ) + GripeOutOfMemory( HBytes, "BitMap" ); + Printed = Length = 0; + Start = MaxShort; +} + +void BitMapRow::Clear() { + memset( Bits, 0, HBytes ); + Printed = Length = 0; + Start = MaxShort; +} + +BitMap::BitMap() { + for( int i = 0; i < ( BitMapRows + ExtraRows ); i++ ) { + if( ( Rows[ i ] = new BitMapRow ) == NULL ) + GripeOutOfMemory( sizeof( BitMapRow ), "BitMap" ); + } +} + +void BitMap::Clear() { + for( int i = 0; i < ( BitMapRows + ExtraRows ); i++ ) + Rows[ i ]->Clear(); +} + +#if defined __MSDOS__ && !defined( __GNUC__ ) + +#include <alloc.h> +void ReportMem() { + fprintf( stderr,"%lX Bytes Left\n", (unsigned long)farcoreleft() ); +} + +#else /* __MSDOS__ */ + +void ReportMem() {} + +#endif /* __MSDOS__ */ + +void epson::PrintBitMap( BitMap& theBitMap ) { + for( DviPos = 0; DviPos < BitMapRows; DviPos ++ ) { + if( theBitMap.NeedToPrint( DviPos ) ) + PrintRow( theBitMap, DviPos ); + } + if( ferror( fp ) ) + panic( "error writing output" ); +} + +void epson::PrintRow( BitMap& theBitMap, int Row ) { + SetVpos( Row ); + Output8Rows( theBitMap, Row ); +}; + +void epson::Output8Rows( BitMap& theBitMap, int Row ) { + int FirstBytePos = theBitMap.FindFirst( Row ); + int RealSpaces = FirstBytePos / 3; + int TotalSpaces = RealSpaces + LeftMarginSpaces; + int HByte = 0; /* current byte pos */ + if( TotalSpaces > 0 ) { + if( HasFastSpace ) { + fputs( "\x1b" "f0", fp ); + fputc( TotalSpaces, fp ); + } + else { + for( int i = 0; i < TotalSpaces; i++ ) + fputc( ' ', fp ); + } + HByte += RealSpaces * 3; + } + int LastBytePos = theBitMap.FindLength( Row ); + int NumBits = 8 * ( LastBytePos - HByte + 1 ); + char n1 = NumBits & 0xff; + char n2 = (unsigned)(NumBits) >> 8; + fputs( "\x1b" "*" "\x3", fp ); + fputc( n1, fp ); + fputc( n2, fp ); + char Bytes[ 8 ]; + for( ; HByte <= LastBytePos; HByte++ ) { + Encode8Bytes( theBitMap, Row, HByte, Bytes ); + for( int HBit = 7; HBit >= 0; HBit-- ) + fputc( Bytes[ HBit ], fp ); + } + Eol(); + for( int V = 0; V < 8; V++ ) { + int TheRow = Row + ( V * 3 ); + if( TheRow >= BitMapRows ) break; + theBitMap.Mark( TheRow ); + } +} + + +void epson::Encode8Bytes( BitMap& theBitMap, int Row, int HByte, char Bytes[ 8 ] ) { + memset( Bytes, 0, 8 ); + for( int VBit = 0; VBit < 8; VBit++ ) { + int TheRow = Row + ( VBit * 3 ); + if( TheRow >= BitMapRows ) break; + char TheChar = theBitMap.Rows[ TheRow ]->Bits[ HByte ]; + char TheMask = BitMask[ 7 - VBit ]; + for( int HBit = 0; HBit <= 7; HBit++ ) + if( TheChar & BitMask[ HBit ] ) + Bytes[ HBit ] |= TheMask; + } +} + +int BitMap::FindLength( int Row ) { + for( int i = 0, l = 0; i < 8; i++ ) { + int TheRow = Row + ( i * 3 ); + if( TheRow >= BitMapRows ) break; + l = max( l, Rows[ TheRow ]->Length ); + } + return l; +} + +int BitMap::FindFirst( int Row ) { + for( int i = 0, l = 0xff; i < 8; i++ ) { + int TheRow = Row + ( i * 3 ); + if( TheRow >= BitMapRows ) break; + l = min( l, Rows[ TheRow ]->Start ); + } + return l; +} + +void epson::SetVpos( int n ) { + while( n - PrintPos > 255 ) + Vaddv( 255 ); + Vaddv( n - PrintPos ); +} + +void epson::Vaddv( int n ) { + fputs( "\x1b" "J", fp ); + fputc( n, fp ); + PrintPos += n; +} |