Files
dzc 0a78ff1b58 feat: Windows PavoApi ffi 直打后端(Phase 3 代码完成,待实机验收)
- 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 个全过
2026-09-21 12:19:07 +08:00

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);
}