function DrawMap($filename = '', $thumbnailfile = '', $thumbnailmax = 250, $withnodes = TRUE, $use_via_overlay = FALSE, $use_rel_overlay=FALSE) { wm_debug("Trace: DrawMap()\n"); metadump("# start",true); $bgimage=NULL; if($this->configfile != "") { $this->cachefile_version = crc32(file_get_contents($this->configfile)); } else { $this->cachefile_version = crc32("........"); } wm_debug("Running Post-Processing Plugins...\n"); foreach ($this->postprocessclasses as $post_class) { wm_debug("Running $post_class"."->run()\n"); //call_user_func_array(array($post_class, 'run'), array(&$this)); $this->plugins['post'][$post_class]->run($this); } wm_debug("Finished Post-Processing Plugins...\n"); wm_debug("=====================================\n"); wm_debug("Start of Map Drawing\n"); $this->datestamp = strftime($this->stamptext, time()); // do the basic prep work if ($this->background != '') { if (is_readable($this->background)) { $bgimage=imagecreatefromfile($this->background); if (!$bgimage) { wm_warn ("Failed to open background image. One possible reason: Is your BACKGROUND really a PNG?\n"); } else { $this->width=imagesx($bgimage); $this->height=imagesy($bgimage); } } else { wm_warn ("Your background image file could not be read. Check the filename, and permissions, for " . $this->background . "\n"); } } $image=wimagecreatetruecolor($this->width, $this->height); # $image = imagecreate($this->width, $this->height); if (!$image) { wm_warn ("Couldn't create output image in memory (" . $this->width . "x" . $this->height . ")."); } else { ImageAlphaBlending($image, true); # imageantialias($image,true); // by here, we should have a valid image handle // save this away, now $this->image=$image; $this->white=myimagecolorallocate($image, 255, 255, 255); $this->black=myimagecolorallocate($image, 0, 0, 0); $this->grey=myimagecolorallocate($image, 192, 192, 192); $this->selected=myimagecolorallocate($image, 255, 0, 0); // for selections in the editor $this->AllocateScaleColours($image); // fill with background colour anyway, in case the background image failed to load wimagefilledrectangle($image, 0, 0, $this->width, $this->height, $this->colours['DEFAULT']['BG']['gdref1']); if ($bgimage) { imagecopy($image, $bgimage, 0, 0, 0, 0, $this->width, $this->height); imagedestroy ($bgimage); } // Now it's time to draw a map // do the node rendering stuff first, regardless of where they are actually drawn. // this is so we can get the size of the nodes, which links will need if they use offsets foreach ($this->nodes as $node) { // don't try and draw template nodes wm_debug("Pre-rendering ".$node->name." to get bounding boxes.\n"); if(!is_null($node->x)) $this->nodes[$node->name]->pre_render($image, $this); } $all_layers = array_keys($this->seen_zlayers); sort($all_layers); foreach ($all_layers as $z) { $z_items = $this->seen_zlayers[$z]; wm_debug("Drawing layer $z\n"); // all the map 'furniture' is fixed at z=1000 if($z==1000) { foreach ($this->colours as $scalename=>$colours) { wm_debug("Drawing KEY for $scalename if necessary.\n"); if( (isset($this->numscales[$scalename])) && (isset($this->keyx[$scalename])) && ($this->keyx[$scalename] >= 0) && ($this->keyy[$scalename] >= 0) ) { if($this->keystyle[$scalename]=='classic') $this->DrawLegend_Classic($image,$scalename,FALSE); if($this->keystyle[$scalename]=='horizontal') $this->DrawLegend_Horizontal($image,$scalename,$this->keysize[$scalename]); if($this->keystyle[$scalename]=='vertical') $this->DrawLegend_Vertical($image,$scalename,$this->keysize[$scalename]); if($this->keystyle[$scalename]=='inverted') $this->DrawLegend_Vertical($image,$scalename,$this->keysize[$scalename],true); if($this->keystyle[$scalename]=='tags') $this->DrawLegend_Classic($image,$scalename,TRUE); } } $this->DrawTimestamp($image, $this->timefont, $this->colours['DEFAULT']['TIME']['gdref1']); if(! is_null($this->min_data_time)) { $this->DrawTimestamp($image, $this->timefont, $this->colours['DEFAULT']['TIME']['gdref1'],"MIN"); $this->DrawTimestamp($image, $this->timefont, $this->colours['DEFAULT']['TIME']['gdref1'],"MAX"); } $this->DrawTitle($image, $this->titlefont, $this->colours['DEFAULT']['TITLE']['gdref1']); } if(is_array($z_items)) { foreach($z_items as $it) { if(strtolower(get_class($it))=='weathermaplink') { // only draw LINKs if they have NODES defined (not templates) // (also, check if the link still exists - if this is in the editor, it may have been deleted by now) if ( isset($this->links[$it->name]) && isset($it->a) && isset($it->b)) { wm_debug("Drawing LINK ".$it->name."\n"); $this->links[$it->name]->Draw($image, $this); } } if(strtolower(get_class($it))=='weathermapnode') { // if(!is_null($it->x)) $it->pre_render($image, $this); if($withnodes) { // don't try and draw template nodes if( isset($this->nodes[$it->name]) && !is_null($it->x)) { # print "::".get_class($it)."\n"; wm_debug("Drawing NODE ".$it->name."\n"); $this->nodes[$it->name]->NewDraw($image, $this); $ii=0; foreach($this->nodes[$it->name]->boundingboxes as $bbox) { # $areaname = "NODE:" . $it->name . ':'.$ii; $areaname = "NODE:N". $it->id . ":" . $ii; $this->imap->addArea("Rectangle", $areaname, '', $bbox); wm_debug("Adding imagemap area"); $ii++; } wm_debug("Added $ii bounding boxes too\n"); } } } } } } $overlay = myimagecolorallocate($image, 200, 0, 0); // for the editor, we can optionally overlay some other stuff if($this->context == 'editor') { if($use_rel_overlay) { # $overlay = myimagecolorallocate($image, 200, 0, 0); // first, we can show relatively positioned NODEs foreach ($this->nodes as $node) { if($node->relative_to != '') { $rel_x = $this->nodes[$node->relative_to]->x; $rel_y = $this->nodes[$node->relative_to]->y; imagearc($image,$node->x, $node->y, 15,15,0,360,$overlay); imagearc($image,$node->x, $node->y, 16,16,0,360,$overlay); imageline($image,$node->x, $node->y, $rel_x, $rel_y, $overlay); } } } if($use_via_overlay) { // then overlay VIAs, so they can be seen foreach($this->links as $link) { foreach ($link->vialist as $via) { if(isset($via[2])) { $x = $this->nodes[$via[2]]->x + $via[0]; $y = $this->nodes[$via[2]]->y + $via[1]; } else { $x = $via[0]; $y = $via[1]; } imagearc($image, $x,$y, 10,10,0,360,$overlay); imagearc($image, $x,$y, 12,12,0,360,$overlay); } } } } #$this->myimagestring($image, 3, 200, 100, "Test 1\nLine 2", $overlay,0); # $this->myimagestring($image, 30, 100, 100, "Test 1\nLine 2", $overlay,0); #$this->myimagestring($image, 30, 200, 200, "Test 1\nLine 2", $overlay,45); // Ready to output the results... if($filename == 'null') { // do nothing at all - we just wanted the HTML AREAs for the editor or HTML output } else { if ($filename == '') { imagepng ($image); } else { $result = FALSE; $functions = TRUE; if(function_exists('imagejpeg') && preg_match("/\.jpg/i",$filename)) { wm_debug("Writing JPEG file to $filename\n"); $result = imagejpeg($image, $filename); } elseif(function_exists('imagegif') && preg_match("/\.gif/i",$filename)) { wm_debug("Writing GIF file to $filename\n"); $result = imagegif($image, $filename); } elseif(function_exists('imagepng') && preg_match("/\.png/i",$filename)) { wm_debug("Writing PNG file to $filename\n"); $result = imagepng($image, $filename); } else { wm_warn("Failed to write map image. No function existed for the image format you requested. [WMWARN12]\n"); $functions = FALSE; } if(($result==FALSE) && ($functions==TRUE)) { if(file_exists($filename)) { wm_warn("Failed to overwrite existing image file $filename - permissions of existing file are wrong? [WMWARN13]"); } else { wm_warn("Failed to create image file $filename - permissions of output directory are wrong? [WMWARN14]"); } } } } if($this->context == 'editor2') { $cachefile = $this->cachefolder.DIRECTORY_SEPARATOR.dechex(crc32($this->configfile))."_bg.".$this->cachefile_version.".png"; imagepng($image, $cachefile); $cacheuri = $this->cachefolder.'/'.dechex(crc32($this->configfile))."_bg.".$this->cachefile_version.".png"; $this->mapcache = $cacheuri; } if (function_exists('imagecopyresampled')) { // if one is specified, and we can, write a thumbnail too if ($thumbnailfile != '') { $result = FALSE; if ($this->width > $this->height) { $factor=($thumbnailmax / $this->width); } else { $factor=($thumbnailmax / $this->height); } $this->thumb_width = $this->width * $factor; $this->thumb_height = $this->height * $factor; $imagethumb=imagecreatetruecolor($this->thumb_width, $this->thumb_height); imagecopyresampled($imagethumb, $image, 0, 0, 0, 0, $this->thumb_width, $this->thumb_height, $this->width, $this->height); $result = imagepng($imagethumb, $thumbnailfile); imagedestroy($imagethumb); if(($result==FALSE)) { if(file_exists($filename)) { wm_warn("Failed to overwrite existing image file $filename - permissions of existing file are wrong? [WMWARN15]"); } else { wm_warn("Failed to create image file $filename - permissions of output directory are wrong? [WMWARN16]"); } } } } else { wm_warn("Skipping thumbnail creation, since we don't have the necessary function. [WMWARN17]"); } imagedestroy ($image); } }
function wimagettftext($image, $size, $angle, $x, $y, $color, $file, $string) { if ($color === NULL) { return; } $col = imagecolorsforindex($image, $color); $r = $col['red']; $g = $col['green']; $b = $col['blue']; $a = $col['alpha']; $r = $r / 255; $g = $g / 255; $b = $b / 255; $a = (127 - $a) / 127; metadump("TEXT {$x} {$y} {$angle} {$size} {$file} {$r} {$g} {$b} {$a} {$string}"); return imagettftext($image, $size, $angle, $x, $y, $color, $file, $string); }