Source file: /~heha/hs/spe.zip/src/escp.h

#pragma once

#include <windows.h>
#include <setjmp.h>

struct cRECT:RECT{
 inline int Width() const{return right-left;};
 inline int Height()const{return bottom-top;};
};

struct DEFAULTS{
 BYTE font;	// Default-Font
 BYTE lq;	// Weitere Font-Bits
 BYTE ss;	// Hoch/Tiefstellung
 BYTE charset;	// Nationalzeichenersetzung ESC "R"
 BYTE cpi;	// Codeseite (24-Nadel-Drucker)
 BYTE color;	// Farbbandauswahl
 BYTE msb;	// MSB-Behandlung, siehe unten
 BYTE crlf;	// CRLF-Behandlung
 short skip;	// Perforationssprung
 short ly;	// Zeilenabstand
 POINTS paper;	// Papiergröße
};

struct ESCP{
 BYTE ReadChar() const;
 void ReadChar(BYTE*,int) const;
 void Save(DEFAULTS*def) const;
 void Init(DEFAULTS*def);
 static void Default(DEFAULTS*def);
 bool Filter();	// schaufelt Daten von <f> nach <dc>
 POINT Offset;
 int mode;	// 1 = ESC/P (9-Nadel-Drucker), 2 = ESC/P2 (24-Nadel-Drucker)
 HANDLE f;	// Datei-Handle (hier: COM-Port-Handle)
 HDC dc;	// Drucker-Gerätekontext (bereits mit OpenDoc() eröffnet)
private:	// Alle Maße in 1/2160 Zoll
 bool HandleEsc();	// Handler für ESC
 bool HandleEscK();	// Handler für ESC '('
 void Printable(BYTE c);
 int GetCw() const;	// Zeichenbreite in 1/240 Zoll ermitteln
 int GetCx() const;	// Zeichenabstand in 1/240 Zoll ermitteln
 void Print();		// Angesammelte Zeichen ausgeben
 void FormFeed();
 void LineFeed();
 void SetPosX(int);	// ignoriert Randüberschreitungen
 void SetPosY(int);	// ignoriert Randüberschreitung oben, löst FormFeed() aus bei Randüberschreitung unten
 void SetFontBit(BYTE bitno,BYTE state);
 void SetFormSkip(int skip);	// setzt Perforationssprung und damit margin.top und margin.bottom
 void SetTabs(int t[],int tlen, int factor);
 static void SetEqualTabs(int t[], int tlen, int diff);
 static int FindTab(const int t[], int tlen, int pos);
 void HandleESCe();
 void HandleESCf();
 int ci;	// Zeichenpuffer-Index (Füllstand)
 int cx;	// Position des 1. Zeichens
 int ly;	// Zeilenabstand in 1/1080 Zoll (1080 = 15 * 72)
 BYTE font;	// Bit 0 = Elite (12cpi)  Bit 1 = doppelt hoch   Bit 2 = condensed (17cpi)  Bit 3 = fett,
		// Bit 4 = Doppeldruck    Bit 5 = doppelt breit  Bit 6 = kursiv             Bit 7 = unterstrichen
 BYTE lq;	// Bit 0: (N)LQ,                  Bit 1: Proportionalschrift
		// Bit 2: 15-cpi-Schrift (ESC g), Bit 3: durchstreichen
		//				  Bit 5: Doppelte Breite für 1 Zeile
 BYTE ss;	// 0=normal, 1=hochgestellt, 2=tiefgestellt, Schriftgröße jeweils 2/3
 BYTE charset;	// 0=USA, 1=FR, 2=DE, 3=UK, 4=DK, 5=SW, 6=IT, 7=ES, 8=JP, 9=NO, 10=DK2, 11=ES2, 12=Lateinamerika
 BYTE cpi;	// aktuelle Kodeseite
 BYTE color;	// Farbe sw/ma/tk/vi(=ma+tk)/ge/rt(=ge+ma)/gn(=ge+tk) 0..6
 BYTE msb;	// Vorbehandlung der Daten (wahrscheinlich gedacht für 7-bit-serielle Schnittstellen)
		// Bit 0: Zwangs-Setzen oder Löschen von Datenbit 7 entsprechend Bit 7
		// Bit 1: Kodes im Bereich 128..159 sowie 255 als Steuerkodes (0..31 sowie 127) interpretieren
		// Bit 2: Während ESC-Dekodierung alle Folgezeichen des Bit 7 berauben, wenn Bit 1 eingeschaltet (wirklich?)
		// Bit 3: Kodes 0..6,16,17,21-23,25,26,28-31 sind druckbare Zeichen, sonst nichts
		// Bit 4: Kodes 128..159 sind nichts, sonst Zeichen
		// Bit 5: Kodes 128..159 sind Steuerkodes (ESC m - geht vor Bit 4)
		// Bit 7: siehe Bit 0
 BYTE crlf;	// Vorbehandlung der Zeilenschaltung
		// Bit 0: Auto CR bei LF (Unix, allgemein)
		// Bit 1: Auto LF bei CR (Mac, BASIC)
		// Bit 2: Auto CR+LF bei übervoller Zeile (Leitung "AUTO FEED XT")
 BYTE pagectl;	// StartPage()/EndPage()-Steuerung
		// Bit 0: StartPage() gegeben
 BYTE vtc;	// Vertical Tab Channel = erster Index für <vfu>
 int espace;	// Extra-Leeraum nach jedem NLQ-Zeichen
 POINT pos;	// aktuelle Schreibposition bezüglich margin.left und margin.top
 cRECT margin;	// Seitenränder
 SIZE paper;	// Papiergröße
 int unit;	// Vielfaches von 1/2160 Zoll, beeinflusst ESC: (V (v \ $ (C (c MOVX MOVY,
		// 0 = Standardwert benutzen (unterschiedlich pro Funktion)
 int scale(int,int) const;
 static inline BYTE AB(BYTE c) {if (c>='0') c-='0'; return c;};	// ASCII-Ziffer nach Binär-Ziffer
 static int SH(BYTE*p) {int i=*(short*)p; if (i>=16384) i-=32768; return i;};	// Lese Signed Short (-16K..16K) von Byte-Pointer ("ESC (")
// große Objekte hinten für kleine Offsets
 WORD cp[4];	// 4 Kodeseiten von ESC ( t; Sonderwerte: 0 = italic ??, 1 = benutzerdefinierte Zeichen
 int ht[32];	// Horizontale Tabulatoren, nullterminiert oder ausgefüllt
 int vfu[8][16];// "vertical formatting unit" = Vertikale Tabulatoren, nullterminiert oder ausgefüllt
 BYTE cb[256];	// Zeichenpuffer für druckbare Zeichen
 mutable jmp_buf env;	// Rücksprung-Daten
};
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded