microproduct/atmosphericDelay/ISCEApp/site-packages/reportlab/lib/boxstuff.py

85 lines
2.9 KiB
Python

#Copyright ReportLab Europe Ltd. 2000-2017
#see license.txt for license details
__version__='3.4.34'
__doc__='''Utility functions to position and resize boxes within boxes'''
def rectCorner(x, y, width, height, anchor='sw', dims=False):
'''given rectangle controlled by x,y width and height return
the corner corresponding to the anchor'''
if anchor not in ('nw','w','sw'):
if anchor in ('n','c','s'):
x += width/2.
else:
x += width
if anchor not in ('sw','s','se'):
if anchor in ('w','c','e'):
y += height/2.
else:
y += height
return (x,y,width,height) if dims else (x,y)
def aspectRatioFix(preserve,anchor,x,y,width,height,imWidth,imHeight,anchorAtXY=False):
"""This function helps position an image within a box.
It first normalizes for two cases:
- if the width is None, it assumes imWidth
- ditto for height
- if width or height is negative, it adjusts x or y and makes them positive
Given
(a) the enclosing box (defined by x,y,width,height where x,y is the \
lower left corner) which you wish to position the image in, and
(b) the image size (imWidth, imHeight), and
(c) the 'anchor point' as a point of the compass - n,s,e,w,ne,se etc \
and c for centre,
this should return the position at which the image should be drawn,
as well as a scale factor indicating what scaling has happened.
It returns the parameters which would be used to draw the image
without any adjustments:
x,y, width, height, scale
used in canvas.drawImage and drawInlineImage
"""
scale = 1.0
if width is None:
width = imWidth
if height is None:
height = imHeight
if width<0:
width = -width
x -= width
if height<0:
height = -height
y -= height
if preserve:
imWidth = abs(imWidth)
imHeight = abs(imHeight)
scale = min(width/float(imWidth),height/float(imHeight))
owidth = width
oheight = height
width = scale*imWidth-1e-8
height = scale*imHeight-1e-8
if not anchorAtXY:
# if anchor not in ('nw','w','sw'):
# dx = owidth-width
# if anchor in ('n','c','s'):
# x += dx/2.
# else:
# x += dx
# if anchor not in ('sw','s','se'):
# dy = oheight-height
# if anchor in ('w','c','e'):
# y += dy/2.
# else:
# y += dy
x, y = rectCorner(x,y,owidth-width,oheight-height,anchor)
if anchorAtXY:
if anchor not in ('sw','s','se'):
y -= height/2. if anchor in ('e','c','w') else height
if anchor not in ('nw','w','sw'):
x -= width/2. if anchor in ('n','c','s') else width
return x,y, width, height, scale