fix cairo reference counting and add more cairo context tests - closes #2031
This commit is contained in:
parent
986f47e959
commit
86dfa0778a
8 changed files with 221 additions and 40 deletions
|
@ -37,6 +37,7 @@
|
|||
#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
|
||||
#include <mapnik/cairo_context.hpp>
|
||||
#include <pycairo.h>
|
||||
#include <cairo.h>
|
||||
#endif
|
||||
|
||||
using mapnik::image_32;
|
||||
|
@ -207,7 +208,7 @@ void composite(image_32 & dst, image_32 & src, mapnik::composite_mode_e mode, fl
|
|||
#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
|
||||
boost::shared_ptr<image_32> from_cairo(PycairoSurface* py_surface)
|
||||
{
|
||||
mapnik::cairo_surface_ptr surface(py_surface->surface, mapnik::cairo_surface_closer());
|
||||
mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
|
||||
boost::shared_ptr<image_32> image_ptr = boost::make_shared<image_32>(surface);
|
||||
return image_ptr;
|
||||
}
|
||||
|
|
|
@ -116,6 +116,7 @@ void clear_cache()
|
|||
|
||||
#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
|
||||
#include <pycairo.h>
|
||||
#include <cairo.h>
|
||||
static Pycairo_CAPI_t *Pycairo_CAPI;
|
||||
#endif
|
||||
|
||||
|
@ -200,7 +201,7 @@ void render5(const mapnik::Map& map,
|
|||
unsigned offset_y = 0)
|
||||
{
|
||||
python_unblock_auto_block b;
|
||||
mapnik::cairo_ptr context(py_context->ctx, mapnik::cairo_closer());
|
||||
mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
|
||||
mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,scale_factor,offset_x, offset_y);
|
||||
ren.apply();
|
||||
}
|
||||
|
@ -208,7 +209,7 @@ void render5(const mapnik::Map& map,
|
|||
void render6(const mapnik::Map& map, PycairoContext* py_context)
|
||||
{
|
||||
python_unblock_auto_block b;
|
||||
mapnik::cairo_ptr context(py_context->ctx, mapnik::cairo_closer());
|
||||
mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
|
||||
mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context);
|
||||
ren.apply();
|
||||
}
|
||||
|
@ -219,7 +220,7 @@ void render_with_detector2(
|
|||
boost::shared_ptr<mapnik::label_collision_detector4> detector)
|
||||
{
|
||||
python_unblock_auto_block b;
|
||||
mapnik::cairo_ptr context(py_context->ctx, mapnik::cairo_closer());
|
||||
mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
|
||||
mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,detector);
|
||||
ren.apply();
|
||||
}
|
||||
|
@ -233,7 +234,7 @@ void render_with_detector3(
|
|||
unsigned offset_y = 0u)
|
||||
{
|
||||
python_unblock_auto_block b;
|
||||
mapnik::cairo_ptr context(py_context->ctx, mapnik::cairo_closer());
|
||||
mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
|
||||
mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,detector,scale_factor,offset_x,offset_y);
|
||||
ren.apply();
|
||||
}
|
||||
|
|
|
@ -301,7 +301,7 @@ int main ( int argc , char** argv)
|
|||
cairo_image_surface_create(CAIRO_FORMAT_ARGB32,m.width(),m.height()),
|
||||
cairo_surface_closer());
|
||||
double scale_factor = 1.0;
|
||||
cairo_ptr image_context = (create_context(image_surface));
|
||||
cairo_ptr image_context(create_context(image_surface));
|
||||
mapnik::cairo_renderer<cairo_ptr> png_render(m,image_context,scale_factor);
|
||||
png_render.apply();
|
||||
// we can now write to png with cairo functionality
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import mapnik
|
||||
from nose.tools import *
|
||||
from utilities import execution_path, run_all
|
||||
|
@ -10,53 +11,181 @@ def setup():
|
|||
# from another directory we need to chdir()
|
||||
os.chdir(execution_path('.'))
|
||||
|
||||
if mapnik.has_pycairo() and 'sqlite' in mapnik.DatasourceCache.plugin_names():
|
||||
def make_tmp_map():
|
||||
m = mapnik.Map(512,512)
|
||||
m.background_color = mapnik.Color('steelblue')
|
||||
ds = mapnik.MemoryDatasource()
|
||||
context = mapnik.Context()
|
||||
context.push('Name')
|
||||
f = mapnik.Feature(context,1)
|
||||
f['Name'] = 'Hello'
|
||||
f.add_geometries_from_wkt('POINT (0 0)')
|
||||
ds.add_feature(f)
|
||||
s = mapnik.Style()
|
||||
r = mapnik.Rule()
|
||||
sym = mapnik.MarkersSymbolizer()
|
||||
sym.allow_overlap = True
|
||||
r.symbols.append(sym)
|
||||
s.rules.append(r)
|
||||
lyr = mapnik.Layer('Layer')
|
||||
lyr.datasource = ds
|
||||
lyr.styles.append('style')
|
||||
m.append_style('style',s)
|
||||
m.layers.append(lyr)
|
||||
return m
|
||||
|
||||
def _pycairo_surface(type,sym):
|
||||
import cairo
|
||||
test_cairo_file = '/tmp/test.%s' % type
|
||||
m = mapnik.Map(256,256)
|
||||
mapnik.load_map(m,'../data/good_maps/%s_symbolizer.xml' % sym)
|
||||
if hasattr(cairo,'%sSurface' % type.upper()):
|
||||
surface = getattr(cairo,'%sSurface' % type.upper())(test_cairo_file, m.width,m.height)
|
||||
mapnik.render(m, surface)
|
||||
surface.finish()
|
||||
if os.path.exists(test_cairo_file):
|
||||
def draw_title(m,ctx,text,size=10,color=mapnik.Color('black')):
|
||||
""" Draw a Map Title near the top of a page."""
|
||||
middle = m.width/2.0
|
||||
ctx.set_source_rgba(*cairo_color(color))
|
||||
ctx.select_font_face("DejaVu Sans Book", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
|
||||
ctx.set_font_size(size)
|
||||
x_bearing, y_bearing, width, height = ctx.text_extents(text)[:4]
|
||||
ctx.move_to(middle - width / 2 - x_bearing, 20.0 - height / 2 - y_bearing)
|
||||
ctx.show_text(text)
|
||||
|
||||
def draw_neatline(m,ctx):
|
||||
w,h = m.width, m.height
|
||||
ctx.set_source_rgba(*cairo_color(mapnik.Color('black')))
|
||||
outline = [
|
||||
[0,0],[w,0],[w,h],[0,h]
|
||||
]
|
||||
ctx.set_line_width(1)
|
||||
for idx,pt in enumerate(outline):
|
||||
if (idx == 0):
|
||||
ctx.move_to(*pt)
|
||||
else:
|
||||
ctx.line_to(*pt)
|
||||
ctx.close_path()
|
||||
inset = 6
|
||||
inline = [
|
||||
[inset,inset],[w-inset,inset],[w-inset,h-inset],[inset,h-inset]
|
||||
]
|
||||
ctx.set_line_width(inset/2)
|
||||
for idx,pt in enumerate(inline):
|
||||
if (idx == 0):
|
||||
ctx.move_to(*pt)
|
||||
else:
|
||||
ctx.line_to(*pt)
|
||||
ctx.close_path()
|
||||
ctx.stroke()
|
||||
|
||||
def cairo_color(c):
|
||||
""" Return a Cairo color tuple from a Mapnik Color."""
|
||||
ctx_c = (c.r/255.0,c.g/255.0,c.b/255.0,c.a/255.0)
|
||||
return ctx_c
|
||||
|
||||
if mapnik.has_pycairo():
|
||||
import cairo
|
||||
|
||||
def test_passing_pycairo_context_svg():
|
||||
m = make_tmp_map()
|
||||
m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
|
||||
test_cairo_file = '/tmp/mapnik-cairo-context-test.svg'
|
||||
surface = cairo.SVGSurface(test_cairo_file, m.width, m.height)
|
||||
expected_cairo_file = './images/pycairo/cairo-cairo-expected.svg'
|
||||
context = cairo.Context(surface)
|
||||
mapnik.render(m,context)
|
||||
draw_title(m,context,"Hello Map",size=20)
|
||||
draw_neatline(m,context)
|
||||
surface.finish()
|
||||
if not os.path.exists(expected_cairo_file):
|
||||
print 'generated expected cairo surface file %s' % expected_cairo_file
|
||||
shutil.copy(test_cairo_file,expected_cairo_file)
|
||||
eq_(os.stat(expected_cairo_file).st_size,os.stat(test_cairo_file).st_size)
|
||||
os.remove(test_cairo_file)
|
||||
|
||||
def test_passing_pycairo_context_pdf():
|
||||
m = make_tmp_map()
|
||||
m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
|
||||
test_cairo_file = '/tmp/mapnik-cairo-context-test.pdf'
|
||||
surface = cairo.PDFSurface(test_cairo_file, m.width, m.height)
|
||||
expected_cairo_file = './images/pycairo/cairo-cairo-expected.pdf'
|
||||
context = cairo.Context(surface)
|
||||
mapnik.render(m,context)
|
||||
draw_title(m,context,"Hello Map",size=20)
|
||||
draw_neatline(m,context)
|
||||
surface.finish()
|
||||
if not os.path.exists(expected_cairo_file):
|
||||
print 'generated expected cairo surface file %s' % expected_cairo_file
|
||||
shutil.copy(test_cairo_file,expected_cairo_file)
|
||||
eq_(os.stat(expected_cairo_file).st_size,os.stat(test_cairo_file).st_size)
|
||||
os.remove(test_cairo_file)
|
||||
|
||||
def test_passing_pycairo_context_png():
|
||||
m = make_tmp_map()
|
||||
m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
|
||||
test_cairo_file = '/tmp/mapnik-cairo-context-test.png'
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, m.width, m.height)
|
||||
expected_cairo_file = './images/pycairo/cairo-cairo-expected.png'
|
||||
expected_cairo_file2 = './images/pycairo/cairo-cairo-expected-reduced.png'
|
||||
context = cairo.Context(surface)
|
||||
mapnik.render(m,context)
|
||||
draw_title(m,context,"Hello Map",size=20)
|
||||
draw_neatline(m,context)
|
||||
surface.write_to_png(test_cairo_file)
|
||||
reduced_color_image = test_cairo_file.replace('png','-mapnik.png')
|
||||
im = mapnik.Image.from_cairo(surface)
|
||||
im.save(reduced_color_image,'png8')
|
||||
surface.finish()
|
||||
if not os.path.exists(expected_cairo_file):
|
||||
print 'generated expected cairo surface file %s' % expected_cairo_file
|
||||
shutil.copy(test_cairo_file,expected_cairo_file)
|
||||
eq_(os.stat(expected_cairo_file).st_size,os.stat(test_cairo_file).st_size)
|
||||
os.remove(test_cairo_file)
|
||||
if not os.path.exists(expected_cairo_file2):
|
||||
print 'generated expected cairo surface file %s' % expected_cairo_file2
|
||||
shutil.copy(reduced_color_image,expected_cairo_file2)
|
||||
eq_(os.stat(expected_cairo_file2).st_size,os.stat(reduced_color_image).st_size)
|
||||
os.remove(reduced_color_image)
|
||||
|
||||
if 'sqlite' in mapnik.DatasourceCache.plugin_names():
|
||||
def _pycairo_surface(type,sym):
|
||||
test_cairo_file = '/tmp/mapnik-cairo-surface-test.%s.%s' % (sym,type)
|
||||
expected_cairo_file = './images/pycairo/cairo-surface-expected.%s.%s' % (sym,type)
|
||||
m = mapnik.Map(256,256)
|
||||
mapnik.load_map(m,'../data/good_maps/%s_symbolizer.xml' % sym)
|
||||
m.zoom_all()
|
||||
if hasattr(cairo,'%sSurface' % type.upper()):
|
||||
surface = getattr(cairo,'%sSurface' % type.upper())(test_cairo_file, m.width,m.height)
|
||||
mapnik.render(m, surface)
|
||||
surface.finish()
|
||||
if not os.path.exists(expected_cairo_file):
|
||||
print 'generated expected cairo surface file %s' % expected_cairo_file
|
||||
shutil.copy(test_cairo_file,expected_cairo_file)
|
||||
eq_(os.stat(expected_cairo_file).st_size,os.stat(test_cairo_file).st_size)
|
||||
os.remove(test_cairo_file)
|
||||
return True
|
||||
else:
|
||||
# Fail, the file wasn't written
|
||||
return False
|
||||
else:
|
||||
print 'skipping cairo.%s test since surface is not available' % type.upper()
|
||||
return True
|
||||
print 'skipping cairo.%s test since surface is not available' % type.upper()
|
||||
return True
|
||||
|
||||
def test_pycairo_svg_surface1():
|
||||
eq_(_pycairo_surface('svg','point'),True)
|
||||
def test_pycairo_svg_surface1():
|
||||
eq_(_pycairo_surface('svg','point'),True)
|
||||
|
||||
def test_pycairo_svg_surface2():
|
||||
eq_(_pycairo_surface('svg','building'),True)
|
||||
def test_pycairo_svg_surface2():
|
||||
eq_(_pycairo_surface('svg','building'),True)
|
||||
|
||||
def test_pycairo_svg_surface3():
|
||||
eq_(_pycairo_surface('svg','polygon'),True)
|
||||
def test_pycairo_svg_surface3():
|
||||
eq_(_pycairo_surface('svg','polygon'),True)
|
||||
|
||||
def test_pycairo_pdf_surface1():
|
||||
eq_(_pycairo_surface('pdf','point'),True)
|
||||
def test_pycairo_pdf_surface1():
|
||||
eq_(_pycairo_surface('pdf','point'),True)
|
||||
|
||||
def test_pycairo_pdf_surface2():
|
||||
eq_(_pycairo_surface('pdf','building'),True)
|
||||
def test_pycairo_pdf_surface2():
|
||||
eq_(_pycairo_surface('pdf','building'),True)
|
||||
|
||||
def test_pycairo_pdf_surface3():
|
||||
eq_(_pycairo_surface('pdf','polygon'),True)
|
||||
def test_pycairo_pdf_surface3():
|
||||
eq_(_pycairo_surface('pdf','polygon'),True)
|
||||
|
||||
def test_pycairo_ps_surface1():
|
||||
eq_(_pycairo_surface('ps','point'),True)
|
||||
def test_pycairo_ps_surface1():
|
||||
eq_(_pycairo_surface('ps','point'),True)
|
||||
|
||||
def test_pycairo_ps_surface2():
|
||||
eq_(_pycairo_surface('ps','building'),True)
|
||||
def test_pycairo_ps_surface2():
|
||||
eq_(_pycairo_surface('ps','building'),True)
|
||||
|
||||
def test_pycairo_ps_surface3():
|
||||
eq_(_pycairo_surface('ps','polygon'),True)
|
||||
def test_pycairo_ps_surface3():
|
||||
eq_(_pycairo_surface('ps','polygon'),True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
setup()
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
BIN
tests/python_tests/images/pycairo/cairo-cairo-expected.pdf
Normal file
BIN
tests/python_tests/images/pycairo/cairo-cairo-expected.pdf
Normal file
Binary file not shown.
BIN
tests/python_tests/images/pycairo/cairo-cairo-expected.png
Normal file
BIN
tests/python_tests/images/pycairo/cairo-cairo-expected.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
50
tests/python_tests/images/pycairo/cairo-cairo-expected.svg
Normal file
50
tests/python_tests/images/pycairo/cairo-cairo-expected.svg
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512pt" height="512pt" viewBox="0 0 512 512" version="1.1">
|
||||
<defs>
|
||||
<g>
|
||||
<symbol overflow="visible" id="glyph0-0">
|
||||
<path style="stroke:none;" d=""/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-1">
|
||||
<path style="stroke:none;" d="M 1.570312 -14.34375 L 3.535156 -14.34375 L 3.535156 -8.417969 L 10.996094 -8.417969 L 10.996094 -14.34375 L 12.960938 -14.34375 L 12.960938 0 L 10.996094 0 L 10.996094 -6.710938 L 3.535156 -6.710938 L 3.535156 0 L 1.570312 0 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-2">
|
||||
<path style="stroke:none;" d="M 7.804688 -10.171875 C 8.5 -9.824219 9.03125 -9.371094 9.394531 -8.820312 C 9.746094 -8.292969 9.980469 -7.675781 10.097656 -6.972656 C 10.203125 -6.492188 10.253906 -5.722656 10.253906 -4.667969 L 2.585938 -4.667969 C 2.621094 -3.605469 2.871094 -2.753906 3.339844 -2.113281 C 3.808594 -1.472656 4.535156 -1.152344 5.515625 -1.152344 C 6.433594 -1.152344 7.167969 -1.453125 7.714844 -2.0625 C 8.027344 -2.414062 8.25 -2.820312 8.378906 -3.28125 L 10.109375 -3.28125 C 10.0625 -2.898438 9.910156 -2.46875 9.652344 -1.996094 C 9.394531 -1.523438 9.109375 -1.140625 8.789062 -0.839844 C 8.253906 -0.320312 7.59375 0.03125 6.804688 0.214844 C 6.382812 0.320312 5.90625 0.371094 5.371094 0.371094 C 4.070312 0.371094 2.964844 -0.101562 2.0625 -1.050781 C 1.15625 -1.996094 0.703125 -3.324219 0.703125 -5.03125 C 0.703125 -6.710938 1.160156 -8.074219 2.070312 -9.121094 C 2.980469 -10.167969 4.171875 -10.695312 5.644531 -10.695312 C 6.386719 -10.695312 7.105469 -10.519531 7.804688 -10.171875 Z M 8.445312 -6.0625 C 8.375 -6.824219 8.210938 -7.433594 7.949219 -7.890625 C 7.46875 -8.738281 6.664062 -9.160156 5.539062 -9.160156 C 4.730469 -9.160156 4.054688 -8.867188 3.507812 -8.285156 C 2.960938 -7.703125 2.667969 -6.960938 2.636719 -6.0625 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-3">
|
||||
<path style="stroke:none;" d="M 1.335938 -14.34375 L 3.09375 -14.34375 L 3.09375 0 L 1.335938 0 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-4">
|
||||
<path style="stroke:none;" d="M 7.835938 -2.457031 C 8.269531 -3.339844 8.484375 -4.320312 8.484375 -5.398438 C 8.484375 -6.375 8.328125 -7.171875 8.015625 -7.78125 C 7.523438 -8.746094 6.671875 -9.226562 5.460938 -9.226562 C 4.386719 -9.226562 3.601562 -8.820312 3.117188 -8 C 2.628906 -7.179688 2.382812 -6.1875 2.382812 -5.03125 C 2.382812 -3.917969 2.625 -2.988281 3.117188 -2.246094 C 3.605469 -1.503906 4.378906 -1.132812 5.4375 -1.132812 C 6.605469 -1.132812 7.402344 -1.574219 7.835938 -2.457031 Z M 8.925781 -9.414062 C 9.855469 -8.515625 10.320312 -7.195312 10.320312 -5.449219 C 10.320312 -3.761719 9.914062 -2.371094 9.09375 -1.269531 C 8.273438 -0.167969 7 0.382812 5.273438 0.382812 C 3.835938 0.382812 2.691406 -0.105469 1.84375 -1.078125 C 1 -2.050781 0.578125 -3.359375 0.578125 -5 C 0.578125 -6.757812 1.023438 -8.15625 1.914062 -9.199219 C 2.804688 -10.242188 4.003906 -10.761719 5.507812 -10.761719 C 6.855469 -10.761719 7.996094 -10.3125 8.925781 -9.414062 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-5">
|
||||
<path style="stroke:none;" d=""/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-6">
|
||||
<path style="stroke:none;" d="M 1.476562 -14.34375 L 4.257812 -14.34375 L 8.378906 -2.21875 L 12.46875 -14.34375 L 15.226562 -14.34375 L 15.226562 0 L 13.378906 0 L 13.378906 -8.46875 C 13.378906 -8.761719 13.386719 -9.246094 13.398438 -9.921875 C 13.410156 -10.597656 13.417969 -11.324219 13.417969 -12.101562 L 9.328125 0 L 7.402344 0 L 3.28125 -12.101562 L 3.28125 -11.660156 C 3.28125 -11.308594 3.289062 -10.773438 3.304688 -10.054688 C 3.320312 -9.335938 3.328125 -8.804688 3.328125 -8.46875 L 3.328125 0 L 1.476562 0 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-7">
|
||||
<path style="stroke:none;" d="M 3.195312 -1.582031 C 3.566406 -1.289062 4.003906 -1.140625 4.511719 -1.140625 C 5.128906 -1.140625 5.730469 -1.285156 6.308594 -1.570312 C 7.285156 -2.046875 7.773438 -2.824219 7.773438 -3.90625 L 7.773438 -5.320312 C 7.558594 -5.183594 7.28125 -5.070312 6.945312 -4.980469 C 6.605469 -4.890625 6.273438 -4.824219 5.945312 -4.785156 L 4.882812 -4.648438 C 4.246094 -4.5625 3.765625 -4.429688 3.445312 -4.25 C 2.90625 -3.941406 2.636719 -3.453125 2.636719 -2.78125 C 2.636719 -2.273438 2.820312 -1.875 3.195312 -1.582031 Z M 6.894531 -6.335938 C 7.296875 -6.390625 7.570312 -6.558594 7.703125 -6.84375 C 7.78125 -7 7.820312 -7.226562 7.820312 -7.519531 C 7.820312 -8.117188 7.609375 -8.554688 7.183594 -8.824219 C 6.757812 -9.09375 6.144531 -9.226562 5.351562 -9.226562 C 4.433594 -9.226562 3.78125 -8.980469 3.398438 -8.484375 C 3.183594 -8.210938 3.042969 -7.804688 2.976562 -7.265625 L 1.335938 -7.265625 C 1.371094 -8.554688 1.789062 -9.453125 2.59375 -9.957031 C 3.398438 -10.460938 4.328125 -10.710938 5.390625 -10.710938 C 6.621094 -10.710938 7.621094 -10.476562 8.390625 -10.007812 C 9.152344 -9.539062 9.53125 -8.8125 9.53125 -7.820312 L 9.53125 -1.796875 C 9.53125 -1.613281 9.570312 -1.46875 9.644531 -1.359375 C 9.71875 -1.246094 9.875 -1.191406 10.117188 -1.191406 C 10.195312 -1.191406 10.28125 -1.195312 10.382812 -1.207031 C 10.480469 -1.214844 10.582031 -1.230469 10.695312 -1.25 L 10.695312 0.046875 C 10.421875 0.125 10.210938 0.175781 10.070312 0.195312 C 9.925781 0.214844 9.730469 0.226562 9.484375 0.226562 C 8.878906 0.226562 8.4375 0.0078125 8.164062 -0.421875 C 8.019531 -0.648438 7.921875 -0.96875 7.859375 -1.386719 C 7.503906 -0.917969 6.988281 -0.511719 6.320312 -0.164062 C 5.648438 0.179688 4.910156 0.351562 4.101562 0.351562 C 3.132812 0.351562 2.339844 0.0585938 1.722656 -0.53125 C 1.109375 -1.121094 0.800781 -1.859375 0.800781 -2.742188 C 0.800781 -3.714844 1.101562 -4.464844 1.710938 -5 C 2.316406 -5.535156 3.109375 -5.863281 4.09375 -5.984375 Z "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-8">
|
||||
<path style="stroke:none;" d="M 7.75 -2.210938 C 8.292969 -2.898438 8.5625 -3.925781 8.5625 -5.292969 C 8.5625 -6.125 8.445312 -6.84375 8.203125 -7.441406 C 7.746094 -8.59375 6.914062 -9.171875 5.703125 -9.171875 C 4.484375 -9.171875 3.652344 -8.5625 3.203125 -7.34375 C 2.960938 -6.691406 2.84375 -5.867188 2.84375 -4.863281 C 2.84375 -4.054688 2.960938 -3.367188 3.203125 -2.804688 C 3.660156 -1.722656 4.492188 -1.179688 5.703125 -1.179688 C 6.523438 -1.179688 7.207031 -1.523438 7.75 -2.210938 Z M 1.152344 -10.410156 L 2.859375 -10.410156 L 2.859375 -9.023438 C 3.210938 -9.5 3.597656 -9.867188 4.015625 -10.125 C 4.605469 -10.515625 5.304688 -10.710938 6.101562 -10.710938 C 7.289062 -10.710938 8.292969 -10.257812 9.121094 -9.351562 C 9.949219 -8.441406 10.359375 -7.144531 10.359375 -5.460938 C 10.359375 -3.179688 9.765625 -1.554688 8.574219 -0.578125 C 7.820312 0.0429688 6.941406 0.351562 5.9375 0.351562 C 5.148438 0.351562 4.488281 0.179688 3.953125 -0.164062 C 3.640625 -0.359375 3.292969 -0.695312 2.910156 -1.171875 L 2.910156 4.171875 L 1.152344 4.171875 Z "/>
|
||||
</symbol>
|
||||
</g>
|
||||
</defs>
|
||||
<g id="surface15">
|
||||
<rect x="0" y="0" width="512" height="512" style="fill:rgb(27.45098%,50.980392%,70.588235%);fill-opacity:1;stroke:none;"/>
|
||||
<path style="fill-rule:nonzero;fill:rgb(0%,0%,100%);fill-opacity:1;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 5 0 L 4.503906 2.167969 L 3.117188 3.910156 L 1.113281 4.875 L -1.113281 4.875 L -3.117188 3.910156 L -4.503906 2.167969 L -5 0 L -4.503906 -2.167969 L -3.117188 -3.910156 L -1.113281 -4.875 L 1.113281 -4.875 L 3.117188 -3.910156 L 4.503906 -2.167969 Z " transform="matrix(1,0,0,1,256,256)"/>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph0-1" x="210.574219" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-2" x="225.017578" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-3" x="236.140625" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-3" x="240.583984" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-4" x="245.027344" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-5" x="256.150391" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-6" x="261.707031" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-7" x="278.367188" y="25.085938"/>
|
||||
<use xlink:href="#glyph0-8" x="289.490234" y="25.085938"/>
|
||||
</g>
|
||||
<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L 512 0 L 512 512 L 0 512 Z M 6 6 L 506 6 L 506 506 L 6 506 Z "/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
Loading…
Add table
Reference in a new issue