[LON-CAPA-cvs] cvs: loncom /homework randomlylabel.pm
albertel
lon-capa-cvs@mail.lon-capa.org
Mon, 23 Feb 2004 22:52:30 -0000
albertel Mon Feb 23 17:52:30 2004 EDT
Modified files:
/loncom/homework randomlylabel.pm
Log:
- breaking all image modifications routines
Index: loncom/homework/randomlylabel.pm
diff -u loncom/homework/randomlylabel.pm:1.15 loncom/homework/randomlylabel.pm:1.16
--- loncom/homework/randomlylabel.pm:1.15 Wed Feb 11 16:51:15 2004
+++ loncom/homework/randomlylabel.pm Mon Feb 23 17:52:30 2004
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# randomlabel.png: composite together text and images into 1 image
#
-# $Id: randomlylabel.pm,v 1.15 2004/02/11 21:51:15 albertel Exp $
+# $Id: randomlylabel.pm,v 1.16 2004/02/23 22:52:30 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -88,6 +88,18 @@
return $image;
}
+sub get_color_from_hexstring {
+ my ($image,$color)=@_;
+ if (!$color) { $color='000000'; }
+ my (undef,$red,undef,$green,undef,$blue)=split(/(..)/,$color);
+ $red=hex($red);$green=hex($green);$blue=hex($blue);
+ my $imcolor;
+ if (!($imcolor = $image->colorResolve($red,$green,$blue))) {
+ $imcolor = $image->colorClosestHWB($red,$green,$blue);
+ }
+ return $imcolor;
+}
+
sub handler {
my $r = shift;
$r->content_type('image/png');
@@ -99,75 +111,102 @@
&Apache::lonnet::logthis('Unable to create image object for -'.$id.'-'.
$ENV{"cgi.$id.BGIMG"});
return OK;
- }
- #binmode(STDOUT);
- my $black;
- if (!($black=$image->colorResolve(0,0,0))) {
- $black = $image->colorClosestHWB(0,0,0);
- }
- for(my $i=0;$i<$ENV{"cgi.$id.ICOUNT"};$i++) {
- my $subimage=&get_image(&Apache::lonnet::unescape($ENV{"cgi.$id.IMG$i"}),1);
- if (!defined($subimage)) {
- &Apache::lonnet::logthis('Unable to create image object for '.
- $ENV{"cgi.$id.BGIMG"});
- next;
- }
- $image->copy($subimage,$ENV{"cgi.$id.IX$i"},$ENV{"cgi.$id.IY$i"},
- 0,0,$subimage->getBounds());
- }
- my $height=GD::Font->Giant->height;
- for(my $i=0;$i<$ENV{"cgi.$id.COUNT"};$i++) {
- $image->string(GD::gdGiantFont,$ENV{"cgi.$id.X$i"},
- $ENV{"cgi.$id.Y$i"}-$height,
- &Apache::lonnet::unescape($ENV{"cgi.$id.LB$i"}),$black);
- }
- for(my $i=0;$i<$ENV{"cgi.$id.LINECOUNT"};$i++) {
- my ($x1,$y1,$x2,$y2,$color,$width)=split(':',$ENV{"cgi.$id.LINE$i"});
- my (undef,$red,undef,$green,undef,$blue)=split(/(..)/,$color);
- $red=hex($red);$green=hex($green);$blue=hex($blue);
- my $imcolor;
- if (!($imcolor = $image->colorResolve($red,$green,$blue))) {
- $imcolor = $image->colorClosestHWB($red,$green,$blue);
- }
- $image->setThickness($width);
- $image->line($x1,$y1,$x2,$y2,$imcolor);
- }
- for(my $i=0;$i<$ENV{"cgi.$id.BOXCOUNT"};$i++) {
- my ($x1,$y1,$x2,$y2,$color,$width)=split(':',$ENV{"cgi.$id.BOX$i"});
- if ($x1 > $x2) { my $temp=$x1;$x1=$x2;$x2=$temp; }
- if ($y1 > $y2) { my $temp=$y1;$y1=$y2;$y2=$temp; }
- my (undef,$red,undef,$green,undef,$blue)=split(/(..)/,$color);
- $red=hex($red);$green=hex($green);$blue=hex($blue);
- my $imcolor;
- if (!($imcolor = $image->colorResolve($red,$green,$blue))) {
- $imcolor = $image->colorClosestHWB($red,$green,$blue);
- }
- $image->setThickness($width);
- $image->rectangle($x1,$y1,$x2,$y2,$imcolor);
- }
- for(my $i=0;$i<$ENV{"cgi.$id.POLYCOUNT"};$i++) {
- my ($color,$width,$open)=split(':',$ENV{"cgi.$id.POLYOPT$i"});
- my (undef,$red,undef,$green,undef,$blue)=split(/(..)/,$color);
- $red=hex($red);$green=hex($green);$blue=hex($blue);
- my $imcolor;
- if (!($imcolor = $image->colorResolve($red,$green,$blue))) {
- $imcolor = $image->colorClosestHWB($red,$green,$blue);
- }
- my $polygon;
- if ($open) {
- $polygon = new GD::Polyline;
+ } elsif (defined($ENV{"cgi.$id.SIZE"})) {
+ my ($width,$height)=split(':',$ENV{"cgi.$id.SIZE"});
+ $image = new GD::Image($width,$height,1);
+ my ($bgcolor)=split(':',$ENV{"cgi.$id.BGCOLOR"});
+ if ($bgcolor ne 'transparent') {
+ $bgcolor=&get_color_from_hexstring($image,$bgcolor);
+# $image->rectangle(0,0,$width,$height,$bgcolor);
+ $image->fill(0,0,$bgcolor);
} else {
- $polygon = new GD::Polygon;
- }
- foreach my $coord (split('-',$ENV{"cgi.$id.POLY$i"})) {
- my ($x,$y)=($coord=~m/\(([0-9]+),([0-9]+)\)/);
- $polygon->addPt($x,$y);
+ $bgcolor=&get_color_from_hexstring($image,'FFFFFF');
+ $image->fill(0,0,$bgcolor);
+ $image->transparent($bgcolor);
}
- $image->setThickness($width);
- if ($open) {
- $image->polydraw($polygon,$imcolor);
- } else {
- $image->polygon($polygon,$imcolor);
+ } else {
+ &Apache::lonnet::logthis('Unable to create image object, no info');
+ return OK;
+ }
+ #binmode(STDOUT);
+ my @objtypes=split(':',$ENV{"cgi.$id.OBJTYPE"});
+ foreach(my $i=0;$i<$ENV{"cgi.$id.OBJCOUNT"};$i++) {
+ my $type=shift(@objtypes);
+ &Apache::lonnet::logthis("type is $type");
+ if ($type eq 'LINE') {
+ my ($x1,$y1,$x2,$y2,$color,$thickness)=
+ split(':',$ENV{"cgi.$id.OBJ$i"});
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ if (!defined($thickness)) { $thickness=1; }
+ $image->setThickness($thickness);
+ $image->setAntiAliased($imcolor);
+ $image->line($x1,$y1,$x2,$y2,gdAntiAliased);
+ } elsif ($type eq 'RECTANGLE') {
+ my ($x1,$y1,$x2,$y2,$color,$thickness,$filled)=
+ split(':',$ENV{"cgi.$id.OBJ$i"});
+ if ($x1 > $x2) { my $temp=$x1;$x1=$x2;$x2=$temp; }
+ if ($y1 > $y2) { my $temp=$y1;$y1=$y2;$y2=$temp; }
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ if (!defined($thickness)) { $thickness=1; }
+ $image->setThickness($thickness);
+# $image->setAntiAliased($imcolor);
+ if ($filled) {
+ $image->filledRectangle($x1,$y1,$x2,$y2,$imcolor);
+ } else {
+ $image->rectangle($x1,$y1,$x2,$y2,$imcolor);
+ }
+ } elsif ($type eq 'POLYGON') {
+ my ($color,$width,$open)=split(':',$ENV{"cgi.$id.OBJ$i"});
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ my $polygon = (($open) ? (new GD::Polyline) : (new GD::Polygon));
+ foreach my $coord (split('-',$ENV{"cgi.$id.OBJEXTRA$i"})) {
+ my ($x,$y)=($coord=~m/\(([0-9]+),([0-9]+)\)/);
+ $polygon->addPt($x,$y);
+ }
+ $image->setThickness($width);
+ if ($open) {
+ $image->polydraw($polygon,$imcolor);
+ } else {
+ $image->polygon($polygon,$imcolor);
+ }
+ } elsif ($type eq 'ARC') {
+ my ($x,$y,$width,$height,$start,$end,$color,$thickness,$filled)=
+ split(':',$ENV{"cgi.$id.OBJ$i"});
+ if (!$color) { $color='000000'; }
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ if (!defined($thickness)) { $thickness=1; }
+ $image->setThickness($thickness);
+# $image->setAntiAliased($imcolor);
+ if ($filled) {
+ $image->filledArc($x,$y,$width,$height,$start,$end,
+ $imcolor);
+ } else {
+ $image->arc($x,$y,$width,$height,$start,$end,$imcolor);
+ }
+ } elsif ($type eq 'FILL') {
+ my ($x,$y,$color)=split(':',$ENV{"cgi.$id.OBJ$i"});
+ if (!$color) { $color='000000'; }
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ $image->fill($x,$y,$imcolor);
+ } elsif ($type eq 'IMAGE') {
+ my ($x,$y,$file,$transparent)=split(':',$ENV{"cgi.$id.OBJ$i"});
+ $file=&Apache::lonnet::unescape($file);
+ if (!defined($transparent)) { $transparent=1; }
+ my $subimage=&get_image($file,$transparent);
+ if (!defined($subimage)) {
+ &Apache::lonnet::logthis('Unable to create image object for '.
+ $file);
+ next;
+ }
+ $image->copy($subimage,$x,$y,0,0,$subimage->getBounds());
+ } elsif ($type eq 'LABEL') {
+ my ($x,$y,$text,$font,$color)=split(':',$ENV{"cgi.$id.OBJ$i"});
+ $text=&Apache::lonnet::unescape($text);
+ my $imcolor=&get_color_from_hexstring($image,$color);
+ my $height=GD::Font->Giant->height;
+ for(my $i=0;$i<$ENV{"cgi.$id.COUNT"};$i++) {
+ $image->string(GD::gdGiantFont,$x,$y-$height,$text,$black);
+ }
}
}
$image->setThickness(1);