#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
};
Vorgefundene Kodierung: ANSI (CP1252) | 4
|
|