kopia lustrzana https://github.com/hholzgra/ocitysmap
fix several overlay plugin rendering glitches (Issue #103)
rodzic
471e535697
commit
1468c04d0d
|
@ -422,11 +422,9 @@ class Renderer:
|
|||
|
||||
y = bbox.get_top_left()[0] - lat
|
||||
y*= (dpi/72.0) * self._map_coords[3] / horiz_angle_span
|
||||
y+= (dpi/72.0) * self._map_coords[1]
|
||||
|
||||
x = lon - bbox.get_top_left()[1]
|
||||
x*= (dpi/72.0) * self._map_coords[2] / vert_angle_span
|
||||
x+= (dpi/72.0) * self._map_coords[0]
|
||||
|
||||
return x,y
|
||||
|
||||
|
|
|
@ -367,7 +367,6 @@ class MultiPageRenderer(Renderer):
|
|||
plugin_name = path.lstrip('internal:')
|
||||
LOG.warning("plugin: %s - %s" % (path, plugin_name))
|
||||
if plugin_name == 'qrcode':
|
||||
# QRcode should not be rendered on actual map pages here
|
||||
if not self.rc.qrcode_text:
|
||||
self.rc.qrcode_text = self.rc.origin_url
|
||||
else:
|
||||
|
@ -425,10 +424,8 @@ class MultiPageRenderer(Renderer):
|
|||
for overlay in self._overlays:
|
||||
path = overlay.path.strip()
|
||||
if path.startswith('internal:'):
|
||||
if plugin_name != 'qrcode':
|
||||
# ignore QRcode plugin
|
||||
plugin_name = path.lstrip('internal:')
|
||||
overlay_effects[plugin_name] = self.get_plugin(plugin_name)
|
||||
plugin_name = path.lstrip('internal:')
|
||||
overlay_effects[plugin_name] = self.get_plugin(plugin_name)
|
||||
else:
|
||||
overlay_canvases.append(MapCanvas(overlay,
|
||||
bb, self._usable_area_width_pt,
|
||||
|
@ -649,8 +646,7 @@ class MultiPageRenderer(Renderer):
|
|||
path = overlay.path.strip()
|
||||
if path.startswith('internal:'):
|
||||
plugin_name = path.lstrip('internal:')
|
||||
if plugin_name != "qrcode":
|
||||
self._frontpage_overlay_effects[plugin_name] = self.get_plugin(plugin_name)
|
||||
self._frontpage_overlay_effects[plugin_name] = self.get_plugin(plugin_name)
|
||||
else:
|
||||
ov_canvas = MapCanvas(overlay,
|
||||
self.rc.bounding_box,
|
||||
|
@ -693,18 +689,19 @@ class MultiPageRenderer(Renderer):
|
|||
rendered_map = ov_canvas.get_rendered_map()
|
||||
mapnik.render(rendered_map, ctx)
|
||||
|
||||
# TODO offsets are not correct here, so we skip overlay plugins for now
|
||||
# apply effect overlays
|
||||
ctx.save()
|
||||
# ctx.save()
|
||||
# we have to undo border adjustments here
|
||||
ctx.translate(0, -(0.3 * h + Renderer.PRINT_SAFE_MARGIN_PT))
|
||||
self._map_canvas = self._front_page_map;
|
||||
for plugin_name, effect in self._frontpage_overlay_effects.items():
|
||||
try:
|
||||
effect.render(self, ctx)
|
||||
except Exception as e:
|
||||
# TODO better logging
|
||||
LOG.warning("Error while rendering overlay: %s\n%s" % (plugin_name, e))
|
||||
ctx.restore()
|
||||
# ctx.translate(0, -(0.3 * h + Renderer.PRINT_SAFE_MARGIN_PT))
|
||||
# self._map_canvas = self._front_page_map;
|
||||
# for plugin_name, effect in self._frontpage_overlay_effects.items():
|
||||
# try:
|
||||
# effect.render(self, ctx)
|
||||
# except Exception as e:
|
||||
# # TODO better logging
|
||||
# LOG.warning("Error while rendering overlay: %s\n%s" % (plugin_name, e))
|
||||
# ctx.restore()
|
||||
|
||||
|
||||
|
||||
|
@ -910,10 +907,6 @@ class MultiPageRenderer(Renderer):
|
|||
|
||||
# apply effect overlays
|
||||
ctx.save()
|
||||
# we have to undo border adjustments here
|
||||
ctx.translate(
|
||||
-commons.convert_pt_to_dots(Renderer.PRINT_SAFE_MARGIN_PT),
|
||||
-commons.convert_pt_to_dots(Renderer.PRINT_SAFE_MARGIN_PT))
|
||||
self._map_canvas = self.overview_canvas;
|
||||
for plugin_name, effect in self.overview_overlay_effects.items():
|
||||
try:
|
||||
|
@ -1178,18 +1171,14 @@ class MultiPageRenderer(Renderer):
|
|||
|
||||
# apply effect overlays
|
||||
ctx.save()
|
||||
# we have to undo border adjustments here
|
||||
ctx.translate(-commons.convert_pt_to_dots(self.grayed_margin_pt)/2,
|
||||
-commons.convert_pt_to_dots(self.grayed_margin_pt)/2)
|
||||
self._map_canvas = canvas;
|
||||
for plugin_name, effect in overlay_effects.items():
|
||||
self.grid = grid
|
||||
self._map_canvas = canvas
|
||||
try:
|
||||
effect.render(self, ctx)
|
||||
except Exception as e:
|
||||
# TODO better logging
|
||||
LOG.warning("Error while rendering overlay: %s\n%s" % (plugin_name, e))
|
||||
effect.render(self, ctx)
|
||||
ctx.restore()
|
||||
|
||||
|
||||
|
|
|
@ -42,19 +42,14 @@ def render(renderer, ctx):
|
|||
# load and scale the SVG image
|
||||
rose_grp, rose_width = Renderer._get_svg(ctx, svg_path, h)
|
||||
|
||||
# determine image position depending on renderer used
|
||||
if type(renderer).__name__ == "MultiPageRenderer":
|
||||
x = 0
|
||||
y = 0
|
||||
else:
|
||||
x = convert_pt_to_dots(renderer._map_coords[0], renderer.dpi)
|
||||
y = convert_pt_to_dots(renderer._map_coords[1], renderer.dpi)
|
||||
|
||||
# output image on top of the current cairo context
|
||||
|
||||
ctx.save()
|
||||
ctx.translate(x + h/2, y + h/2)
|
||||
|
||||
ctx.translate(h/10, h/10) # leave a bit of space to the map border
|
||||
ctx.set_source(rose_grp)
|
||||
ctx.paint_with_alpha(0.75)
|
||||
ctx.stroke()
|
||||
|
||||
ctx.restore()
|
||||
|
||||
|
|
|
@ -16,6 +16,11 @@ import logging
|
|||
LOG = logging.getLogger('ocitysmap')
|
||||
|
||||
def render(renderer, ctx):
|
||||
if type(renderer).__name__ == "MultiPageRenderer":
|
||||
# the multi page renderer has the QR code in the front page footer
|
||||
# no need to also have it repeated on all individual map pages
|
||||
return
|
||||
|
||||
if renderer.rc.qrcode_text:
|
||||
qrcode_text = renderer.rc.qrcode_text
|
||||
else:
|
||||
|
@ -24,8 +29,8 @@ def render(renderer, ctx):
|
|||
if not qrcode_text:
|
||||
return
|
||||
|
||||
x = convert_pt_to_dots(renderer._map_coords[0], renderer.dpi)
|
||||
y = convert_pt_to_dots(renderer._map_coords[1], renderer.dpi)
|
||||
x = 0
|
||||
y = 0
|
||||
w = convert_pt_to_dots(renderer._map_coords[2], renderer.dpi)
|
||||
h = convert_pt_to_dots(renderer._map_coords[3], renderer.dpi)
|
||||
W = convert_pt_to_dots(renderer.paper_width_pt)
|
||||
|
@ -54,6 +59,9 @@ def render(renderer, ctx):
|
|||
svg = rsvg.new_from_data(svg_val)
|
||||
svgstr.close()
|
||||
|
||||
ctx.save()
|
||||
|
||||
ctx.push_group()
|
||||
ctx.save()
|
||||
ctx.translate(x + w - size,
|
||||
y + h - size)
|
||||
|
@ -62,3 +70,9 @@ def render(renderer, ctx):
|
|||
ctx.scale(factor, factor)
|
||||
svg.render_cairo(ctx)
|
||||
ctx.restore()
|
||||
|
||||
ctx.set_source(ctx.pop_group())
|
||||
ctx.paint_with_alpha(0.75)
|
||||
ctx.stroke()
|
||||
|
||||
ctx.restore()
|
||||
|
|
|
@ -9,6 +9,8 @@ from ocitysmap.layoutlib.commons import convert_pt_to_dots
|
|||
from ocitysmap.layoutlib.abstract_renderer import Renderer
|
||||
from math import floor, log10
|
||||
|
||||
LOG = logging.getLogger('ocitysmap')
|
||||
|
||||
def render(renderer, ctx):
|
||||
def pt2px(dot):
|
||||
return dot * renderer.dpi / 72.0
|
||||
|
@ -29,7 +31,7 @@ def render(renderer, ctx):
|
|||
dots = map_coords_dots[2]
|
||||
|
||||
if type(renderer).__name__ == "MultiPageRenderer":
|
||||
dots = dots - 2 * renderer.PRINT_SAFE_MARGIN_PT
|
||||
dots = dots - 2 * renderer.grayed_margin_pt
|
||||
|
||||
step_horiz = dots / renderer.grid.horiz_count
|
||||
|
||||
|
@ -46,12 +48,11 @@ def render(renderer, ctx):
|
|||
tickHeight = pt2px(15) # height of the tick marks
|
||||
|
||||
x = barBuffer
|
||||
x+= map_coords_dots[0]
|
||||
if type(renderer).__name__ == "MultiPageRenderer":
|
||||
x += renderer.PRINT_SAFE_MARGIN_PT
|
||||
# TODO more perfectly align actual scale bar with grid here?
|
||||
x += renderer.grayed_margin_pt
|
||||
|
||||
y = m.height
|
||||
y+= map_coords_dots[1]
|
||||
y-= barBuffer+lBuffer+lBuffer+tickHeight
|
||||
|
||||
w = pxScaleBar + 2*lBuffer
|
||||
|
|
|
@ -605,7 +605,8 @@ class SinglePageRenderer(Renderer):
|
|||
|
||||
# make sure that plugins do not render outside the actual map area
|
||||
ctx.save()
|
||||
ctx.rectangle(map_coords_dots[0], map_coords_dots[1], map_coords_dots[2], map_coords_dots[3])
|
||||
ctx.translate(map_coords_dots[0], map_coords_dots[1])
|
||||
ctx.rectangle(0, 0, map_coords_dots[2], map_coords_dots[3])
|
||||
ctx.clip()
|
||||
|
||||
# apply effect plugin overlays
|
||||
|
|
Ładowanie…
Reference in New Issue