PDF-Make
view release on metacpan or search on metacpan
xs/watermark.xs view on Meta::CPAN
pdfmake_watermark_opts_t opts;
const char *text;
int i;
CODE:
PERL_UNUSED_VAR(class);
if (!SvOK(text_sv) || SvCUR(text_sv) == 0)
croak("Text required");
text = SvPV_nolen(text_sv);
if (!text || !*text)
croak("Text required");
pdfmake_watermark_opts_init(&opts);
for (i = 2; i < items; i += 2) {
const char *key;
SV *val;
const char *pos;
if (i + 1 >= items) break;
key = SvPV_nolen(ST(i));
val = ST(i + 1);
if (strEQ(key, "position")) {
if (!SvOK(val)) {
opts.position = PDFMAKE_WM_POS_CENTER;
} else if (SvIOK(val) || SvNOK(val)) {
opts.position = (pdfmake_wm_position_t)SvIV(val);
} else {
pos = SvPV_nolen(val);
if (strEQ(pos, "center")) opts.position = PDFMAKE_WM_POS_CENTER;
else if (strEQ(pos, "diagonal")) opts.position = PDFMAKE_WM_POS_DIAGONAL;
else if (strEQ(pos, "tile")) opts.position = PDFMAKE_WM_POS_TILE;
else if (strEQ(pos, "custom")) opts.position = PDFMAKE_WM_POS_CUSTOM;
else if (strEQ(pos, "top_left")) opts.position = PDFMAKE_WM_POS_TOP_LEFT;
else if (strEQ(pos, "top_center")) opts.position = PDFMAKE_WM_POS_TOP_CENTER;
else if (strEQ(pos, "top_right")) opts.position = PDFMAKE_WM_POS_TOP_RIGHT;
else if (strEQ(pos, "bottom_left")) opts.position = PDFMAKE_WM_POS_BOTTOM_LEFT;
else if (strEQ(pos, "bottom_center")) opts.position = PDFMAKE_WM_POS_BOTTOM_CENTER;
else if (strEQ(pos, "bottom_right")) opts.position = PDFMAKE_WM_POS_BOTTOM_RIGHT;
else if (strEQ(pos, "left_center")) opts.position = PDFMAKE_WM_POS_LEFT_CENTER;
else if (strEQ(pos, "right_center")) opts.position = PDFMAKE_WM_POS_RIGHT_CENTER;
else croak("Unknown position: %s", pos);
}
}
else if (strEQ(key, "opacity")) {
opts.opacity = SvNV(val);
}
else if (strEQ(key, "rotation")) {
opts.rotation = SvNV(val);
}
else if (strEQ(key, "scale")) {
opts.scale = SvNV(val);
}
else if (strEQ(key, "x_offset")) {
opts.x_offset = SvNV(val);
}
else if (strEQ(key, "y_offset")) {
opts.y_offset = SvNV(val);
}
else if (strEQ(key, "overlay")) {
opts.as_overlay = SvIV(val);
}
else if (strEQ(key, "font")) {
opts.font_name = SvPV_nolen(val);
}
else if (strEQ(key, "size")) {
opts.font_size = SvNV(val);
}
else if (strEQ(key, "color")) {
if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
AV *av = (AV*)SvRV(val);
if (av_len(av) >= 2) {
opts.color[0] = SvNV(*av_fetch(av, 0, 0));
opts.color[1] = SvNV(*av_fetch(av, 1, 0));
opts.color[2] = SvNV(*av_fetch(av, 2, 0));
}
}
}
else if (strEQ(key, "tile_spacing_x")) {
opts.tile_spacing_x = SvNV(val);
}
else if (strEQ(key, "tile_spacing_y")) {
opts.tile_spacing_y = SvNV(val);
}
}
RETVAL = pdfmake_watermark_text(NULL, text, &opts);
if (!RETVAL)
croak("PDF::Make::Watermark: failed to create text watermark");
OUTPUT:
RETVAL
pdfmake_watermark_t *
image(class, image_obj, ...)
const char *class
UV image_obj
PREINIT:
pdfmake_watermark_opts_t opts;
int i;
double width = 0.0;
double height = 0.0;
int have_width = 0;
int have_height = 0;
CODE:
PERL_UNUSED_VAR(class);
if (!image_obj)
croak("Image object required");
pdfmake_watermark_opts_init(&opts);
for (i = 2; i < items; i += 2) {
const char *key;
SV *val;
const char *pos;
if (i + 1 >= items) break;
key = SvPV_nolen(ST(i));
val = ST(i + 1);
if (strEQ(key, "width")) {
width = SvNV(val);
have_width = 1;
}
else if (strEQ(key, "height")) {
height = SvNV(val);
have_height = 1;
}
else if (strEQ(key, "position")) {
if (!SvOK(val)) {
opts.position = PDFMAKE_WM_POS_CENTER;
} else if (SvIOK(val) || SvNOK(val)) {
opts.position = (pdfmake_wm_position_t)SvIV(val);
} else {
pos = SvPV_nolen(val);
if (strEQ(pos, "center")) opts.position = PDFMAKE_WM_POS_CENTER;
else if (strEQ(pos, "diagonal")) opts.position = PDFMAKE_WM_POS_DIAGONAL;
else if (strEQ(pos, "tile")) opts.position = PDFMAKE_WM_POS_TILE;
else if (strEQ(pos, "custom")) opts.position = PDFMAKE_WM_POS_CUSTOM;
else if (strEQ(pos, "top_left")) opts.position = PDFMAKE_WM_POS_TOP_LEFT;
else if (strEQ(pos, "top_center")) opts.position = PDFMAKE_WM_POS_TOP_CENTER;
else if (strEQ(pos, "top_right")) opts.position = PDFMAKE_WM_POS_TOP_RIGHT;
else if (strEQ(pos, "bottom_left")) opts.position = PDFMAKE_WM_POS_BOTTOM_LEFT;
else if (strEQ(pos, "bottom_center")) opts.position = PDFMAKE_WM_POS_BOTTOM_CENTER;
else if (strEQ(pos, "bottom_right")) opts.position = PDFMAKE_WM_POS_BOTTOM_RIGHT;
else if (strEQ(pos, "left_center")) opts.position = PDFMAKE_WM_POS_LEFT_CENTER;
else if (strEQ(pos, "right_center")) opts.position = PDFMAKE_WM_POS_RIGHT_CENTER;
else croak("Unknown position: %s", pos);
}
}
else if (strEQ(key, "opacity")) {
opts.opacity = SvNV(val);
}
else if (strEQ(key, "rotation")) {
opts.rotation = SvNV(val);
}
else if (strEQ(key, "scale")) {
opts.scale = SvNV(val);
}
else if (strEQ(key, "x_offset")) {
opts.x_offset = SvNV(val);
}
else if (strEQ(key, "y_offset")) {
opts.y_offset = SvNV(val);
}
else if (strEQ(key, "overlay")) {
opts.as_overlay = SvIV(val);
}
else if (strEQ(key, "tile_spacing_x")) {
opts.tile_spacing_x = SvNV(val);
}
else if (strEQ(key, "tile_spacing_y")) {
opts.tile_spacing_y = SvNV(val);
}
}
if (!have_width)
croak("Width required for image watermark");
if (!have_height)
croak("Height required for image watermark");
RETVAL = pdfmake_watermark_image(NULL, (uint32_t)image_obj, width, height, &opts);
if (!RETVAL)
croak("PDF::Make::Watermark: failed to create image watermark");
OUTPUT:
RETVAL
pdfmake_watermark_t *
_new_text(class, doc, text, ...)
const char *class
SV *doc
const char *text
PREINIT:
pdfmake_watermark_opts_t opts;
int i;
CODE:
PERL_UNUSED_VAR(doc);
PERL_UNUSED_VAR(class);
pdfmake_watermark_opts_init(&opts);
/* Parse optional hash arguments */
for (i = 3; i < items; i += 2) {
if (i + 1 >= items) break;
const char *key = SvPV_nolen(ST(i));
SV *val = ST(i + 1);
if (strEQ(key, "position")) {
opts.position = (pdfmake_wm_position_t)SvIV(val);
}
else if (strEQ(key, "opacity")) {
opts.opacity = SvNV(val);
}
else if (strEQ(key, "rotation")) {
opts.rotation = SvNV(val);
}
else if (strEQ(key, "scale")) {
opts.scale = SvNV(val);
}
else if (strEQ(key, "x_offset")) {
opts.x_offset = SvNV(val);
}
else if (strEQ(key, "y_offset")) {
opts.y_offset = SvNV(val);
}
else if (strEQ(key, "overlay")) {
opts.as_overlay = SvIV(val);
}
else if (strEQ(key, "font")) {
opts.font_name = SvPV_nolen(val);
}
else if (strEQ(key, "size")) {
opts.font_size = SvNV(val);
}
else if (strEQ(key, "color")) {
if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
AV *av = (AV*)SvRV(val);
if (av_len(av) >= 2) {
opts.color[0] = SvNV(*av_fetch(av, 0, 0));
opts.color[1] = SvNV(*av_fetch(av, 1, 0));
opts.color[2] = SvNV(*av_fetch(av, 2, 0));
}
}
}
else if (strEQ(key, "tile_spacing_x")) {
opts.tile_spacing_x = SvNV(val);
}
else if (strEQ(key, "tile_spacing_y")) {
opts.tile_spacing_y = SvNV(val);
}
}
RETVAL = pdfmake_watermark_text(NULL, text, &opts);
if (!RETVAL)
croak("PDF::Make::Watermark: failed to create text watermark");
OUTPUT:
RETVAL
pdfmake_watermark_t *
_new_image(class, doc, image_obj, width, height, ...)
const char *class
SV *doc
UV image_obj
double width
double height
PREINIT:
pdfmake_watermark_opts_t opts;
int i;
CODE:
PERL_UNUSED_VAR(doc);
PERL_UNUSED_VAR(class);
pdfmake_watermark_opts_init(&opts);
/* Parse optional hash arguments */
for (i = 5; i < items; i += 2) {
if (i + 1 >= items) break;
const char *key = SvPV_nolen(ST(i));
SV *val = ST(i + 1);
if (strEQ(key, "position")) {
opts.position = (pdfmake_wm_position_t)SvIV(val);
}
else if (strEQ(key, "opacity")) {
opts.opacity = SvNV(val);
}
else if (strEQ(key, "rotation")) {
opts.rotation = SvNV(val);
}
else if (strEQ(key, "scale")) {
opts.scale = SvNV(val);
}
else if (strEQ(key, "x_offset")) {
opts.x_offset = SvNV(val);
}
else if (strEQ(key, "y_offset")) {
opts.y_offset = SvNV(val);
}
else if (strEQ(key, "overlay")) {
opts.as_overlay = SvIV(val);
}
else if (strEQ(key, "tile_spacing_x")) {
opts.tile_spacing_x = SvNV(val);
}
else if (strEQ(key, "tile_spacing_y")) {
opts.tile_spacing_y = SvNV(val);
}
}
RETVAL = pdfmake_watermark_image(NULL, (uint32_t)image_obj, width, height, &opts);
if (!RETVAL)
croak("PDF::Make::Watermark: failed to create image watermark");
OUTPUT:
RETVAL
void
DESTROY(self)
pdfmake_watermark_t *self
CODE:
pdfmake_watermark_free(self);
const char *
type(self)
pdfmake_watermark_t *self
CODE:
RETVAL = (self->type == PDFMAKE_WM_TYPE_TEXT) ? "text" : "image";
OUTPUT:
RETVAL
const char *
text_content(self)
pdfmake_watermark_t *self
CODE:
if (self->type == PDFMAKE_WM_TYPE_TEXT)
RETVAL = self->data.text.text ? self->data.text.text : "";
else
RETVAL = "";
OUTPUT:
RETVAL
int
position(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.position;
OUTPUT:
RETVAL
double
opacity(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.opacity;
OUTPUT:
RETVAL
double
rotation(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.rotation;
OUTPUT:
RETVAL
double
scale(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.scale;
OUTPUT:
RETVAL
double
x_offset(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.x_offset;
OUTPUT:
RETVAL
double
y_offset(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.y_offset;
OUTPUT:
RETVAL
int
overlay(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.as_overlay;
OUTPUT:
RETVAL
const char *
font(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.font_name ? self->opts.font_name : "Helvetica-Bold";
OUTPUT:
RETVAL
double
size(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.font_size;
OUTPUT:
RETVAL
SV *
color(self)
pdfmake_watermark_t *self
PREINIT:
AV *av;
CODE:
av = newAV();
av_push(av, newSVnv(self->opts.color[0]));
av_push(av, newSVnv(self->opts.color[1]));
av_push(av, newSVnv(self->opts.color[2]));
RETVAL = newRV_noinc((SV*)av);
OUTPUT:
RETVAL
double
width(self)
pdfmake_watermark_t *self
CODE:
if (self->type == PDFMAKE_WM_TYPE_IMAGE)
RETVAL = self->data.image.width;
else
RETVAL = self->data.text.text_width;
OUTPUT:
RETVAL
double
height(self)
pdfmake_watermark_t *self
CODE:
if (self->type == PDFMAKE_WM_TYPE_IMAGE)
RETVAL = self->data.image.height;
else
RETVAL = self->data.text.text_height;
OUTPUT:
RETVAL
double
tile_spacing_x(self)
pdfmake_watermark_t *self
CODE:
RETVAL = self->opts.tile_spacing_x;
xs/watermark.xs view on Meta::CPAN
filename = SvPV_nolen(ST(3));
if (self->type == PDFMAKE_WM_STAMP_BATES) {
text = pdfmake_stamp_expand_bates(
self->data.bates.prefix,
self->data.bates.current_number,
self->data.bates.digits,
self->data.bates.suffix
);
self->data.bates.current_number++;
} else {
text = pdfmake_stamp_expand_format(
self->data.text.format,
page_num,
total_pages,
filename
);
}
if (text) {
RETVAL = newSVpv(text, 0);
pdfmake_cfree(text);
} else {
XSRETURN_UNDEF;
}
OUTPUT:
RETVAL
##############################################################################
# Document watermark/stamp methods
##############################################################################
MODULE = PDF::Make PACKAGE = PDF::Make::Document
void
add_watermark(self, wm)
pdfmake_doc_t *self
pdfmake_watermark_t *wm
CODE:
if (pdfmake_doc_add_watermark(self, wm) != PDFMAKE_OK)
croak("PDF::Make::Document::add_watermark: failed");
void
apply_stamp(self, stamp)
pdfmake_doc_t *self
pdfmake_stamp_t *stamp
CODE:
if (pdfmake_doc_add_stamp(self, stamp) != PDFMAKE_OK)
croak("PDF::Make::Document::apply_stamp: failed");
BOOT:
{
HV *stash = gv_stashpv("PDF::Make::Watermark", GV_ADD);
PDFMAKE_REGISTER_GETTER(stash, "position", pdfmake_watermark_t, opts.position, PDFMAKE_FIELD_INT);
PDFMAKE_REGISTER_GETTER(stash, "opacity", pdfmake_watermark_t, opts.opacity, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "rotation", pdfmake_watermark_t, opts.rotation, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "scale", pdfmake_watermark_t, opts.scale, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "x_offset", pdfmake_watermark_t, opts.x_offset, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "y_offset", pdfmake_watermark_t, opts.y_offset, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "overlay", pdfmake_watermark_t, opts.as_overlay, PDFMAKE_FIELD_INT);
PDFMAKE_REGISTER_GETTER(stash, "font_size", pdfmake_watermark_t, opts.font_size, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "tile_spacing_x", pdfmake_watermark_t, opts.tile_spacing_x, PDFMAKE_FIELD_DOUBLE);
PDFMAKE_REGISTER_GETTER(stash, "tile_spacing_y", pdfmake_watermark_t, opts.tile_spacing_y, PDFMAKE_FIELD_DOUBLE);
}
( run in 1.241 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )