setStyles method

List<int> setStyles(
  1. PosStyles styles, {
  2. bool atLineStart = true,
})

atLineStart (Vorgabe true) sagt, ob dieser Aufruf am Anfang einer Druckzeile steht. Nur dort nimmt der Drucker ESC a (Ausrichtung) ueberhaupt an; mitten in der Zeile verwirft er den Befehl wortlos. Der Bytestrom bekommt ihn trotzdem -- die Bytefolge soll sich dadurch nicht aendern --, aber der intern gemerkte Zustand darf sich NICHT auf den neuen Wert stellen: sonst haelt eine spaetere, echte Zeile die Ausrichtung faelschlich schon fuer gesetzt und unterlaesst den Befehl.

Implementation

List<int> setStyles(PosStyles styles, {bool atLineStart = true}) {
  List<int> bytes = [];
  if (styles.align != _styles.align) {
    bytes += latin1.encode(styles.align == PosAlign.left
        ? cAlignLeft
        : (styles.align == PosAlign.center ? cAlignCenter : cAlignRight));
    if (atLineStart) {
      _styles = _styles.copyWith(align: styles.align);
    }
  }

  if (styles.bold != _styles.bold) {
    bytes += styles.bold ? cBoldOn.codeUnits : cBoldOff.codeUnits;
    _styles = _styles.copyWith(bold: styles.bold);
  }
  if (styles.turn90 != _styles.turn90) {
    bytes += styles.turn90 ? cTurn90On.codeUnits : cTurn90Off.codeUnits;
    _styles = _styles.copyWith(turn90: styles.turn90);
  }
  if (styles.reverse != _styles.reverse) {
    bytes += styles.reverse ? cReverseOn.codeUnits : cReverseOff.codeUnits;
    _styles = _styles.copyWith(reverse: styles.reverse);
  }
  if (styles.underline != _styles.underline) {
    bytes +=
        styles.underline ? cUnderline1dot.codeUnits : cUnderlineOff.codeUnits;
    _styles = _styles.copyWith(underline: styles.underline);
  }

  // Set font
  if (styles.fontType != null && styles.fontType != _styles.fontType) {
    bytes += styles.fontType == PosFontType.fontB
        ? cFontB.codeUnits
        : cFontA.codeUnits;
    _styles = _styles.copyWith(fontType: styles.fontType);
  } else if (_font != null && _font != _styles.fontType) {
    bytes += _font == PosFontType.fontB ? cFontB.codeUnits : cFontA.codeUnits;
    _styles = _styles.copyWith(fontType: _font);
  }

  // Characters size
  if (styles.height.value != _styles.height.value ||
      styles.width.value != _styles.width.value) {
    bytes += Uint8List.fromList(
      List.from(cSizeGSn.codeUnits)
        ..add(PosTextSize.decSize(styles.height, styles.width)),
    );
    _styles = _styles.copyWith(height: styles.height, width: styles.width);
  }

  bytes += cKanjiOff.codeUnits;

  // Set local code table
  //
  // Die Ausrichtung wird hier bewusst NICHT nochmal mitgeschrieben (frueher
  // `copyWith(align: styles.align, ...)`): das hebelte den Schutz oben aus,
  // der eine verworfene Ausrichtung (mitten in der Zeile) gerade NICHT
  // gemerkt haben will -- dieser Zweig lief unabhaengig vom `atLineStart`
  // immer mit.
  if (styles.codeTable != null) {
    bytes += Uint8List.fromList(
      List.from(cCodeTable.codeUnits)
        ..add(_profile.getCodePageId(styles.codeTable)),
    );
    _styles = _styles.copyWith(codeTable: styles.codeTable);
  } else if (_codeTable != null) {
    bytes += Uint8List.fromList(
      List.from(cCodeTable.codeUnits)
        ..add(_profile.getCodePageId(_codeTable)),
    );
    _styles = _styles.copyWith(codeTable: _codeTable);
  }

  return bytes;
}