PDL-IO-Image
view release on metacpan or search on metacpan
if (RETVAL == NULL) croak("FAIL: Newz failed");
FIBITMAP *newdib = FreeImage_Clone(self->dib);
if (newdib == NULL) croak("FAIL: FreeImage_Clone failed");
RETVAL->dib = newdib;
}
OUTPUT:
RETVAL
void
dump_bitmap(PDL::IO::Image self, int target_bpp=0)
PPCODE:
{
SV *bmp_sv, *pal_sv;
unsigned char *bmp = NULL, *pal = NULL;
unsigned w, h, bpp, cu, it, sz, szp, szl, y, i;
FIBITMAP *newdib = NULL, *b = NULL;
/* FIRST: we need FIT_BITMAP */
it = FreeImage_GetImageType(self->dib);
if (it==FIT_RGB16 || it==FIT_RGBA16 || it==FIT_RGBF || it==FIT_RGBAF) {
newdib = FreeImage_ToneMapping(self->dib, FITMO_REINHARD05, 0, 0);
const char*
free_image_version(SV *class)
CODE:
RETVAL = FreeImage_GetVersion();
OUTPUT:
RETVAL
void
format_list(SV *class)
PPCODE:
{
int i;
for(i = 0; i < FreeImage_GetFIFCount(); i++) {
if(FreeImage_IsPluginEnabled((FREE_IMAGE_FORMAT)i)) {
const char *f = FreeImage_GetFormatFromFIF((FREE_IMAGE_FORMAT)i);
XPUSHs(sv_2mortal(newSVpvn(f, strlen(f))));
}
}
}
unsigned
get_dots_per_meter_x(PDL::IO::Image self)
CODE:
RETVAL = FreeImage_GetDotsPerMeterX(self->dib);
OUTPUT:
RETVAL
void
set_dots_per_meter_x(PDL::IO::Image self, unsigned res)
PPCODE:
FreeImage_SetDotsPerMeterX(self->dib, res);
XPUSHs(ST(0)); /* return self */
unsigned
get_dots_per_meter_y(PDL::IO::Image self)
CODE:
RETVAL = FreeImage_GetDotsPerMeterY(self->dib);
OUTPUT:
RETVAL
void
set_dots_per_meter_y(PDL::IO::Image self, unsigned res)
PPCODE:
FreeImage_SetDotsPerMeterY(self->dib, res);
XPUSHs(ST(0)); /* return self */
const char*
get_color_type(PDL::IO::Image self)
CODE:
RETVAL = _fic2str(FreeImage_GetColorType(self->dib));
OUTPUT:
RETVAL
int
get_transparent_index(PDL::IO::Image self)
CODE:
RETVAL = FreeImage_GetTransparentIndex(self->dib);
OUTPUT:
RETVAL
void
set_transparent_index(PDL::IO::Image self, int index)
PPCODE:
FreeImage_SetTransparentIndex(self->dib, index);
XPUSHs(ST(0)); /* return self */
void
flip_horizontal(PDL::IO::Image self)
PPCODE:
if(!FreeImage_FlipHorizontal(self->dib)) {
warn("FreeImage_FlipHorizontal failed");
}
XPUSHs(ST(0)); /* return self */
void
flip_vertical(PDL::IO::Image self)
PPCODE:
if(!FreeImage_FlipVertical(self->dib)) {
warn("FreeImage_FlipVertical failed");
}
XPUSHs(ST(0)); /* return self */
void
convert_image_type(PDL::IO::Image self, SV * dst_image_type, int scale_linear=1)
PPCODE:
{
FREE_IMAGE_TYPE fit = _sv2fit(dst_image_type);
if (fit == FIT_UNKNOWN) {
warn("invalid dst_image_type");
}
else {
FIBITMAP *newdib = FreeImage_ConvertToType(self->dib, fit, scale_linear);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertToType (fit=%d) failed", fit);
}
}
XPUSHs(ST(0)); /* return self */
}
void
adjust_colors(PDL::IO::Image self, double brightness=0, double contrast=0, double gamma=0, int invert=0)
PPCODE:
if(!FreeImage_AdjustColors(self->dib, brightness, contrast, gamma, invert)) {
warn("FreeImage_AdjustColors failed");
}
XPUSHs(ST(0)); /* return self */
void
tone_mapping(PDL::IO::Image self, int tmo, double p1=0, double p2=0)
PPCODE:
if (tmo == FITMO_DRAGO03 || tmo == FITMO_REINHARD05 || tmo == FITMO_FATTAL02) {
FIBITMAP *newdib = FreeImage_ToneMapping(self->dib, tmo, p1, p2);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ToneMapping (tmp=%d) failed", tmo);
}
}
else {
warn("invalid tone mapping operator");
}
XPUSHs(ST(0)); /* return self */
void
rotate(PDL::IO::Image self, double angle, ...)
PPCODE:
{
FIBITMAP *newdib = NULL;
unsigned bpp = FreeImage_GetBPP(self->dib);
FREE_IMAGE_TYPE fit = FreeImage_GetImageType(self->dib);
if (items > 2) {
switch(fit) {
case FIT_BITMAP:
switch(bpp) {
case 8:
self->dib = newdib;
}
else {
warn("FreeImage_Rotate failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_dither(PDL::IO::Image self, int algorithm=FID_FS)
PPCODE:
{
FIBITMAP *newdib = FreeImage_Dither(self->dib, algorithm);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_Dither failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_threshhold(PDL::IO::Image self, unsigned threshold=127)
PPCODE:
{
FIBITMAP *newdib = FreeImage_Threshold(self->dib, (BYTE)threshold);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_Threshold failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_quantize(PDL::IO::Image self, int quantize=FIQ_WUQUANT)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ColorQuantize(self->dib, quantize);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ColorQuantize failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_4bpp(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo4Bits(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo4Bits failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_8bpp(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo8Bits(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo8Bits failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_8bpp_grey(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertToGreyscale(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertToGreyscale failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_16bpp_555(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo16Bits555(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo16Bits555 failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_16bpp_565(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo16Bits565(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo16Bits565 failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_24bpp(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo24Bits(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo24Bits failed");
}
XPUSHs(ST(0)); /* return self */
}
void
color_to_32bpp(PDL::IO::Image self)
PPCODE:
{
FIBITMAP *newdib = FreeImage_ConvertTo32Bits(self->dib);
if (newdib) {
if (self->dib) FreeImage_Unload(self->dib);
self->dib = newdib;
}
else {
warn("FreeImage_ConvertTo32Bits failed");
}
XPUSHs(ST(0)); /* return self */
}
void
rescale(PDL::IO::Image self, int dst_width=0, int dst_height=0, int filter=FILTER_CATMULLROM)
PPCODE:
{
if (dst_height<=0 && dst_width>0) {
double ratio = (double)dst_width / (double)FreeImage_GetWidth(self->dib);
dst_height = (int)floor(0.5 + ratio * (double)FreeImage_GetHeight(self->dib));
}
else if (dst_width<=0 && dst_height>0) {
double ratio = (double)dst_height / (double)FreeImage_GetHeight(self->dib);
dst_width = (int)floor(0.5 + ratio * (double)FreeImage_GetWidth(self->dib));
}
if (dst_height>0 && dst_width>0) {
}
else {
warn("FreeImage_Rescale failed");
}
}
XPUSHs(ST(0)); /* return self */
}
void
rescale_pct(PDL::IO::Image self, double dst_width_pct=0, double dst_height_pct=0, int filter=FILTER_CATMULLROM)
PPCODE:
{
int dst_height = (int)floor(0.5 + (double)FreeImage_GetHeight(self->dib) * dst_height_pct / 100.0);
int dst_width = (int)floor(0.5 + (double)FreeImage_GetWidth(self->dib) * dst_width_pct / 100.0);
if (dst_height<=0 && dst_width>0) {
double ratio = (double)dst_width / (double)FreeImage_GetWidth(self->dib);
dst_height = (int)floor(0.5 + ratio * (double)FreeImage_GetHeight(self->dib));
}
else if (dst_width<=0 && dst_height>0) {
double ratio = (double)dst_height / (double)FreeImage_GetHeight(self->dib);
}
else {
warn("FreeImage_Rescale failed");
}
}
XPUSHs(ST(0)); /* return self */
}
void
save(PDL::IO::Image self, SV * destination, SV * f=NULL, int flags=0);
PPCODE:
{
if (self->dib) {
FIMEMORY *hmem = NULL;
BYTE *mem_buffer = NULL;
DWORD size_in_bytes = 0;
FREE_IMAGE_FORMAT fif = _sv2fif(f);
FREE_IMAGE_TYPE fit = FreeImage_GetImageType(self->dib);
if(SvROK(destination) && SvTYPE(SvRV(destination)) < SVt_PVAV) {
/* destination is a reference to scalar */
const-xs.inc view on Meta::CPAN
dTARGET;
#endif
STRLEN len;
int type;
IV iv;
/* NV nv; Uncomment this if you need to return NVs */
/* const char *pv; Uncomment this if you need to return PVs */
INPUT:
SV * sv;
const char * s = SvPV(sv, len);
PPCODE:
/* Change this to constant(aTHX_ s, len, &iv, &nv);
if you need to return both NVs and IVs */
type = constant(aTHX_ s, len, &iv);
/* Return 1 or 2 items. First is error message, or undef if no error.
Second, if present, is found value */
switch (type) {
case PERL_constant_NOTFOUND:
sv =
sv_2mortal(newSVpvf("%s is not a valid PDL::IO::Image macro", s));
PUSHs(sv);
( run in 0.908 second using v1.01-cache-2.11-cpan-5511b514fd6 )