Annotation of loncom/homework/drawimage.pm, revision 1.7
1.1 albertel 1: # The LearningOnline Network with CAPA
2: # programatic image drawing
3: #
1.7 ! albertel 4: # $Id: drawimage.pm,v 1.6 2004/03/23 20:38:09 albertel Exp $
1.1 albertel 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
29: package Apache::drawimage;
30: use strict;
31: use Apache::loncommon;
32:
33: my %args;
34: my $cgi_id;
1.7 ! albertel 35: my @cgi_ids;
1.1 albertel 36: BEGIN {
37: &Apache::lonxml::register('Apache::drawimage',('drawimage'));
38: }
39:
40: sub start_drawimage {
41: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.7 ! albertel 42: &Apache::lonxml::register('Apache::drawimage',('text','line','rectangle','arc','fill','polygon','image'));
1.1 albertel 43: if ($target eq 'web' || $target eq 'tex') {
1.7 ! albertel 44: my $new_id=&Apache::loncommon::get_cgi_id();
! 45: if ($cgi_id) { push(@cgi_ids,$cgi_id); } else { undef(%args); }
! 46: $cgi_id=$new_id;
1.1 albertel 47: }
1.7 ! albertel 48: return '';
1.1 albertel 49: }
50:
51: sub end_drawimage {
52: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
53: my $result;
54: if ($target eq 'web' || $target eq 'tex') {
1.7 ! albertel 55: my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval);
! 56: my $height =&Apache::lonxml::get_param('height',$parstack,$safeeval);
! 57: my $bgcolor =&Apache::lonxml::get_param('bgcolor',$parstack,$safeeval);
! 58: if (!$width) { $width=300; }
! 59: if (!$height) { $height=300; }
! 60: $result.="<img width='$width' height='$height'
1.1 albertel 61: src='/adm/randomlabel.png?token=$cgi_id' />\n";
1.7 ! albertel 62: $args{"cgi.$cgi_id.SIZE"}=join(':',($width,$height));
! 63: $args{"cgi.$cgi_id.BGCOLOR"}=join(':',($bgcolor));
! 64: &Apache::lonnet::appenv(%args);
! 65: if (@cgi_ids) {
! 66: $cgi_id=pop(@cgi_ids);
! 67: } else {
! 68: undef($cgi_id);
1.1 albertel 69: }
1.7 ! albertel 70: } elsif ($target eq 'edit') {
! 71: } elsif ($target eq 'modified') {
1.1 albertel 72: }
1.7 ! albertel 73:
! 74: &Apache::lonxml::register('Apache::drawimage',
! 75: ('text','line','rectangle','arc','fill',
! 76: 'polygon'));
1.4 matthew 77: return $result;
78: }
79:
1.5 albertel 80: sub start_text {
1.4 matthew 81: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
82: my $result;
83: if ($target eq 'web' || $target eq 'tex') {
1.6 albertel 84: &Apache::lonxml::startredirection();
85: }
86: return $result;
87: }
88:
89: sub end_text {
90: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
91: my $result;
92: if ($target eq 'web' || $target eq 'tex') {
1.4 matthew 93: my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
94: my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
95: my $font = &Apache::lonxml::get_param('font',$parstack,$safeeval);
96: my $color = &Apache::lonxml::get_param('color',$parstack,$safeeval);
1.5 albertel 97: my $direction = &Apache::lonxml::get_param('direction',$parstack,$safeeval);
1.6 albertel 98: my $text = &Apache::lonxml::endredirection();
1.4 matthew 99: $text = &Apache::lonnet::escape($text);
100: $args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:';
101: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
1.5 albertel 102: $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$text,$font,$color,$direction));
1.4 matthew 103: }
1.1 albertel 104: return $result;
105: }
106:
107: sub start_line {
108: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
109: my $result;
110: if ($target eq 'web' || $target eq 'tex') {
111: my $x1 = &Apache::lonxml::get_param('x1',$parstack,$safeeval);
112: my $y1 = &Apache::lonxml::get_param('y1',$parstack,$safeeval);
113: my $x2 = &Apache::lonxml::get_param('x2',$parstack,$safeeval);
114: my $y2 = &Apache::lonxml::get_param('y2',$parstack,$safeeval);
115: my $color = &Apache::lonxml::get_param('color',$parstack,$safeeval);
116: my $thickness = &Apache::lonxml::get_param('thickness',$parstack,$safeeval);
1.3 albertel 117: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
1.1 albertel 118: $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x1,$y1,$x2,$y2,$color,$thickness));
119: $args{"cgi.$cgi_id.OBJTYPE"}.='LINE:';
120: }
121: return $result;
122: }
123:
124: sub end_line {
125: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
126: my $result;
127: return $result;
128: }
129:
130: sub start_rectangle {
131: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
132: my $result;
133: if ($target eq 'web' || $target eq 'tex') {
134: my $x1 = &Apache::lonxml::get_param('x1',$parstack,$safeeval);
135: my $y1 = &Apache::lonxml::get_param('y1',$parstack,$safeeval);
136: my $x2 = &Apache::lonxml::get_param('x2',$parstack,$safeeval);
137: my $y2 = &Apache::lonxml::get_param('y2',$parstack,$safeeval);
138: my $color = &Apache::lonxml::get_param('color',$parstack,$safeeval);
139: my $thickness = &Apache::lonxml::get_param('thickness',$parstack,
140: $safeeval);
141: my $filled = &Apache::lonxml::get_param('filled',$parstack,
142: $safeeval);
1.3 albertel 143: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
1.1 albertel 144: $args{"cgi.$cgi_id.OBJ$i"}=
145: join(':',($x1,$y1,$x2,$y2,$color,$thickness,$filled));
146: $args{"cgi.$cgi_id.OBJTYPE"}.='RECTANGLE:';
147: }
148: return $result;
149: }
150:
151: sub end_rectangle {
152: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
153: my $result;
154: return $result;
155: }
156:
157: sub start_arc {
158: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
159: my $result;
160: if ($target eq 'web' || $target eq 'tex') {
161: my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
162: my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
163: my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval);
164: my $height = &Apache::lonxml::get_param('height',$parstack,$safeeval);
165: my $start = &Apache::lonxml::get_param('start',$parstack,$safeeval);
166: my $end = &Apache::lonxml::get_param('end',$parstack,$safeeval);
167: my $color = &Apache::lonxml::get_param('color',$parstack,$safeeval);
168: my $thickness = &Apache::lonxml::get_param('thickness',$parstack,$safeeval);
169: my $filled = &Apache::lonxml::get_param('filled',$parstack,$safeeval);
1.3 albertel 170: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
1.1 albertel 171: $args{"cgi.$cgi_id.OBJ$i"}=
172: join(':',($x,$y,$width,$height,$start,$end,$color,$thickness,
173: $filled));
174: $args{"cgi.$cgi_id.OBJTYPE"}.='ARC:';
175: }
176: return $result;
177: }
178:
179: sub end_arc {
180: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
181: my $result;
182: return $result;
183: }
184:
1.2 albertel 185: sub start_fill {
1.1 albertel 186: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
187: my $result;
188: if ($target eq 'web' || $target eq 'tex') {
189: my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
190: my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
191: my $color = &Apache::lonxml::get_param('color',$parstack,$safeeval);
1.3 albertel 192: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
1.1 albertel 193: $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$color));
194: $args{"cgi.$cgi_id.OBJTYPE"}.='FILL:';
195: }
196: return $result;
197: }
198:
1.2 albertel 199: sub end_fill {
1.1 albertel 200: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
201: my $result;
202: return $result;
203: }
204:
1.7 ! albertel 205: my @polygon;
! 206: sub start_polygon {
! 207: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 208: my $result;
! 209: &Apache::lonxml::register('Apache::drawimage',('point'));
! 210: if ($target eq 'web') {
! 211: undef(@polygon);
! 212: }
! 213: return $result;
! 214: }
! 215:
! 216: sub end_polygon {
! 217: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 218: my $result;
! 219: if ($target eq 'web') {
! 220: my $color=&Apache::lonxml::get_param('color',$parstack,$safeeval);
! 221: my $filled=&Apache::lonxml::get_param('filled',$parstack,$safeeval);
! 222: my $open=&Apache::lonxml::get_param('open',$parstack,$safeeval);
! 223: my $thickness = &Apache::lonxml::get_param('thickness',$parstack,
! 224: $safeeval);
! 225: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
! 226: $args{"cgi.$cgi_id.OBJTYPE"}.='POLYGON:';
! 227: $args{"cgi.$cgi_id.OBJ$i"}=join(':',($color,$thickness,$open,$filled));
! 228: $args{"cgi.$cgi_id.OBJEXTRA$i"}=join('-',@polygon);
! 229: }
! 230: &Apache::lonxml::deregister('Apache::drawimage',('point'));
! 231: return $result;
! 232: }
! 233:
! 234: sub start_point {
! 235: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 236: my $result;
! 237: if ($target eq 'web') {
! 238: my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
! 239: my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
! 240: push (@polygon,"($x,$y)");
! 241: }
! 242: return $result;
! 243: }
! 244:
! 245: sub end_point {
! 246: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 247: my $result;
! 248: return $result;
! 249: }
! 250:
! 251: sub start_image {
! 252: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 253: my $result;
! 254: if ($target eq 'web' || $target eq 'tex') {
! 255: &Apache::lonxml::startredirection();
! 256: }
! 257: return $result;
! 258: }
1.1 albertel 259:
1.7 ! albertel 260: sub end_image {
! 261: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 262: my $result;
! 263: if ($target eq 'web' || $target eq 'tex') {
! 264: my $bgimg=&Apache::lonxml::endredirection();
! 265: &Apache::lonnet::logthis("image $bgimg");
! 266: my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
! 267: my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
! 268: my $clipx = &Apache::lonxml::get_param('clipx',$parstack,$safeeval);
! 269: my $clipy = &Apache::lonxml::get_param('clipy',$parstack,$safeeval);
! 270: my $clipwidth =
! 271: &Apache::lonxml::get_param('clipwidth',$parstack,$safeeval);
! 272: my $clipheight =
! 273: &Apache::lonxml::get_param('clipheight',$parstack,$safeeval);
! 274: my $scaledwidth =
! 275: &Apache::lonxml::get_param('scaledwidth',$parstack,$safeeval);
! 276: my $scaledheight =
! 277: &Apache::lonxml::get_param('scaledheight',$parstack,$safeeval);
! 278: my $transparent =
! 279: &Apache::lonxml::get_param('transparent',$parstack,$safeeval);
! 280: $bgimg=&Apache::imageresponse::clean_up_image($bgimg);
! 281: &Apache::lonnet::logthis("image af clean $bgimg");
! 282: my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
! 283: $args{"cgi.$cgi_id.OBJTYPE"}.='IMAGE:';
! 284: $args{"cgi.$cgi_id.OBJ$i"} =
! 285: join(':',($x,$y,&Apache::lonnet::escape($bgimg),$transparent,
! 286: $clipx,$clipy,$scaledwidth,$scaledheight,$clipwidth,$clipheight));
! 287: }
! 288: return $result;
! 289: }
1.1 albertel 290: 1;
291: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>