- lib/print/pavo/:PavoApiW_x64.dll 的 dart:ffi 绑定(结构体布局对齐 C#,W 后缀导出名回退兼容) - pavo_printer.dart:枚举(UTF-8/UTF-16 自动解码)/状态/色带信息/单卡直打/忙碌轮询(3 分钟超时)/LayerHolder 非托管内存管理 - pavo_backend.dart:全部 ffi 调用与像素转换跑在 Isolate.run,主 isolate HTTP 服务零阻塞 - lib/image/card_image.dart:PNG data URL → 纵横比选卡面 → 手动 alpha 铺白底 → BGR24/Gray8 紧凑像素(image 包 compositeImage 对全透明像素非 src-over 语义,改为逐像素混合对齐 C#) - windows/ 目录:从 Flutter SDK windows.tmpl 手动实例化(mac 上 flutter create 拒绝生成的绕过),窗口标题"饭卡打印助手" - windows/vendor/:收录 SDK 的 PavoApiW_x64.dll/PavoCardSDK_x64.dll/HeatTB3.dll/heatthcd.bin,CMake POST_BUILD 自动拷到 exe 旁 - backend.dart 工厂接通 Windows 分支;analyze 零问题、单测 12 个全过
28 lines
968 B
Dart
28 lines
968 B
Dart
import 'dart:io';
|
|
|
|
import '../server/protocol.dart';
|
|
import 'cups_backend.dart';
|
|
import 'pavo/pavo_backend.dart';
|
|
|
|
/// 打印后端抽象:Windows 走 HiTi PavoApi 直打(分层 BITMAP);macOS 走系统 CUPS 队列。
|
|
abstract class PrintBackend {
|
|
/// 后端名:pavo / cups / mock(暴露给日志)
|
|
String get name;
|
|
|
|
Future<PrinterStatus> getStatus();
|
|
|
|
Future<void> printOneCard(PrintRequest request);
|
|
}
|
|
|
|
/// manifest 里的后端名按操作系统报,与是否 mock 无关(对齐 C# 版行为)。
|
|
String osBackendName() => Platform.isWindows ? 'pavo' : 'cups';
|
|
|
|
/// 创建当前操作系统的真实打印后端(非 mock)。
|
|
/// PavoPrintBackend 构造不加载 DLL(延迟到实际调用的子 isolate 内),mac 上亦可安全实例化/分析。
|
|
PrintBackend createOsBackend({void Function(String line)? onLog}) {
|
|
if (Platform.isWindows) {
|
|
return PavoPrintBackend(onLog: onLog);
|
|
}
|
|
return CupsPrintBackend(onLog: onLog);
|
|
}
|