/* * libptouch.h — public C API * * Author: knb * Email: knb@artif.org */ /** * libptouch — Brother P-touch ラスター印刷 (USB) 用 C API * * 対象例: PT-P900W(560 ドットヘッド)、PT-P750W / PT-P710BT(128 ドットヘッド)。 * 実装は src/lib/libptouch_*.c を参照。 */ #ifndef LIBPTOUCH_H #define LIBPTOUCH_H #include "libptouch_version.h" #include #include #include #ifdef __cplusplus extern "C" { #endif /** 不透明コンテキスト(接続状態・最終エラー文字列を保持) */ typedef struct libptouch_ctx libptouch_ctx; typedef enum { LIBPTOUCH_OK = 0, LIBPTOUCH_ERR_NOMEM = 1, LIBPTOUCH_ERR_ARG = 2, LIBPTOUCH_ERR_USB = 3, LIBPTOUCH_ERR_IO = 4, LIBPTOUCH_ERR_UNSUPPORTED = 5, LIBPTOUCH_ERR_NOT_FOUND = 6, LIBPTOUCH_ERR_IMAGE = 7, } libptouch_err_t; /** * リファレンス上の系統(PT-P750W/P710BT = P700、PT-P900 系 = P900)。 * DPI の値で分岐する代わりに、この系統を使う。 */ typedef enum { LIBPTOUCH_FAMILY_UNKNOWN = 0, /** PT-P750W / PT-P710BT(cv_ptp750w_710bt_jpn_raster_102.pdf 系) */ LIBPTOUCH_FAMILY_P700 = 1, /** PT-P900 / P900W / P950NW / P910BT 等(cv_ptp900_jpn_raster_102.pdf 系) */ LIBPTOUCH_FAMILY_P900 = 2, } libptouch_printer_family_t; /** lsusb 例: PT-P900W — Brother Industries, Ltd (04f9:2085) */ #define LIBPTOUCH_USB_VID_BROTHER 0x04f9u #define LIBPTOUCH_USB_PID_PTP900W 0x2085u /** PT-P750W / PT-P710BT(cv_ptp750w_710bt_jpn_raster_102.pdf Appendix A) */ #define LIBPTOUCH_USB_PID_PTP750W 0x2062u #define LIBPTOUCH_USB_PID_PTP710BT 0x20afu libptouch_ctx *libptouch_create(void); void libptouch_destroy(libptouch_ctx *ctx); /** * 系統の短い英語ラベル("p700" / "p900" / "unknown")。UI やログ用。 */ const char *libptouch_printer_family_label(libptouch_printer_family_t family); /** 人が読める英語メッセージ(スレッド非安全: ctx ごと) */ const char *libptouch_strerror(const libptouch_ctx *ctx); libptouch_err_t libptouch_last_error(const libptouch_ctx *ctx); /** * USB でプリンタを開く(VID/PID で先頭の一致デバイスを開く。libusb のみ)。 */ libptouch_err_t libptouch_open_usb_vid_pid(libptouch_ctx *ctx, uint16_t vid, uint16_t pid); /** * 既定機種(@ref LIBPTOUCH_USB_VID_BROTHER / @ref LIBPTOUCH_USB_PID_PTP900W)を開く。 * 別機種は @ref libptouch_open_usb_vid_pid に機種ごとの VID/PID を渡す。 */ libptouch_err_t libptouch_open_usb(libptouch_ctx *ctx); void libptouch_close(libptouch_ctx *ctx); /** * デバッグ用: USB bulk OUT へ実際に送ったバイト列を path に保存する。 * 各 @ref libptouch_print_raster ごとにファイルを上書きし直す(ジョブ先頭のチャンクで wb)。 * path が NULL または空文字で無効化。転送が成功したチャンクのみ追記する。 */ void libptouch_set_debug_dump_path(libptouch_ctx *ctx, const char *path); /** @ref libptouch_raster_params_t.flags 用: ESC i M bit6 でオートカット ON */ #define LIBPTOUCH_RASTER_FLAG_AUTO_CUT 0x01u /** @ref libptouch_raster_params_t.flags 用: ESC i K bit2 でハーフカット ON */ #define LIBPTOUCH_RASTER_FLAG_HALF_CUT 0x02u /** @ref libptouch_raster_params_t.flags 用: ChainPrint する(ESC i K bit3=0) */ #define LIBPTOUCH_RASTER_FLAG_CHAIN_PRINT 0x04u /** 既定: 011(オートカットしない・ハーフカットする・つなげて印刷する) */ #define LIBPTOUCH_RASTER_FLAGS_DEFAULT \ (LIBPTOUCH_RASTER_FLAG_HALF_CUT | LIBPTOUCH_RASTER_FLAG_CHAIN_PRINT) typedef struct { uint32_t width_dots; /**< ラスター幅(ドット) */ uint32_t height_dots; /**< ラスター高さ(ドット・走査方向は実装と機種に依存) */ uint8_t margin_mm; /**< 余白など(機種・仕様に合わせて使用) */ /** * LIBPTOUCH_RASTER_FLAG_*。未使用ビットは 0。 * 既定は @ref LIBPTOUCH_RASTER_FLAGS_DEFAULT(011: オートカットしない・ハーフカットする・つなげて印刷する)。 */ uint8_t flags; uint8_t _reserved[2]; /**< 将来用。0 にすること */ } libptouch_raster_params_t; typedef struct { uint8_t media_width_code; /**< status[10] */ uint8_t media_kind_code; /**< status[11] */ double print_dpi; /**< 印字幅方向 DPI(系統既定または設定ファイル上書き) */ double feed_dpi; /**< 送り方向 DPI(ESC i d の基準) */ double tape_width_mm; /**< 装着テープ幅(mm)。例: 3.5, 6, 9, 12, 18, 24, 36 */ uint16_t printable_dots; /**< 現在テープで印字可能な幅(ドット) */ uint16_t left_margin_dots; /**< 左余白(ドット) */ uint16_t right_margin_dots; /**< 右余白(ドット) */ uint16_t min_feed_dots; /**< 仕様上の最小送り量(ドット)。現在は 14 */ double min_feed_mm; /**< 最小送り量(mm) */ /** @ref libptouch_printer_family_t(系統不明時は @ref LIBPTOUCH_FAMILY_UNKNOWN) */ uint32_t printer_family; } libptouch_media_info_t; /** * バッファサイズとパラメータの整合性のみ検査(USB 不要)。--dry-run 用。 */ libptouch_err_t libptouch_check_raster(libptouch_ctx *ctx, const uint8_t *data, size_t data_len, const libptouch_raster_params_t *params); /** * 現在装着テープの情報を取得する(USB 接続済み必須)。 * ステータスと機種プロファイルからテープ幅・印字可能幅・最小余白量を返す。 */ libptouch_err_t libptouch_get_current_media_info(libptouch_ctx *ctx, libptouch_media_info_t *out_info); /** * 1bit packed ラスターの右側空白列を削減する(USB 不要)。 * 入力全体が白の場合は元サイズを維持して返す。 */ libptouch_err_t libptouch_trim_right_blank_columns( libptouch_ctx *ctx, const uint8_t *data, size_t data_len, const libptouch_raster_params_t *in_params, uint16_t right_padding_dots, uint8_t **out_raster, size_t *out_raster_bytes, libptouch_raster_params_t *out_params); /** * 1 ビット packed ラスターを USB で印刷(各機種のラスター PDF 準拠)。 * 印字前にステータスでテープ幅を読み、印刷可能ドット内に画像を中央配置する。 * width_dots は装着テープの印刷可能幅以下であること。系統は @ref libptouch_get_current_media_info * の printer_family で判別できる(P900 系は主に 360dpi 相当ドット列、P700 系は 180dpi 相当)。 * @param margin_mm 余白(フィード)量。0 のとき PDF の最小 1mm(14 ドット)相当を送る。 * @param params->flags bit0=オートカット、bit1=ハーフカット、bit2=チェーンプリントする。 * 指定なしは @ref LIBPTOUCH_RASTER_FLAGS_DEFAULT(011)。 * 印刷時は内部でドット列を転置する(テープ幅方向とバッファの縦横の対応)。 * @param data 1 行あたり width_dots ビットを ceil(width_dots/8) バイトで並べた連続領域 * @param data_len 期待値: height * row_bytes, row_bytes = (width_dots + 7) / 8 */ libptouch_err_t libptouch_print_raster(libptouch_ctx *ctx, const uint8_t *data, size_t data_len, const libptouch_raster_params_t *params); /** 二値化の既定しきい値(輝度 0–255、これ未満を黒ドット) */ #define LIBPTOUCH_PNG_DEFAULT_THRESHOLD 128u typedef struct { uint8_t threshold; /**< 輝度がこれ未満なら黒(1)、以上なら白(0) */ } libptouch_png_options_t; typedef struct { uint8_t threshold; /**< 輝度がこれ未満なら黒(1)、以上なら白(0) */ } libptouch_svg_options_t; /** * PNG ファイルを読み、1bit packed ラスターに変換する(libpng)。 * @param out_raster malloc 済みバッファのポインタを返す。不要時は @ref libptouch_free_raster で解放。 */ libptouch_err_t libptouch_png_file_to_raster(libptouch_ctx *ctx, const char *path, const libptouch_png_options_t *options, uint8_t **out_raster, size_t *out_raster_bytes, libptouch_raster_params_t *out_params); /** * SVG ファイルを現在装着中テープの印字可能幅に合わせて 1bit packed ラスターへ変換する * (librsvg + cairo)。 * @note 現在テープ幅を取得するため、事前に @ref libptouch_open_usb などで USB 接続が必要。 * @param out_raster malloc 済みバッファのポインタを返す。不要時は @ref libptouch_free_raster で解放。 */ libptouch_err_t libptouch_svg_file_to_raster_fit_current_tape( libptouch_ctx *ctx, const char *path, const libptouch_svg_options_t *options, uint8_t **out_raster, size_t *out_raster_bytes, libptouch_raster_params_t *out_params); void libptouch_free_raster(uint8_t *raster); /** ステータス情報リクエスト(ESC i S)の応答バイト数(cv_ptp900_jpn_raster_102.pdf) */ #define LIBPTOUCH_STATUS_LENGTH 32u /** * プリンタからステータスを読む(USB オープン済みであること)。 * 送信: 初期化 ESC @ のあと ESC i S。応答は @ref LIBPTOUCH_STATUS_LENGTH バイト固定。 */ libptouch_err_t libptouch_get_status(libptouch_ctx *ctx, uint8_t *status /* length @ref LIBPTOUCH_STATUS_LENGTH */); /** ステータス 32 バイトを人が読める形で出力(テープ幅・種類・色など) */ void libptouch_status_fprint(FILE *fp, const uint8_t *status /* length @ref LIBPTOUCH_STATUS_LENGTH */); #ifdef __cplusplus } #endif #endif /* LIBPTOUCH_H */