fix several overlay plugin rendering glitches (Issue #103)

pull/106/head
Hartmut Holzgraefe 2023-11-25 17:29:45 +00:00
rodzic 471e535697
commit 1468c04d0d
6 zmienionych plików z 42 dodań i 44 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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()

Wyświetl plik

@ -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()

Wyświetl plik

@ -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()

Wyświetl plik

@ -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

Wyświetl plik

@ -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