[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);