|
From: Harald H. <h.h...@tu...> - 2005-10-06 22:32:58
|
On Thu, 6 Oct 2005, Ethan Merritt wrote:
> On Thursday 06 October 2005 12:17 pm, Harald Harders wrote:
> >
> > [... a lot of discussion about sizes above 1 ...]
> >
> > In my opinion, there are two mutually exclusive solutions:
> >
> > 1.) 'set size' before 'set terminal' can affect the canvas size. Then,
> > sizes below and above 1 have to be valid because then 'size 1,1' means the
> > default size. Partly, this is the current state while sizes > 1 only work
> > partly.
>
> I am being educated about this use of "set size". It's not the way I
> have been using it, but I fully understand the argument about not
> necessarily wanting to scale line widths and font sizes with the
> graph size. So I retract my previous claim that sizes greater than 1
> are never correct.
>
> But, as you say, it only partly works now.
> For instance, setting the size to something other than 1,1 before
> setting the terminal seems to break multiplot layouts.
Do you mean the automatic ones? I always to multiplots by hand and they
also work for plots with sizes greater than 1.
> > 2.) 'set size' only affects the size of the plot within the current
> > canvas while the canvas (or bouding box or what ever) is influenced by
> > another mechanism, e.g., 'set terminal <term> size <x,y>'. Here, the
> > possible values can be different for different terminals, e.g.,
> > set terminal postscript size 5cm,3cm
> > set terminal postscript eps size 300pt,200pt
> > set terminal postscript eps size 300,200 # could default to pt
> > set terminal postscript eps size 300,200 offset 100,150
> > # results in %%BoundingBox: 100 150 400 350
> > set terminal gif size 300,200 # defaults to pixel
> > set terminal gif size 1in,1in resolution 300 # = 300 x 300 pixel, 300dpi
>
> That is the way I would prefer to have it work.
> The range of reasonable canvas sizes is clearly terminal-dependent,
> so choosing a size should done in the terminal-specific initialization.
> It will mean modifying drivers, but it seems straightforward.
I agree. Sounds like a plan and a lot of work.
> Next problem:
>
> The harder task related to this is the larger issue of remedying
> the lack of line and text clipping in the core routines.
> Right now "set size 0.1,0.1; set term <foo>; test"
> will crash on many terminal types because the various
> lines and text on the test page are not clipped against the
> reduced canvas size. Regular plotting is somewhat better, since
> the actual plot elements are properly clipped. But elements such
> as the key, title, and individually placed arrows or labels are
> not clipped and still prone to cause segfaults. The pdf terminal
> is particularly sensitive to this, but all drivers that use
> the shared routines in bitmap.c suffer the same problem.
>
> The code in the current clipping routines would do the job,
> except currently it explicitly clips to the plot area, not the canvas.
> I think the way forward is to:
>
> 1) move xright, xleft, ytop, ybot into a new structure, e.g.
> struct {int xright; int xleft; int ytop; int ybot;} bounding_box.
>
> 2) create and maintain two global instances of such a structure;
> one that describes the plot area, another that describes the
> whole canvas.
>
> 3) modify the clip_line() and clip_point() to clip against whichever
> bounding_box structure is currently active
>
> 4) Existing calls to the clipping routines will continue to
> work as always, and clip against the plot area.
> Any code that needs to place elements outside the plot (key, title,
> arrows, axis lables, ...) would change the active bounding_box
> to the entire canvas, clip, and then restore the bounding_box.
>
> At that point we would have protected all drivers against
> out-of-range vectors and moves. Text clipping would not be
> perfect, but better than it is now.
May be we should start with this task of two different clipping boxes
(plot and canvas). Then, the rest could be done sequencially.
I still have the idea that there should be a terminal-independent option
that changes the size of the canvas by a factor. I am aware that this
would be difficult to explain because a thing like
set canvasscale 1.5,1.5
set terminal png size 640,480
would lead to a picture of the size 960 x 720 which seams pretty
unlogical. But in some cases such a function could be useful. For some
terminals this new function would then do the same as a 'set size' before
'set terminal' does now. But I think, this functionality could be added
after providing a clean solution for differentiation between plot size and
canvas size.
Best regards
Harald
--
Harald Harders
h.h...@tu...
http://www.harald-harders.de
|