version 1.19, 2004/03/16 23:08:23
|
version 1.22, 2005/02/23 15:48:54
|
Line 26
|
Line 26
|
# |
# |
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
### |
|
|
=pod |
|
|
|
=head1 Syntax of randomlylabel commands |
|
|
|
=over 4 |
|
|
|
=item BGIMG |
|
|
|
/home/... file or href (href must contain http://...) |
|
Expected to be HTTP escaped |
|
|
|
=item OBJCOUNT |
|
|
|
a number |
|
|
|
=item OBJTYPE |
|
|
|
a colon seperated list of types, supported types are |
|
|
|
B<LINE> B<RECTANGLE> B<POLYGON> B<ARC> B<FILL> B<IMAGE> B<LABEL> |
|
|
|
=item OBJI<num> |
|
|
|
arguments for this OBJ |
|
|
|
some common arguments are |
|
|
|
=over 4 |
|
|
|
=item x y thickness |
|
|
|
are pixel values |
|
|
|
=item color |
|
|
|
a hexstring, without with out a leading # or x) |
|
|
|
=item filled |
|
|
|
boolean, (1 or 0) |
|
|
|
=back |
|
|
|
The argumants for the possible object types are |
|
|
|
=over 4 |
|
|
|
=item LINE |
|
|
|
x1:y1:x2:y2:color:thickness |
|
|
|
=item RECTANGLE |
|
|
|
x1:y1:x2:y2:color:thickness:filled |
|
|
|
=item ARC |
|
|
|
x:y:width:height:start:end:color:thickness:filled |
|
|
|
=over 4 |
|
|
|
=item start, end |
|
|
|
start and ends of the arc (in degrees) |
|
|
|
=back |
|
|
|
=item FILL |
|
|
|
x:y:color |
|
|
|
=item IMAGE |
|
|
|
x:y:file:transparent:srcX:srcY:destW:destH:srcW:srcH |
|
|
|
=over 4 |
|
|
|
=item srcX,srcY,srcW,srcH |
|
|
|
the start and extant of the region in file to copy to x,y with width/height |
|
destW destH |
|
|
|
=back |
|
|
|
=item LABEL |
|
|
|
x:y:text:font:color:direction |
|
|
|
=over 4 |
|
|
|
=item text |
|
|
|
HTTP escaped string of the text to place on the image |
|
|
|
=item font |
|
|
|
one of B<tiny>, B<small>, B<medium>, B<large>, B<giant>, or an |
|
installed TTF font and point size |
|
|
|
=item direction |
|
|
|
either B<horizontal> or B<vertical> |
|
|
|
=back |
|
|
|
=item POLYGON |
|
|
|
color:width:open:filled |
|
|
|
=over 4 |
|
|
|
=item open |
|
|
|
boolean, (1 or 0) |
|
|
|
=back |
|
|
|
=back |
|
|
|
|
|
=item OBJEXTRAI<num> |
|
|
|
extra arguments for object I<num> |
|
|
|
The possible values for this for the different object types are |
|
|
|
=over 4 |
|
|
|
=item POLYGON |
|
|
|
a list of coords in the form |
|
|
|
(x,y)-(x,y)-(x,y) |
|
|
|
(there can be arbitrarily many of these) |
|
|
|
=back |
|
|
|
=back |
|
|
|
=head1 Example |
|
|
|
BGIMG=file |
|
OBJTYPE=LINE:LINE:LINE:LINE |
|
OBJCOUNT=4 |
|
OBJ0=xmin:ymin:xmax:ymax:FFFFFF:3 |
|
OBJ1=xmin:ymax:xmax:ymin:FFFFFF:3 |
|
OBJ2=xmin:ymin:xmax:ymax:FF0000:1 |
|
OBJ3=xmin:ymax:xmax:ymin:FF0000:1 |
|
|
|
=cut |
|
|
package Apache::randomlylabel; |
package Apache::randomlylabel; |
|
|
Line 54 sub get_image {
|
Line 205 sub get_image {
|
if ($response->content_type !~ m-/(png|jpg|jpeg)$-i) { |
if ($response->content_type !~ m-/(png|jpg|jpeg)$-i) { |
my $conv_image = Image::Magick->new; |
my $conv_image = Image::Magick->new; |
my $current_figure = $conv_image->Read('filename'=>$file); |
my $current_figure = $conv_image->Read('filename'=>$file); |
|
$conv_image->Set('type'=>'TrueColor'); |
$conv_image->Set('magick'=>'png'); |
$conv_image->Set('magick'=>'png'); |
my @blobs=$conv_image->ImageToBlob(); |
my @blobs=$conv_image->ImageToBlob(); |
undef $conv_image; |
undef $conv_image; |
Line 66 sub get_image {
|
Line 218 sub get_image {
|
} elsif ($imgsrc !~ /\.(png|jpg|jpeg)$/i) { |
} elsif ($imgsrc !~ /\.(png|jpg|jpeg)$/i) { |
my $conv_image = Image::Magick->new; |
my $conv_image = Image::Magick->new; |
my $current_figure = $conv_image->Read('filename'=>$imgsrc); |
my $current_figure = $conv_image->Read('filename'=>$imgsrc); |
|
$conv_image->Set('type'=>'TrueColor'); |
$conv_image->Set('magick'=>'png'); |
$conv_image->Set('magick'=>'png'); |
my @blobs=$conv_image->ImageToBlob(); |
my @blobs=$conv_image->ImageToBlob(); |
undef $conv_image; |
undef $conv_image; |
Line 135 sub handler {
|
Line 288 sub handler {
|
my $imcolor=&get_color_from_hexstring($image,$color); |
my $imcolor=&get_color_from_hexstring($image,$color); |
if (!defined($thickness)) { $thickness=1; } |
if (!defined($thickness)) { $thickness=1; } |
$image->setThickness($thickness); |
$image->setThickness($thickness); |
$image->setAntiAliased($imcolor); |
# $image->setAntiAliased($imcolor); |
$image->line($x1,$y1,$x2,$y2,gdAntiAliased); |
$image->line($x1,$y1,$x2,$y2,$imcolor); |
} elsif ($type eq 'RECTANGLE') { |
} elsif ($type eq 'RECTANGLE') { |
my ($x1,$y1,$x2,$y2,$color,$thickness,$filled)= |
my ($x1,$y1,$x2,$y2,$color,$thickness,$filled)= |
split(':',$ENV{"cgi.$id.OBJ$i"}); |
split(':',$ENV{"cgi.$id.OBJ$i"}); |
Line 152 sub handler {
|
Line 305 sub handler {
|
$image->rectangle($x1,$y1,$x2,$y2,$imcolor); |
$image->rectangle($x1,$y1,$x2,$y2,$imcolor); |
} |
} |
} elsif ($type eq 'POLYGON') { |
} elsif ($type eq 'POLYGON') { |
my ($color,$width,$open)=split(':',$ENV{"cgi.$id.OBJ$i"}); |
my ($color,$width,$open,$filled)=split(':',$ENV{"cgi.$id.OBJ$i"}); |
my $imcolor=&get_color_from_hexstring($image,$color); |
my $imcolor=&get_color_from_hexstring($image,$color); |
my $polygon = (($open) ? (new GD::Polyline) : (new GD::Polygon)); |
my $polygon = (($open && lc ($open ne 'no')) ? |
|
(new GD::Polyline) : (new GD::Polygon)); |
my $added=0; |
my $added=0; |
foreach my $coord (split('-',$ENV{"cgi.$id.OBJEXTRA$i"})) { |
foreach my $coord (split('-',$ENV{"cgi.$id.OBJEXTRA$i"})) { |
my ($x,$y)=($coord=~m/\(([0-9]+),([0-9]+)\)/); |
my ($x,$y)=($coord=~m/\(([0-9]+),([0-9]+)\)/); |
Line 164 sub handler {
|
Line 318 sub handler {
|
|
|
$image->setThickness($width); |
$image->setThickness($width); |
if ($added) { |
if ($added) { |
if ($open) { |
if ($open && lc($open) ne 'no') { |
$image->polydraw($polygon,$imcolor); |
$image->polydraw($polygon,$imcolor); |
|
} elsif ($filled && lc($filled) ne 'no') { |
|
$image->filledPolygon($polygon,$imcolor); |
} else { |
} else { |
$image->polygon($polygon,$imcolor); |
$image->polygon($polygon,$imcolor); |
} |
} |
Line 190 sub handler {
|
Line 346 sub handler {
|
my $imcolor=&get_color_from_hexstring($image,$color); |
my $imcolor=&get_color_from_hexstring($image,$color); |
$image->fill($x,$y,$imcolor); |
$image->fill($x,$y,$imcolor); |
} elsif ($type eq 'IMAGE') { |
} elsif ($type eq 'IMAGE') { |
my ($x,$y,$file,$transparent)=split(':',$ENV{"cgi.$id.OBJ$i"}); |
my ($x,$y,$file,$transparent,$srcX,$srcY,$destW,$destH,$srcW, |
|
$srcH)=split(':',$ENV{"cgi.$id.OBJ$i"}); |
$file=&Apache::lonnet::unescape($file); |
$file=&Apache::lonnet::unescape($file); |
if (!defined($transparent)) { $transparent=1; } |
if (!defined($transparent)) { $transparent=1; } |
my $subimage=&get_image($file,$transparent); |
my $subimage=&get_image($file,$transparent); |
Line 199 sub handler {
|
Line 356 sub handler {
|
$file); |
$file); |
next; |
next; |
} |
} |
$image->copy($subimage,$x,$y,0,0,$subimage->getBounds()); |
if (!defined($srcW) or !$srcW) {$srcW=($subimage->getBounds())[0];} |
|
if (!defined($srcH) or !$srcH) {$srcH=($subimage->getBounds())[1];} |
|
if (!defined($destW) or !$destW) { $destW=$srcW; } |
|
if (!defined($destH) or !$destH) { $destH=$srcH; } |
|
$image->copyResized($subimage,$x,$y,$srcX,$srcY,$destW,$destH, |
|
$srcW,$srcH); |
} elsif ($type eq 'LABEL') { |
} elsif ($type eq 'LABEL') { |
my ($x,$y,$text,$font,$color,$direction)= |
my ($x,$y,$text,$font,$color,$direction)= |
split(':',$ENV{"cgi.$id.OBJ$i"}); |
split(':',$ENV{"cgi.$id.OBJ$i"}); |
Line 219 sub handler {
|
Line 381 sub handler {
|
} elsif ($font eq 'large') { |
} elsif ($font eq 'large') { |
$height=GD::Font->Large->height; |
$height=GD::Font->Large->height; |
$fontref=GD::gdLargeFont; |
$fontref=GD::gdLargeFont; |
} elsif ($font eq 'giant' || !defined($font)) { |
} elsif ($font eq 'giant' || !$font) { |
$height=GD::Font->Giant->height; |
$height=GD::Font->Giant->height; |
$fontref=GD::gdGiantFont; |
$fontref=GD::gdGiantFont; |
} else { |
} else { |