[Bioperl-l] bioperl graphics

Todd Harris todd.harris at cshl.edu
Fri Feb 27 10:13:51 EST 2004


Hi Lincoln - 

I'll add this to GD::SVG next week and drop you a line when complete.

I'm also planning to add code that will allow one to fall back onto GD if a
method has not been mapped to the GD::SVG namespace - and if that still
doesn't work within the SVG gestalt, to die with a modicum of grace.

t

> On 2/27/04 8:38 AM, Lincoln Stein wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Sorry, but if you change colorAllocate() to colorResolve(), you will
> break the ability to generate publication-quality images with
> GD::SVG.  Perhaps Todd Harris will add colorResolve() to a future
> version of GD::SVG, in which case I will make the suggested change to
> Bio::Graphics.
> 
> I would recommend instead making two Bio::Graphics::Panel objects, and
> generating a pair of GD objects (using the Panel->gd() method).  Then
> you can combine them onto a third GD object in whatever geometry you
> want by using GD->copy()
> 
> Lincoln
> 
> On Wednesday 25 February 2004 06:46 pm, Jonathan Crabtree wrote:
>> Haibo-
>> 
>> hz5 at njit.edu wrote:
>>> Is there any way to render 2 Bio::Graphics::Panel into one png
>>> image? because I want 2 different arrows with different labeled
>>> coordinates on the same image and align to the left, but one
>>> Panel can only have one coordinates system.
>> 
>> The answer is yes, with a couple of caveats.  The first is that you
>> will have to take care of the layout of the individual
>> Panel-generated images.  If you're left-justifying everything then
>> this should be easy enough.  The second is that I would recommend
>> making a one-line change to Bio/Graphics/Panel.pm, to prevent the
>> package from trying to allocate the same set of colors twice (when
>> you reuse the same GD object to draw the two different parts of the
>> image.)  Search for the following piece of code in Panel.pm (at
>> line 411 in bioperl-1.4, I think):
>> 
>>   for my $name ('white','black',keys %COLORS) {
>>     my $idx = $gd->colorAllocate(@{$COLORS{$name}});
>>     $translation_table{$name} = $idx;
>>   }
>> 
>> Change "colorAllocate" to "colorResolve"; this should have no
>> effect on any existing Bio::Graphics code (AFAIK) and will allow
>> you to do your two (or three or four)-Panel trick.  (As an aside,
>> I'd like to lobby for this one-line change to be made in a future
>> version of
>> Bio::Graphics::Panel, for precisely this reason.)  In any case,
>> once you've made that change and reinstalled your copy of Bioperl,
>> here is a rough outline of what you need to do:
>> 
>> 1. Set up your individual Bio::Graphics::Panel objects (e.g. $p1,
>> $p2, $p3, etc.) as desired to draw your images, but do *not* call
>> the gd method on any of them yet.
>> 
>> 2. Create a GD::Image object big enough to hold the images that
>> will be drawn by $p1, $p2, $p3, etc.:
>>     my $gdImg = GD::Image->new($fullWidth, $fullHeight);
>> (Note: use $p1->width(), $p1->height(), etc., to determine what
>> $fullWidth and $fullHeight should be, based on your desired Panel
>> layout algorithm.)
>> 
>> 4. Use a "dummy" Bio::Graphics::Panel object to allocate all your
>> colors (this is an optional step; I do this because my code does
>> some drawing that isn't handled by Bio::Graphics::Panel, and want
>> to make sure that the palette has been allocated before I start):
>> 
>>     my $dummyPanel = Bio::Graphics::Panel->new(-length => 100,
>> -offset => 0, -width => $fullWidth);
>>     $dummyPanel->gd($gdImg); # forces color allocation
>> 
>> 5. Draw the individual panels and generate your png image:
>> 
>>     $p1->gd($gdImg);
>>     $p2->gd($gdImg);
>>     my $pngData = $gdImg->png();
>> 
>> I've glossed over some of the details here, for example the fact
>> that you may need to know the value of $p1->height() before you can
>> initialize $p2, but that's the basic idea.  I've been using this
>> method to generate some comparative sequence displays and while
>> it's definitely a bit of a hack, it works well in practice.  You
>> can also do the same thing with a GD::SVG::Image if you'd like to
>> generate SVG output.  Good luck,
>> 
>> Jonathan
>> 
>> 
>> 
>> _______________________________________________
>> Bioperl-l mailing list
>> Bioperl-l at portal.open-bio.org
>> http://portal.open-bio.org/mailman/listinfo/bioperl-l
> 
> - -- 
> Lincoln D. Stein
> Cold Spring Harbor Laboratory
> 1 Bungtown Road
> Cold Spring Harbor, NY 11724
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.1 (GNU/Linux)
> 
> iD8DBQFAP1Zt0CIvUP7P+AkRAreyAJ0XIcjMDeT/Bw69OBOEhD8tsznP+QCfVLWo
> +RnQaijXxPlVWTbmjTkbHYw=
> =lN1U
> -----END PGP SIGNATURE-----
> 



More information about the Bioperl-l mailing list