Files
ptouch_label/src/lib/libptouch_trim.c
knb 094f183994 ptouch-label/ptouch-print のオプション整理と trim-right 対応を反映
CLIヘルプ文言を簡潔化しつつ、右余白トリム機能と関連API・ドキュメント更新をまとめて取り込み、PNG/SVG/テンプレート経路での利用体験を揃える。

Made-with: Cursor
2026-04-16 19:09:37 +09:00

85 lines
2.3 KiB
C

/*
* libptouch — raster right blank trim
*
* Author: knb
* Email: knb@artif.org
*/
#include "libptouch_internal.h"
#include <stdlib.h>
#include <string.h>
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)
{
if (!ctx || !data || !in_params || !out_raster || !out_raster_bytes ||
!out_params) {
if (ctx)
ptouch_set_error(ctx, LIBPTOUCH_ERR_ARG, "null argument");
return LIBPTOUCH_ERR_ARG;
}
libptouch_err_t v = libptouch_check_raster(ctx, data, data_len, in_params);
if (v != LIBPTOUCH_OK)
return v;
uint32_t width = in_params->width_dots;
uint32_t height = in_params->height_dots;
size_t row_bytes = ((size_t)width + 7u) / 8u;
int32_t rightmost = -1;
for (uint32_t y = 0; y < height; y++) {
const uint8_t *row = data + (size_t)y * row_bytes;
for (int32_t x = (int32_t)width - 1; x >= 0; x--) {
uint8_t b = row[(size_t)x / 8u];
uint8_t bit = (uint8_t)(7u - ((uint32_t)x % 8u));
if (((b >> bit) & 1u) == 0)
continue;
if (x > rightmost)
rightmost = x;
break;
}
}
uint32_t new_width = width;
if (rightmost >= 0) {
uint32_t trimmed = (uint32_t)(rightmost + 1);
uint32_t padded = trimmed + (uint32_t)right_padding_dots;
if (padded > width)
padded = width;
if (padded < width)
new_width = padded;
}
size_t new_row_bytes = ((size_t)new_width + 7u) / 8u;
size_t total = new_row_bytes * (size_t)height;
uint8_t *out = (uint8_t *)calloc(1u, total);
if (!out) {
ptouch_set_error(ctx, LIBPTOUCH_ERR_NOMEM, "calloc raster failed");
return LIBPTOUCH_ERR_NOMEM;
}
uint8_t last_mask = 0xFFu;
if ((new_width % 8u) != 0u)
last_mask = (uint8_t)((0xFFu << (8u - (new_width % 8u))) & 0xFFu);
for (uint32_t y = 0; y < height; y++) {
const uint8_t *src = data + (size_t)y * row_bytes;
uint8_t *dst = out + (size_t)y * new_row_bytes;
memcpy(dst, src, new_row_bytes);
dst[new_row_bytes - 1u] &= last_mask;
}
*out_raster = out;
*out_raster_bytes = total;
out_params->width_dots = new_width;
out_params->height_dots = height;
out_params->margin_mm = in_params->margin_mm;
ptouch_set_error(ctx, LIBPTOUCH_OK, "");
return LIBPTOUCH_OK;
}