├── snippets ├── __init__.py ├── 1_shapes │ ├── __init__.py │ ├── bezier_curve.py │ ├── dashed_lines.py │ ├── basic_shapes.py │ └── line_join_line_cap.py ├── 2_transforms │ ├── __init__.py │ ├── invert_y_coordinates.py │ ├── rotate.py │ ├── matrix.py │ └── translate_and_scale.py ├── 4_patterns │ ├── __init__.py │ ├── brick.png │ ├── repeating_pattern.png │ ├── patterns.py │ └── repeating_pattern.py ├── 5_gradients │ ├── __init__.py │ ├── x.png │ ├── linear_gradient.py │ └── radial_gradients.py ├── 9_formats │ ├── __init__.py │ ├── pdf.py │ ├── png.py │ ├── ps.py │ ├── svg.py │ ├── eps.py │ └── multipage_pdf.py ├── 3_clip_and_mask │ ├── __init__.py │ ├── mask.png │ ├── church.png │ ├── example.png │ ├── masked_church.png │ ├── clip.py │ └── mask.py ├── 6_text_and_fonts │ ├── __init__.py │ └── text.py ├── 7_antialiasing │ ├── __init__.py │ └── antialiasing.py └── 8_animated_gifs │ ├── __init__.py │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── sq.gif │ ├── movie.gif │ ├── gif.py │ └── sq_logo_animated.py ├── img ├── 9_formats │ ├── pdf.pdf │ ├── png.png │ ├── multipage_pdf.pdf │ ├── svg.svg │ ├── eps.eps │ └── ps.ps ├── 2_transforms │ ├── matrix.png │ ├── rotate.png │ ├── invert_y_coordinates.png │ └── translate_and_scale.png ├── 3_clip_and_mask │ ├── clip.png │ └── mask.png ├── 4_patterns │ ├── patterns.png │ └── repeating_pattern.png ├── 8_animated_gifs │ ├── gif.gif │ └── sq_logo_animated.gif ├── 1_shapes │ ├── basic_shapes.png │ ├── bezier_curve.png │ ├── dashed_lines.png │ └── line_join_line_cap.png ├── 6_text_and_fonts │ └── text.png ├── 5_gradients │ ├── linear_gradient.png │ └── radial_gradients.png └── 7_antialiasing │ └── antialiasing.png ├── requirements.txt ├── css ├── pycairo.css └── pygments.css ├── README.md ├── template.html ├── LICENSE ├── .gitignore ├── make.py └── index.html /snippets/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/1_shapes/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/2_transforms/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/4_patterns/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/5_gradients/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/9_formats/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/3_clip_and_mask/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/6_text_and_fonts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/7_antialiasing/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /snippets/8_animated_gifs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/9_formats/pdf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/9_formats/pdf.pdf -------------------------------------------------------------------------------- /img/9_formats/png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/9_formats/png.png -------------------------------------------------------------------------------- /snippets/5_gradients/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/5_gradients/x.png -------------------------------------------------------------------------------- /img/2_transforms/matrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/2_transforms/matrix.png -------------------------------------------------------------------------------- /img/2_transforms/rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/2_transforms/rotate.png -------------------------------------------------------------------------------- /img/3_clip_and_mask/clip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/3_clip_and_mask/clip.png -------------------------------------------------------------------------------- /img/3_clip_and_mask/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/3_clip_and_mask/mask.png -------------------------------------------------------------------------------- /img/4_patterns/patterns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/4_patterns/patterns.png -------------------------------------------------------------------------------- /img/8_animated_gifs/gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/8_animated_gifs/gif.gif -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Pygments==2.3.1 2 | numpy==1.15.4 3 | pycairo==1.16.3 4 | imageio==2.4.1 5 | Pillow==5.4.1 6 | -------------------------------------------------------------------------------- /img/1_shapes/basic_shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/1_shapes/basic_shapes.png -------------------------------------------------------------------------------- /img/1_shapes/bezier_curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/1_shapes/bezier_curve.png -------------------------------------------------------------------------------- /img/1_shapes/dashed_lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/1_shapes/dashed_lines.png -------------------------------------------------------------------------------- /img/6_text_and_fonts/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/6_text_and_fonts/text.png -------------------------------------------------------------------------------- /img/9_formats/multipage_pdf.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/9_formats/multipage_pdf.pdf -------------------------------------------------------------------------------- /snippets/4_patterns/brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/4_patterns/brick.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/1.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/2.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/3.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/4.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/5.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/sq.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/sq.gif -------------------------------------------------------------------------------- /snippets/3_clip_and_mask/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/3_clip_and_mask/mask.png -------------------------------------------------------------------------------- /img/1_shapes/line_join_line_cap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/1_shapes/line_join_line_cap.png -------------------------------------------------------------------------------- /img/4_patterns/repeating_pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/4_patterns/repeating_pattern.png -------------------------------------------------------------------------------- /img/5_gradients/linear_gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/5_gradients/linear_gradient.png -------------------------------------------------------------------------------- /img/5_gradients/radial_gradients.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/5_gradients/radial_gradients.png -------------------------------------------------------------------------------- /img/7_antialiasing/antialiasing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/7_antialiasing/antialiasing.png -------------------------------------------------------------------------------- /snippets/3_clip_and_mask/church.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/3_clip_and_mask/church.png -------------------------------------------------------------------------------- /snippets/3_clip_and_mask/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/3_clip_and_mask/example.png -------------------------------------------------------------------------------- /snippets/8_animated_gifs/movie.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/8_animated_gifs/movie.gif -------------------------------------------------------------------------------- /img/2_transforms/invert_y_coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/2_transforms/invert_y_coordinates.png -------------------------------------------------------------------------------- /img/2_transforms/translate_and_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/2_transforms/translate_and_scale.png -------------------------------------------------------------------------------- /img/8_animated_gifs/sq_logo_animated.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/img/8_animated_gifs/sq_logo_animated.gif -------------------------------------------------------------------------------- /snippets/4_patterns/repeating_pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/4_patterns/repeating_pattern.png -------------------------------------------------------------------------------- /snippets/3_clip_and_mask/masked_church.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/PyCairoVisualDoc/HEAD/snippets/3_clip_and_mask/masked_church.png -------------------------------------------------------------------------------- /css/pycairo.css: -------------------------------------------------------------------------------- 1 | table { 2 | border-collapse: collapse; 3 | } 4 | 5 | table, td, th { 6 | border: 1px solid black; 7 | vertical-align: top; 8 | padding: 1em; 9 | } 10 | 11 | img { 12 | border:1px solid black; 13 | } 14 | 15 | body { 16 | background-color: AliceBlue; 17 | } 18 | -------------------------------------------------------------------------------- /snippets/9_formats/pdf.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | from cairo import PDFSurface 3 | import math 4 | 5 | def draw_pdf(filename): 6 | 7 | surface = PDFSurface(filename, 320, 240) 8 | c = cairo.Context(surface) 9 | 10 | c.set_source_rgb(1, 1, 1) 11 | c.paint() 12 | 13 | c.arc(100, 80, 50, 0, 2*math.pi) 14 | c.set_source_rgba(1,0,0,1) 15 | c.fill() 16 | 17 | surface.show_page() 18 | -------------------------------------------------------------------------------- /snippets/9_formats/png.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | import math 3 | 4 | def draw_png(filename): 5 | 6 | surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 320, 240) 7 | c = cairo.Context(surface) 8 | 9 | c.set_source_rgb(1, 1, 1) 10 | c.paint() 11 | 12 | c.arc(100, 80, 50, 0, 2*math.pi) 13 | c.set_source_rgba(1,0,0,1) 14 | c.fill() 15 | 16 | surface.write_to_png(filename) 17 | -------------------------------------------------------------------------------- /snippets/9_formats/ps.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | from cairo import PSSurface 3 | import math 4 | 5 | def draw_ps(filename): 6 | 7 | surface = PSSurface(filename, 320, 240) 8 | c = cairo.Context(surface) 9 | 10 | c.set_source_rgb(1, 1, 1) 11 | c.paint() 12 | 13 | c.arc(100, 80, 50, 0, 2*math.pi) 14 | c.set_source_rgba(1,0,0,1) 15 | c.fill() 16 | 17 | surface.show_page() 18 | -------------------------------------------------------------------------------- /snippets/9_formats/svg.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | from cairo import SVGSurface 3 | import math 4 | 5 | def draw_svg_asd(filename): 6 | 7 | surface = SVGSurface(filename, 320, 240) 8 | c = cairo.Context(surface) 9 | 10 | c.set_source_rgb(1, 1, 1) 11 | c.paint() 12 | 13 | c.arc(100, 80, 50, 0, 2*math.pi) 14 | c.set_source_rgba(1,0,0,1) 15 | c.fill() 16 | 17 | surface.finish() 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyCairoVisualDoc 2 | Turns PyCairo snippets into HTML 3 | 4 | Snippets are organized in the `snippets/` module. 5 | 6 | Install the requirements with `pip install -r requirements.txt` 7 | 8 | Run the program with: `python make.py` 9 | 10 | The program generates `index.html` and `img/`. 11 | 12 | These files can be published along with `css/`. 13 | 14 | Typical output: [http://seriot.ch/pycairo/](http://seriot.ch/pycairo/) 15 | -------------------------------------------------------------------------------- /snippets/9_formats/eps.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | from cairo import PSSurface 3 | import math 4 | 5 | def draw_eps(filename): 6 | 7 | surface = PSSurface(filename, 320, 240) 8 | surface.set_eps(True) 9 | c = cairo.Context(surface) 10 | 11 | c.set_source_rgb(1, 1, 1) 12 | c.paint() 13 | 14 | c.arc(100, 80, 50, 0, 2*math.pi) 15 | c.set_source_rgba(1,0,0,1) 16 | c.fill() 17 | 18 | surface.show_page() 19 | -------------------------------------------------------------------------------- /img/9_formats/svg.svg: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /snippets/9_formats/multipage_pdf.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | from cairo import PDFSurface 3 | import math 4 | 5 | def draw_pdf(filename): 6 | 7 | surface = PDFSurface(filename, 320, 240) 8 | c = cairo.Context(surface) 9 | 10 | c.set_source_rgb(1, 1, 1) 11 | c.paint() 12 | 13 | c.arc(150, 150, 50, 0, 2*math.pi) 14 | c.set_source_rgba(1,0,0,1) 15 | c.fill() 16 | 17 | surface.show_page() 18 | 19 | c.set_source_rgb(1, 1, 1) 20 | c.paint() 21 | 22 | c.arc(100, 100, 50, 0, 2*math.pi) 23 | c.set_source_rgba(1,0,1,1) 24 | c.fill() 25 | 26 | surface.show_page() 27 | -------------------------------------------------------------------------------- /snippets/1_shapes/bezier_curve.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | import math 3 | 4 | def draw_png(filename): 5 | 6 | surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 512, 256) 7 | c = cairo.Context(surface) 8 | 9 | x0, y0 = 50, 50 10 | x1, y1 = 180, 220 11 | x2, y2 = 350, 180 12 | x3, y3 = 400, 50 13 | 14 | c.move_to(x0, y0) 15 | c.curve_to(x1, y1, x2, y2, x3, y3) 16 | c.stroke() 17 | 18 | for x,y in [(x0, y0), (x1, y1), (x2, y2), (x3, y3)]: 19 | c.arc(x-2, y-2, 4, 0, 2*math.pi) 20 | c.stroke() 21 | 22 | surface.write_to_png(filename) 23 | -------------------------------------------------------------------------------- /snippets/2_transforms/invert_y_coordinates.py: -------------------------------------------------------------------------------- 1 | import cairo 2 | 3 | def draw_line(c): 4 | c.move_to(10, 10) 5 | c.line_to(100, 100) 6 | c.stroke() 7 | 8 | def draw_png(filename): 9 | 10 | s = cairo.ImageSurface(cairo.FORMAT_ARGB32, 512, 256) 11 | c = cairo.Context(s) 12 | 13 | c.set_source_rgb(1,0,0) 14 | draw_line(c) 15 | 16 | # invert y coordinates 17 | m = cairo.Matrix(yy=-1, y0=s.get_height()) 18 | c.transform(m) 19 | 20 | c.set_source_rgb(0,0,1) 21 | draw_line(c) 22 | 23 | s.write_to_png(filename) 24 | 25 | if __name__ == "__main__": 26 | 27 | draw() 28 | -------------------------------------------------------------------------------- /template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |Author: Nicolas Seriot
13 | Date: {date}
14 | PyCairo Version: {pycairo_version}
15 | GitHub: https://github.com/nst/PyCairoVisualDoc
16 |
17 | {content}
18 |
19 |
20 |