예제 #1
0
def export(width, height, filename, elements):
    surface = SVGSurface(filename, width, height)
    ctx = Context(width, height, surface)

    elements.draw(ctx)

    surface.finish()
예제 #2
0
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),
        )
예제 #3
0
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()
예제 #5
0
파일: util.py 프로젝트: msarch/py
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
예제 #6
0
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()
예제 #7
0
파일: svg.py 프로젝트: Ecoblockchain/iutils
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()
예제 #8
0
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!"
예제 #9
0
파일: drawBagel.py 프로젝트: lifegpc/csweb
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)
예제 #10
0
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))
예제 #11
0
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()
예제 #12
0
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
예제 #13
0
    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()
예제 #14
0
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)):
예제 #16
0
    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)):