NAME

OpenGL::Image - v1.03 copyright 2007 Graphcomp - ALL RIGHTS RESERVED
Author: Bob "grafman" Free - grafman@graphcomp.com
Contributor: Geoff Broadwell

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

DESCRIPTION

This module is an extensible wrapper to abstract imaging interfaces

By default, this module uses the OpenGL::Image::Targa module; support for
other imaging libraries may be added by providing plug-in modules
in the OpenGL/Image folder.

An OpenGL::Image::Magick module is also provided for use with
PerlMagick.  For best performance, ImageMagick 6.3.5 or newer should
be installed.

SYNOPSIS

##########
# Check for installed imaging engines
use OpenGL::Image;

# Get hashref of installed imaging engines
# Keys are engine names; values are info hashes, including version,
# priority (1 .. n, 1 is highest), module (Perl module name)
# and description.
# Priority can be set using Engines.lst (see INSTALL); otherwise
# 'Targa' has top priority, and others are in unspecified order.
my $engine_hashref = OpenGL::Image::GetEngines();

# In list context, returns list of info hashes sorted by engine
# priority; info hash does not include a priority value.
my @sorted_engine_info = OpenGL::Image::GetEngines();

# Check for a specific engine and optional version support
# Returns an info hashref for the engine if available; otherwise undef.
my $info_hashref = OpenGL::Image::HasEngine('Magick','6.3.5');


##########
# Load texture - defaults to highest priority engine if none specified;
# if Engines.lst is not specified, the highest priority is the Targa engine.
my $tex = new OpenGL::Image(source=>'test.tga');

# Get GL info
my($ifmt,$fmt,$type) = $tex->Get('gl_internalformat','gl_format','gl_type');
my($w,$h) = $tex->Get('width','height');

# Test if power of 2
if (!$tex->IsPowerOf2()) return;

# Set texture  
glTexImage2D_c(GL_TEXTURE_2D, 0, $ifmt, $w, $h, 0, $fmt, $type, $tex->Ptr());


##########
# Modify GL frame using ImageMagick
my $frame = new OpenGL::Image(engine=>'Magick',width=>$w,height=>$h);

# Get default GL info
my($def_fmt,$def_type) = $tex->Get('gl_format','gl_type');

# Read frame pixels
glReadPixels_c(0, 0, $width, $height, $def_fmt, $def_type, $frame->Ptr());

# Sync native image buffer
# Must use this prior to making native calls
$frame->Sync();

# Modify frame pixels
$frame->Native->Blur();

# Sync OGA
# Must use this atfer all native calls are done
$frame->SyncOGA();

# Draw back to frame
glDrawPixels_c(0, 0, $width, $height, $def_fmt, $def_type, $frame->Ptr());


##########
# Save GL frame
my $image = new OpenGL::Image(width=>$width,height=>$height);

# Read frame pixels
glReadPixels_c(0, 0, $width, $height, $def_fmt, $def_type, $image->Ptr());

# Save file - automatically does a Sync before write
$image->Save('MyImage.tga');


##########
# Get/Set normalized pixels

my($r,$g,$b,$a) = $img->GetPixel($x,$y);

$img->SetPixel($x,$y, 1.0, 0.5, 0.0, 1.0);

# Sync cache after done modifying pixels
$frame->Sync();


##########
# Methods defined in OpenGL::Image::Common:

# Get native engine object
my $obj = $img->Native;
$obj->Quantize() if ($obj);

# Alternately (Assuming the native engine supports Blur):
$img->Native->Blur();

# Test if image width is a power of 2
if ($img->IsPowerOf2());

# Test if all listed values are a power of 2
if ($img->IsPowerOf2(@list));

# Get largest power of 2 size within dimensions of image
my $size = $img->GetPowerOf2();

# Get one or more parameter values
my @values = $img->Get(@params);

# Return the image's cache as an OpenGL::Array object.
# Note: OGA may change after a cache update
my $oga = $img->GetArray();

# Return a C pointer to the image's cache.
# For use with OpenGL's "_c" APIs.
# Note: pointer may change after a cache update
$img->Ptr();


##########
# Supported parameters:

# version - version of the engine
# source - source image, if defined
# width - width of image in pixels
# height - height of image in pixels
# pixels - number of pixels
# components - number of pixel components
# size - bytes per component
# length - cache size in bytes
# endian - 1 if big endian; otherwise 0
# alpha - 1: normal alpha channel, -1: inverted alpha channel; 0: none
# flipped - 1 bit set if cache ordered top to bottom; others reserved
# gl_internalformat - internal GL pixel format. eg: GL_RGBA8, GL_RGBA16
# gl_format - GL pixel format. eg: GL_RGBA, GL_BGRA
# gl_type - GL data type.  eg: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT


##########
# APIs and Methods defined in engine modules:

# Get engine version
my $ver = OpenGL::Image::ENGINE_MODULE::EngineVersion();

# Sync the image cache after a write.
# Used by some engines for paged caches; otherwise a NOP.
$img->Sync();

# Save the image to a PNG file (assuming the engine supports PNGs)
$img->Save('MyImage.png');

# Get image blob.
my $blob = $img->GetBlob();