def export(width, height, filename, elements): surface = SVGSurface(filename, width, height) ctx = Context(width, height, surface) elements.draw(ctx) surface.finish()
def test_render_points(): # Test for effectivenes of ticket #402 (borderline points get lost on reprojection) raise Todo("See: http://trac.mapnik2.org/ticket/402") if not mapnik2.has_pycairo(): return # create and populate point datasource (WGS84 lat-lon coordinates) places_ds = mapnik2.PointDatasource() places_ds.add_point(142.48, -38.38, "Name", "Westernmost Point") # westernmost places_ds.add_point(143.10, -38.60, "Name", "Southernmost Point") # southernmost # create layer/rule/style s = mapnik2.Style() r = mapnik2.Rule() symb = mapnik2.PointSymbolizer() symb.allow_overlap = True r.symbols.append(symb) s.rules.append(r) lyr = mapnik2.Layer("Places", "+proj=latlon +datum=WGS84") lyr.datasource = places_ds lyr.styles.append("places_labels") # latlon bounding box corners ul_lonlat = mapnik2.Coord(142.30, -38.20) lr_lonlat = mapnik2.Coord(143.40, -38.80) # render for different projections projs = { "latlon": "+proj=latlon +datum=WGS84", "merc": "+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs", "google": "+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m", "utm": "+proj=utm +zone=54 +datum=WGS84", } from cairo import SVGSurface for projdescr in projs.iterkeys(): m = mapnik2.Map(1000, 500, projs[projdescr]) m.append_style("places_labels", s) m.layers.append(lyr) p = mapnik2.Projection(projs[projdescr]) m.zoom_to_box(p.forward(mapnik2.Box2d(ul_lonlat, lr_lonlat))) # Render to SVG so that it can be checked how many points are there with string comparison import StringIO svg_memory_file = StringIO.StringIO() surface = SVGSurface(svg_memory_file, m.width, m.height) mapnik2.render(m, surface) surface.flush() surface.finish() svg = svg_memory_file.getvalue() svg_memory_file.close() num_points_present = len(places_ds.all_features()) num_points_rendered = svg.count("<image ") eq_( num_points_present, num_points_rendered, "Not all points were rendered (%d instead of %d) at projection %s" % (num_points_rendered, num_points_present, projdescr), )
def extract_polygon_data(romset_dir, cinematic): global polygon_data, pdata_offset global cinematic_entries global cinematic_counter global video2_entries global game_level if cinematic: try: polygon_data = open(f"{romset_dir}/cinematic.rom", "rb").read() except: print("FIXME! Did not find a cinematic.rom file...") return entries = cinematic_entries level_path = f"{output_dir}/level_{game_level}" dirpath = f"{level_path}/cinematic/" makedir(level_path) else: try: polygon_data = open(f"{romset_dir}/video2.rom", "rb").read() except: print("FIXME! Did not find a video2.rom file...") return entries = video2_entries dirpath = f"{output_dir}/common_video/" game_level = 0 makedir(dirpath) for addr in entries.keys(): entry = entries[addr] s = SVGSurface(f"{dirpath}/{entry['label']}.svg", 320, 200) c = Context(s) zoom = entry["zoom"] x = entry["x"] y = entry["y"] if not isinstance(zoom, int): zoom = 0x40 #HACK! if not isinstance(x, int): x = 160 #HACK! if not isinstance(y, int): y = 100 #HACK! #print ("\ndecoding polygons at {}: {}".format(hex(addr), entry)) pdata_offset = addr readAndDrawPolygon(c, COLOR_BLACK, zoom, x, y) s.finish() # reset structures: cinematic_entries = {} cinematic_counter = 0
def extract_polygon_data(self, game_level, entries, cinematic): if cinematic: self.game_level = game_level else: self.game_level = 0 try: self.palette_data = open(f"{self.romset_dir}/palettes.rom", "rb").read() except: print("ERROR! Did not find a palettes.rom file...") return if cinematic: try: self.polygon_data = open(f"{self.romset_dir}/cinematic.rom", "rb").read() except: print("ERROR! Did not find a cinematic.rom file...") return level_path = f"{self.output_dir}/level_{game_level}" dirpath = f"{level_path}/cinematic/" makedir(level_path) else: try: self.polygon_data = open(f"{self.romset_dir}/video2.rom", "rb").read() except: print("ERROR! Did not find a video2.rom file...") return dirpath = f"{self.output_dir}/common_video/" makedir(dirpath) for addr in entries.keys(): entry = entries[addr] s = SVGSurface(f"{dirpath}/{entry['label']}.svg", 320, 200) ctx = Context(s) zoom = entry["zoom"] x = entry["x"] y = entry["y"] palette_number = entry["palette_number"] if not isinstance(zoom, int): zoom = 0x40 #HACK! if not isinstance(x, int): x = 160 #HACK! if not isinstance(y, int): y = 100 #HACK! #print ("\ndecoding polygons at {}: {}".format(hex(addr), entry)) self.readAndDrawPolygon(addr, ctx, palette_number, COLOR_BLACK, zoom, x, y) s.finish()
def get_svg_surface(): global _svg_surface if _svg_surface is None: try: _svg_surface = SVGSurface(None, 0, 0) except: if os.name == 'nt': fobj = 'nul' else: fobj = '/dev/null' _svg_surface = SVGSurface(fobj, 0, 0) return _svg_surface
def draw_svg_asd(filename): surface = SVGSurface(filename, 320, 240) c = cairo.Context(surface) c.set_source_rgb(1, 1, 1) c.paint() c.arc(100, 80, 50, 0, 2*math.pi) c.set_source_rgba(1,0,0,1) c.fill() surface.finish()
def export_svg(fn, paths, size, line_with=0.1, scale_factor=None): from cairo import SVGSurface, Context from .ddd import spatial_sort_2d as sort if not scale_factor: scale_factor = size s = SVGSurface(fn, size, size) c = Context(s) c.set_line_width(0.1) paths = sort(paths) for path in paths: path *= scale_factor c.new_path() c.move_to(*path[0, :]) for p in path[1:]: c.line_to(*p) c.stroke() c.save()
class MapSurface(object): """wrapper to render the map to svg/png""" def __init__(self, hexmap=None, filename=None, width=None, height=None, size=None): self.hexmap = hexmap if self.hexmap is None: raise ValueError("No map was passed to {}".format(self.__class__.__name__)) self.surface_name = filename or "test.svg" self.size = size or 32.0 self.surface_width = width if self.surface_width is None: self.surface_width = (self.hexmap.map.cols + .5) * self.size * SQRT3 self.surface_height = height if self.surface_height is None: self.surface_height = (self.hexmap.map.rows * 1.5 + .25) * self.size self.layer = [] # build base map self.surface = SVGSurface(self.surface_name + ".svg", self.surface_width, self.surface_height) self.context = Context(self.surface) # background: magenta self.context.save() self.context.set_source_rgb(1.0, 0.0, 1.0) self.context.paint() self.context.restore() def add_layer(self, renderer_cls, position=None): if not position: self.layer.append(renderer_cls(self)) else: self.layer.insert(position, renderer_cls(self)) def render(self): print "Rendering {} ({}x{})".format(self.surface_name, self.surface_width, self.surface_height) for renderer in self.layer: renderer.render() def finalise(self, with_png=False): print "finalising:" if with_png is True: print "PNG" self.surface.write_to_png(self.surface_name + ".png") print "SVG" self.surface.finish() print "DONE!"
def textwidth(text: str, fontSize: int, font: str): fn = abspath(gettempdir() + "/" + next(_get_candidate_names())) width = len(text) * fontSize with SVGSurface(fn, 1280, 720) as surface: cr = Context(surface) cr.select_font_face(font, FONT_SLANT_NORMAL, FONT_WEIGHT_BOLD) cr.set_font_size(fontSize) width = cr.text_extents(text)[2] remove(fn) return round(width, 1)
def test_render_points(): # Test for effectivenes of ticket #402 (borderline points get lost on reprojection) raise Todo("See: http://trac.mapnik2.org/ticket/402") if not mapnik2.has_pycairo(): return # create and populate point datasource (WGS84 lat-lon coordinates) places_ds = mapnik2.PointDatasource() places_ds.add_point(142.48, -38.38, 'Name', 'Westernmost Point') # westernmost places_ds.add_point(143.10, -38.60, 'Name', 'Southernmost Point') # southernmost # create layer/rule/style s = mapnik2.Style() r = mapnik2.Rule() symb = mapnik2.PointSymbolizer() symb.allow_overlap = True r.symbols.append(symb) s.rules.append(r) lyr = mapnik2.Layer('Places', '+proj=latlon +datum=WGS84') lyr.datasource = places_ds lyr.styles.append('places_labels') # latlon bounding box corners ul_lonlat = mapnik2.Coord(142.30, -38.20) lr_lonlat = mapnik2.Coord(143.40, -38.80) # render for different projections projs = { 'latlon': '+proj=latlon +datum=WGS84', 'merc': '+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs', 'google': '+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m', 'utm': '+proj=utm +zone=54 +datum=WGS84' } from cairo import SVGSurface for projdescr in projs.iterkeys(): m = mapnik2.Map(1000, 500, projs[projdescr]) m.append_style('places_labels', s) m.layers.append(lyr) p = mapnik2.Projection(projs[projdescr]) m.zoom_to_box(p.forward(mapnik2.Box2d(ul_lonlat, lr_lonlat))) # Render to SVG so that it can be checked how many points are there with string comparison import StringIO svg_memory_file = StringIO.StringIO() surface = SVGSurface(svg_memory_file, m.width, m.height) mapnik2.render(m, surface) surface.flush() surface.finish() svg = svg_memory_file.getvalue() svg_memory_file.close() num_points_present = len(places_ds.all_features()) num_points_rendered = svg.count('<image ') eq_( num_points_present, num_points_rendered, "Not all points were rendered (%d instead of %d) at projection %s" % (num_points_rendered, num_points_present, projdescr))
def export_svg(fn, paths, w, h, line_width=0.1): from cairo import SVGSurface, Context s = SVGSurface(fn, w, h) c = Context(s) c.set_line_width(line_width) for path in paths: c.new_path() c.move_to(*path[0, :]) for p in path[1:]: c.line_to(*p) c.stroke() c.save()
def main(args, **argv): from dddUtils.ioOBJ import load_2d as load from cairo import SVGSurface, Context from numpy import array from glob import glob prefix = args.prefix size = args.size scale = args.scale one = 1.0/size steps = args.steps stride = args.stride skip = args.skip out = prefix + '.svg' print('making file: {:s}'.format(out)) s = SVGSurface(out, size, size) c = Context(s) c.set_line_width(0.1) c.set_source_rgba(*BLACK) for fn in sorted(glob(prefix + '*.2obj'))[skip:steps:stride]: print(fn) data = load(fn) vertices = data['vertices'] vertices *= scale*size edges = data['edges'] # make_random_line(c, vertices, edges) make_line(c, vertices, edges) c.save() return
def __init__(self, hexmap=None, filename=None, width=None, height=None, size=None): self.hexmap = hexmap if self.hexmap is None: raise ValueError("No map was passed to {}".format(self.__class__.__name__)) self.surface_name = filename or "test.svg" self.size = size or 32.0 self.surface_width = width if self.surface_width is None: self.surface_width = (self.hexmap.map.cols + .5) * self.size * SQRT3 self.surface_height = height if self.surface_height is None: self.surface_height = (self.hexmap.map.rows * 1.5 + .25) * self.size self.layer = [] # build base map self.surface = SVGSurface(self.surface_name + ".svg", self.surface_width, self.surface_height) self.context = Context(self.surface) # background: magenta self.context.save() self.context.set_source_rgb(1.0, 0.0, 1.0) self.context.paint() self.context.restore()
def main(args, **argv): # from render.render import Render from dddUtils.ioOBJ import load_2d as load from cairo import SVGSurface, Context from numpy import array size = args.size scale = args.scale one = 1.0 / size data = load(args.fn) print(data) vertices = data['vertices'] faces = data['faces'] edges = data['edges'] out = '.'.join(args.fn.split('.')[:-1]) + '.svg' print('making file: {:s}'.format(out)) s = SVGSurface(out, size, size) c = Context(s) c.set_line_width(0.1) c.set_source_rgba(*BLACK) vertices -= get_mid(vertices) vertices *= scale vertices += array([[0.5, 0.5]]) vertices *= size make_triangles(c, vertices, faces, edges) # make_random_length_strips(c, vertices, faces, edges) c.save() return
bbox = outline.get_cbox() MARGIN = 10 scale = 3 def Floor64(x): return (x // 64) * 64 def Ceil64(x): return ((x + 63) // 64) * 64 width_s = (width * 64) // scale + 2 * MARGIN height_s = (rows * 64) // scale + 2 * MARGIN surface = SVGSurface('glyph-vector-2-cairo.svg', width_s, height_s) ctx = Context(surface) ctx.set_source_rgb(1, 1, 1) ctx.paint() ctx.save() ctx.scale(1.0 / scale, 1.0 / scale) ctx.translate(-Floor64(bbox.xMin) + MARGIN * scale, -Floor64(bbox.yMin) + MARGIN * scale) ctx.transform(Matrix(1, 0, 0, -1)) ctx.translate(0, -(Ceil64(bbox.yMax) + Floor64(bbox.yMin))) # difference! start, end = 0, 0 VERTS, CODES = [], [] # Iterate over each contour for i in range(len(outline.contours)):
bbox = outline.get_bbox() MARGIN = 10 scale = 3 def Floor64(x): return (x//64) * 64 def Ceil64(x): return ((x+63)//64) * 64 width_s = (width * 64)//scale + 2 * MARGIN height_s = (rows * 64)//scale + 2 * MARGIN surface = SVGSurface('glyph-vector-2-cairo.svg', width_s, height_s) ctx = Context(surface) ctx.set_source_rgb(1,1,1) ctx.paint() ctx.save() ctx.scale(1.0/scale,1.0/scale) ctx.translate(-Floor64(bbox.xMin) + MARGIN * scale,-Floor64(bbox.yMin) + MARGIN * scale) ctx.transform(Matrix(1,0,0,-1)) ctx.translate(0, -(Ceil64(bbox.yMax) + Floor64(bbox.yMin))) # difference! start, end = 0, 0 VERTS, CODES = [], [] # Iterate over each contour for i in range(len(outline.contours)):