{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cario example snippets with outputs\n",
    "Based on examples from lazka, stuaxo, fomightez and kolibril13"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import cairo\n",
    "from IPython.display import Image, display\n",
    "from math import pi\n",
    "from io import BytesIO\n",
    "\n",
    "def disp(draw_func):\n",
    "    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 200, 200)\n",
    "    ctx = cairo.Context(surface)\n",
    "    draw_func(ctx, 200, 200)\n",
    "    with BytesIO() as fileobj:\n",
    "        surface.write_to_png(fileobj)\n",
    "        display(Image(fileobj.getvalue(), width=200))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.arc(0.5, 0.5, 0.3, 0, 2 * pi)\n",
    "    cr.clip()\n",
    "\n",
    "    cr.rectangle(0, 0, 1, 1)\n",
    "    cr.fill()\n",
    "    cr.set_source_rgb(0, 1, 0)\n",
    "    cr.move_to(0, 0)\n",
    "    cr.line_to(1, 1)\n",
    "    cr.move_to(1, 0)\n",
    "    cr.line_to(0, 1)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAACuklEQVR4nO3cTWoUQRgG4FdN1DNozAG8hV5A8W/EU7jKGfw7RnCtK3d6Ad0oaDBGEH9WCmpcKIbExfSACGPrTFf1/DwPFISm5uPrxctUpasnAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgL4dTTJIcjfJVpJvzdhqrl1p5sDSuZhkJ8lBy3iV5EJPPUJ1R5LcSXsw/hy3kxzuoV+oapJwjMbNHvqFai5m8nCMxvnqXUMFRzPcT0wbkNexcWcBDTJ9OEbjcuXe6YhN5HhdLo3OdVgLZsLLdPcNslW5dyhuN90FZLdy73TEEquO/b4bYDICMt6HGa1FRQIy3pMOaz3usBYVCch49zqsdb/DWjATVpNsZ/oN+k48KGRBXcj0AfEMhIV2O5OH40YP/UJVh5Pcyv+H42bs8Vgi5/Nve5Lt/Puyai3JRpIHSd4k2WvGm+baRjMH5sJqhgcPN5O8yPAJ+W7z92aSS82cNuvN/L20B26vmbve4X3AzLqa5Ev+f8n2pfksLKzrGR47mXTTv9/UgIUzyHTh+D0kg8q9Q1EnknzO9OEYja9JTlW9AyhoM92FYzQ2q94BFLKe5Ge6D8jP+M9WcR5klTdIslKg7kqGv+RIQQJS3tk5rQ1VvE33y6vReFvxPpbSob4bWALfkxwrVPtHkuOFahNLrBoOCtb2rnthAlLex4K1PxWsTQSkhmcFaz8tWJsISA0P57Q2VOFBIbRw1AT+wmFFaOG4O7TwwhS08MottPCjDXPCWax+rSW5luRMktNJTjbX3yd5nuRRkrtJ3vXSHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATOgXPqoDzcCGeh0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height) # eg1\n",
    "    cr.stroke()\n",
    "    cr.set_line_cap(cairo.LINE_CAP_ROUND)\n",
    "    cr.set_line_width(0.12)\n",
    "    cr.move_to(0.5, 0.5)\n",
    "    cr.line_to(0.5, 0.5)\n",
    "    \n",
    "    cr.stroke() #eg1\n",
    "    xc=.4\n",
    "    yc=.4\n",
    "    cr.arc(xc, yc, 0.05, 0, 2 * pi)\n",
    "    cr.fill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    # a custom shape, that could be wrapped in a function\n",
    "    x0 = 0.1  # parameters like cairo_rectangle\n",
    "    y0 = 0.1\n",
    "    rect_width = 0.8\n",
    "    rect_height = 0.8\n",
    "    radius = 0.4  # and an approximate curvature radius\n",
    "\n",
    "    x1 = x0 + rect_width\n",
    "    y1 = y0 + rect_height\n",
    "\n",
    "    if rect_width / 2 < radius:\n",
    "        if rect_height / 2 < radius:\n",
    "            cr.move_to(x0, (y0 + y1) / 2)\n",
    "            cr.curve_to(x0, y0, x0, y0, (x0 + x1) / 2, y0)\n",
    "            cr.curve_to(x1, y0, x1, y0, x1, (y0 + y1) / 2)\n",
    "            cr.curve_to(x1, y1, x1, y1, (x1 + x0) / 2, y1)\n",
    "            cr.curve_to(x0, y1, x0, y1, x0, (y0 + y1) / 2)\n",
    "        else:\n",
    "            cr.move_to(x0, y0 + radius)\n",
    "            cr.curve_to(x0, y0, x0, y0, (x0 + x1) / 2, y0)\n",
    "            cr.curve_to(x1, y0, x1, y0, x1, y0 + radius)\n",
    "            cr.line_to(x1, y1 - radius)\n",
    "            cr.curve_to(x1, y1, x1, y1, (x1 + x0) / 2, y1)\n",
    "            cr.curve_to(x0, y1, x0, y1, x0, y1 - radius)\n",
    "    else:\n",
    "        if rect_height / 2 < radius:\n",
    "            cr.move_to(x0, (y0 + y1) / 2)\n",
    "            cr.curve_to(x0, y0, x0, y0, x0 + radius, y0)\n",
    "            cr.line_to(x1 - radius, y0)\n",
    "            cr.curve_to(x1, y0, x1, y0, x1, (y0 + y1) / 2)\n",
    "            cr.curve_to(x1, y1, x1, y1, x1 - radius, y1)\n",
    "            cr.line_to(x0 + radius, y1)\n",
    "            cr.curve_to(x0, y1, x0, y1, x0, (y0 + y1) / 2)\n",
    "        else:\n",
    "            cr.move_to(x0, y0 + radius)\n",
    "            cr.curve_to(x0, y0, x0, y0, x0 + radius, y0)\n",
    "            cr.line_to(x1 - radius, y0)\n",
    "            cr.curve_to(x1, y0, x1, y0, x1, y0 + radius)\n",
    "            cr.line_to(x1, y1 - radius)\n",
    "            cr.curve_to(x1, y1, x1, y1, x1 - radius, y1)\n",
    "            cr.line_to(x0 + radius, y1)\n",
    "            cr.curve_to(x0, y1, x0, y1, x0, y1 - radius)\n",
    "\n",
    "    cr.close_path()\n",
    "\n",
    "    cr.set_source_rgb(0.5, 0.5, 1)\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source_rgba(0.5, 0, 0, 0.5)\n",
    "    cr.stroke()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    x, y = 0.1, 0.5\n",
    "    x1, y1 = 0.4, 0.9\n",
    "    x2, y2 = 0.6, 0.1\n",
    "    x3, y3 = 0.9, 0.5\n",
    "\n",
    "    cr.move_to(x, y)\n",
    "    cr.curve_to(x1, y1, x2, y2, x3, y3)\n",
    "\n",
    "    cr.stroke()\n",
    "\n",
    "    cr.set_source_rgba(1, 0.2, 0.2, 0.6)\n",
    "    cr.set_line_width(0.03)\n",
    "    cr.move_to(x, y)\n",
    "    cr.line_to(x1, y1)\n",
    "    cr.move_to(x2, y2)\n",
    "    cr.line_to(x3, y3)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def path_ellipse(cr, x, y, width, height, angle=0):\n",
    "    \"\"\"\n",
    "    x      - center x\n",
    "    y      - center y\n",
    "    width  - width of ellipse  (in x direction when angle=0)\n",
    "    height - height of ellipse (in y direction when angle=0)\n",
    "    angle  - angle in radians to rotate, clockwise\n",
    "    \"\"\"\n",
    "    cr.save()\n",
    "    cr.translate(x, y)\n",
    "    cr.rotate(angle)\n",
    "    cr.scale(width / 2.0, height / 2.0)\n",
    "    cr.arc(0.0, 0.0, 1.0, 0.0, 2.0 * pi)\n",
    "    cr.restore()\n",
    "\n",
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    path_ellipse(cr, 0.5, 0.5, 1.0, 0.3, pi / 4.0)\n",
    "\n",
    "    # fill\n",
    "    cr.set_source_rgba(1, 0, 0, 1)\n",
    "    cr.fill_preserve()\n",
    "\n",
    "    # stroke\n",
    "    # reset identity matrix so line_width is a constant\n",
    "    # width in device-space, not user-space\n",
    "    cr.save()\n",
    "    cr.identity_matrix()\n",
    "    cr.set_source_rgba(0, 0, 0, 1)\n",
    "    cr.set_line_width(3)\n",
    "    cr.stroke()\n",
    "    cr.restore()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.move_to(0.5, 0.1)\n",
    "    cr.line_to(0.9, 0.9)\n",
    "    cr.rel_line_to(-0.4, 0.0)\n",
    "    cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5)\n",
    "    cr.close_path()\n",
    "\n",
    "    cr.set_source_rgb(0, 0, 1)\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source_rgb(0, 0, 0)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.move_to(0.5, 0.1)\n",
    "    cr.line_to(0.9, 0.9)\n",
    "    cr.rel_line_to(-0.4, 0.0)\n",
    "    cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5)\n",
    "    cr.close_path()\n",
    "\n",
    "    cr.move_to(0.25, 0.1)\n",
    "    cr.rel_line_to(0.2, 0.2)\n",
    "    cr.rel_line_to(-0.2, 0.2)\n",
    "    cr.rel_line_to(-0.2, -0.2)\n",
    "    cr.close_path()\n",
    "\n",
    "    cr.set_source_rgb(0, 0, 1)\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source_rgb(0, 0, 0)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    pat = cairo.LinearGradient(0.0, 0.0, 0.0, 1.0)\n",
    "    pat.add_color_stop_rgba(1, 0, 0, 0, 1)\n",
    "    pat.add_color_stop_rgba(0, 1, 1, 1, 1)\n",
    "    cr.rectangle(0, 0, 1, 1)\n",
    "    cr.set_source(pat)\n",
    "    cr.fill()\n",
    "\n",
    "    pat = cairo.RadialGradient(0.45, 0.4, 0.1,\n",
    "                               0.4, 0.4, 0.5)\n",
    "    pat.add_color_stop_rgba(0, 1, 1, 1, 1)\n",
    "    pat.add_color_stop_rgba(1, 0, 0, 0, 1)\n",
    "    cr.set_source(pat)\n",
    "    cr.arc(0.5, 0.5, 0.3, 0, 2 * pi)\n",
    "    cr.fill()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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nNICjtrSzdIYUVc35tyqG0yN6WhcjA1KQ2qDZw0ZGnponKYZ3mh8wPwqjGX8OrYD8qvYu98u8HaBx4UP3yjUZ4XyIIBpouihYCjHZ0pLBTGUUrOmSRNKZoWcLbYA2l5+HayFktTi2BxgWHFaSQWZV0CKG6PF1kujmkFtcGjw8wbHBm80eL/xnVezR+qz2A7IZ7UOyxOU8nFhUkUflkzZoDxAaU9CReogNJQ6C6UKYxNK7gNMVwC5yG2bA5BWnGEOOIbqtMkpbrQhts/dqG5UMwY39NB4bEb7WePRN2yH4rPbDsjnYY7w/cvCWyhPUEaUGeWNmM3E4bnw7CQ8VOX5QaiTUA9x7k9TbOsg8HQ95jwEHMfRl+cXJ2c+ONWM6eiMz52hGYdmPJiNn33NeITxJsa3LturNqj3RdgOyBdll5fKH6L89U+F01H50peFEeXBx8LFa3Hef/5UOD5br8HhYeyPT9eGfXrgfOnjeP78ofMbHzk/+5rx23/n/PuT8btfc/4K22OJL8Z2QK7besGF718Kb70vvPn2J1+DD993Pnjb+d7lJonDbrvttttuu+2222677bbbbrvttttuu+2222677bbbbrvttttuu+2222677bbbbrvttttuu+2222677bbbbrvttttuu+2222677bbbbrvttttuu+2222677bbbbrvttttuu+0GwP8PWoy7b/qUssIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    pattern = cairo.LinearGradient(0, 0, 1, 1)\n",
    "    pattern.add_color_stop_rgb(0, 0, 0.3, 0.8)\n",
    "    pattern.add_color_stop_rgb(1, 0, 0.8, 0.3)\n",
    "\n",
    "    mask = cairo.RadialGradient(0.5, 0.5, 0.25, 0.5, 0.5, 0.5)\n",
    "    mask.add_color_stop_rgba(0, 0, 0, 0, 1)\n",
    "    mask.add_color_stop_rgba(0.5, 0, 0, 0, 0)\n",
    "\n",
    "    cr.set_source(pattern)\n",
    "    cr.mask(mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAACLElEQVR4nO3dwW2DUBBAQRO5JAqkjVATPTkNkCclxv4kzBw5rPbA00pcuN0AAAAAAAAAAAAAAAAAAABg33T0wG3bHkfP5DzmeT78nTmzj9ELwJkJBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCASCQCAIBIJAIAgEgkAgCATCffQC77Cu6+gV/pNl9AI/sDw7wAWBIBAIAoEgEAgCgXCJr1jfWUYv8Ad9jl5gx/TC2S4IBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUCYRi/wJsvew8ebl+A14iVenp3tgkAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAgEgUAQCASBQBAIBIFAEAiE++gFRrrKH0z5PRcEgkAgCASCQCAIBAAAAAAAAAAAAAAAAACu4AvVCgs0Of7NigAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.rectangle(0.1, 0.1, 0.6, 0.6)\n",
    "    cr.set_line_width(0.03)\n",
    "    cr.set_source_rgb(0.8, 0.8, 0.8)\n",
    "    cr.fill()\n",
    "\n",
    "    cr.push_group()\n",
    "    cr.rectangle(0.3, 0.3, 0.6, 0.6)\n",
    "    cr.set_source(cairo.SolidPattern(1, 0, 0))\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source(cairo.SolidPattern(0, 0, 0))\n",
    "    cr.stroke()\n",
    "    cr.pop_group_to_source()\n",
    "    cr.paint_with_alpha(0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(ctx, width, height):\n",
    "    LINES = 32\n",
    "    MAX_THETA = .80 * pi * 2\n",
    "    THETA_INC = 2.0 * MAX_THETA / (LINES - 1)\n",
    "\n",
    "    ctx.set_source_rgb(0, 0, 0)\n",
    "    ctx.set_line_width(2.0)\n",
    "\n",
    "    ctx.save()\n",
    "\n",
    "    ctx.translate(width / 2, height / 2)\n",
    "    ctx.rotate(MAX_THETA)\n",
    "\n",
    "    for i in range(LINES):\n",
    "        ctx.move_to(-2 * width, 0)\n",
    "        ctx.line_to(2 * width, 0)\n",
    "        ctx.stroke()\n",
    "\n",
    "        ctx.rotate(- THETA_INC)\n",
    "\n",
    "    ctx.restore()\n",
    "\n",
    "    ctx.set_line_width(6)\n",
    "    ctx.set_source_rgb(1, 0, 0)\n",
    "\n",
    "    ctx.move_to(width / 4.0, 0)\n",
    "    ctx.rel_line_to(0, height)\n",
    "    ctx.stroke()\n",
    "\n",
    "    ctx.move_to(3 * width / 4.0, 0)\n",
    "    ctx.rel_line_to(0, height)\n",
    "    ctx.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.move_to(0.5, 0.1)\n",
    "    cr.line_to(0.9, 0.9)\n",
    "    cr.rel_line_to(-0.4, 0.0)\n",
    "    cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5)\n",
    "\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAADcklEQVR4nO3aTW4UVxiF4ePIUlgDP70AlIy8ArIIjFgFi2qxjLACTxKJDQBzzCQgW+4MXElAio7dP7e6oZ9HqolV9ele+b5SddsJAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJeTfS/gyD1O8jLJsyRPkzyafv4hydskb5K8TvJ+L6v71mrwfGeRfy2SLJNc5/bgtet6unexl5X+5651bntBkuRFksusf4Aup2f3RSAM9yrJTTY/RDfTjH0QCEOdZ7s4vo7kfOa1Z4v1CoQ7PUzyMbs7TJ+SPJl1BwJhoGV2f6CWs+5AIAyySHKV3R+oq8z7zdZRBvLTvhdwBM6TnA6Ye5rk+YC5fEUg4/32nc4mApnDLwNn/zpwNvlB/ry/OjtbJcnJxcUh7udzkp/vc+Pq7CxJcnJxcd/ZX5I82GhV67v354QN9pEc6Fkc8W68K5t8cFvnmbl+IfeK4wBnE69YUAkECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBQCgUIgUAgECoFAIRAoBAKFQKAQCBSn+15AcbLGvasNnpnL5yQPBs3+a9BcmM273AY84no34z5G7eGf6yB5xRrvz4Gz/xg4mwhkDr9/p7NhFoskV9n9K8nVNHsuR/mKxTyW2f2BWs66A4Ew0MMkH7O7w/QpyZNZdyAQBjtPcpPtD9LNNGtuAmG4V9kukptpxj4IhFm8SHKZ9Q/Q5fTsvgiE2Sxy+yH7OncfnOvp3jm/sfo/RxnIIf5rxjF5nORlkmdJniZ5NP38Q5K3Sd4keZ3k/V5W963Rh9hZBAAAAAAAAAAAAAAAAAAAAAAAAAAAgAPwN+bOm5itb3PKAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.set_line_width(0.12)\n",
    "    cr.set_line_cap(cairo.LINE_CAP_BUTT)  # default\n",
    "    cr.move_to(0.25, 0.2)\n",
    "    cr.line_to(0.25, 0.8)\n",
    "    cr.stroke()\n",
    "    cr.set_line_cap(cairo.LINE_CAP_ROUND)\n",
    "    cr.move_to(0.5, 0.2)\n",
    "    cr.line_to(0.5, 0.8)\n",
    "    cr.stroke()\n",
    "    cr.set_line_cap(cairo.LINE_CAP_SQUARE)\n",
    "    cr.move_to(0.75, 0.2)\n",
    "    cr.line_to(0.75, 0.8)\n",
    "    cr.stroke()\n",
    "\n",
    "    # draw helping lines\n",
    "    cr.set_source_rgb(1, 0.2, 0.2)\n",
    "    cr.set_line_width(0.01)\n",
    "    cr.move_to(0.25, 0.2)\n",
    "    cr.line_to(0.25, 0.8)\n",
    "    cr.move_to(0.5, 0.2)\n",
    "    cr.line_to(0.5, 0.8)\n",
    "    cr.move_to(0.75, 0.2)\n",
    "    cr.line_to(0.75, 0.8)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAAGyElEQVR4nO3dP44cRRiG8ZfQcki0sZHIkFmJK3AFjrLhmghOYHEYTgCBJTJOYFnyCBIHTgxJlzS7mprprr/f99XzSJWs7NmuVf2mZrt7ZyQiIiIiotDdb4OInvVa0kdJ/0j6YfKxEJkq4fhvGyAh2nqOAyREWzkcIKHlu4UDJLRse3GAhJbrKA6Q0DKV4gAJha8WB0gobK1wgITC1RoHSChMvXCAhNzXGwdIyG2jcICE3DUaB0jITbNwgITMNxsHSMhsVnCAhMxlDQdIyExWcYCEpmcdB0hoWl5wgISG5w0HSGhYXnGAhLrnHQdIqFtRcICEmhcNB0ioWVFxgISqi44DJFTcKjhAQodbDQdIaHer4gAJ3Wx1HCChbPeSTpq/OK2Mk/ikK9pi57g82EkIHDcGSBYOHCChTOAACWUCB0goEzhAQpnAARLKBA6QUCZwgIQygQMklMnj7SMnp8fMbSnO8rhzpGdjz8dODoqwwCLMgQwWaWFFmgsZKOKCijgnmlDkhRR5bjSgO8U/8+P1jNzdgTlSxx40f0H0fnb1tpM8FsyROuYBSe1LDy9IwGE0y0havS63jgQcxrOIpPUvrVaRgMNJlpD0OqNjDQk4nGUBSe/TnVaQgMNpM5GMuhYwGwk4nDcDyegLZbOQgCNII5HMuoo8Ggk4gjUCyexbLEYhAUfQeiKZjSPVGwk4gtcDiRUcqV5IwLFILZFYw5FqjQQci9UCiVUcqVZIwLFoNUis40jVIgHH4pUg8YIjVYoEHCTpGBJvOFJHkYCDnrQHiVccqb1IwEEXu4bEO47ULSTgOOur2QdgsAdJvz772r+SfpT0Z8HjfSvpu9qDyvSXpL8L/t9rSb9L+vrZ199I+rnymGiBzneSmp2j91XtlsfGzkGHepBtHC2RgIOKKn3bmtF31tYg4a15aGiz/jYjykkECtzsv+4DCZltNg6QkNms4AAJmcsaDpCQmaziAAlNzzoOkNC0vOAACQ3PGw6Q0LC84gAJdc87DpBQt6LgAAk1LxoOkFCzouIACVUXHQdIqLhVcICEDrcaDpDQ7lbFARK62eo4QELZ7iWdNH9xWhmn7WdCxM6RGewkBI4bAyQLBw6QUCZwgIQygQMklAkcIKFM4AAJZQIHSCgTOEBCmcABEsrk8faRk9Nj5rYUZ3ncOdKzsedjJwdFWGAR5kAGi7SwIs2FDBRxQUWcE00o8kKKPDca0J3in/nxekaODwg10vnnmlsfpc+u3naSx4I5Usc8IKl96eEFCTiMZhlJq9fl1pGAw3gWkbT+pdUqEnA4yRKSXmd0rCEBh7MsIOl9utMKEnA4bSaSUdcCZiMBh/NmIBl9oWwWEnAEaSSSWVeRRyMBR7BGIJl9i8UoJOAIWk8ks3GkeiMBR/B6ILGCI9ULCTgWqSUSazhSrZGAY7FaILGKI9UKCTgWrQaJdRypWiTgWLwSJC1wvJT0k6S3kv6Q9F7Sl2283772dvs3Lyu/VykScJCkY0hqcbyS9JukTwe+56ft/7yq+L5HkYCDnrQHSQ2OF5J+kfR5x/fJjc/bY7woPIa9SMBBF7uGpAbHN5LeXXnso+Pd9pgl3UICDrraJSQ1OL6X9OHCY9aOD9tjl5RDAg7a1TmSGhy9r2q3PDZw0KEeZBtHSyTgoKJK37Zm9J21NUh4ax4a2qy/zfBy4ZIWbvZf94GEzDYbB0jIbFZwgITMZQ0HSMhMVnGAhKZnHQdIaFpecICEhucNB0hoWF5xgIS65x0HSKhbUXCAhJoXDQdIqFlRcYCEqouOAyRU3Co4QEKHWw0HSGh3q+IACd1sdRwgoWz3kk6avzitjNP2MyFi58gMdhICx40BkoUDB0goEzhAQpnAARLKBA6QUCZwgIQygQMklAkcIKFM4AAJZfJ4+8jJ6TFzW4qzPO4c6dnY87GTgyIssAhzIINFWliR5kIGirigIs6JJhR5IUWeGw3oTvHP/Hg9I8cHhBrp/HPNrY/SZ1dvO8ljwRypYx6Q1L708IIEHEazjKTV63LrSMBhPItIWv/SahUJOJxkCUmvMzrWkIDDWRaQ9D7daQUJOJw2E8moawGzkYDDeTOQjL5QNgsJOII0Esmsq8ijkYAjWCOQzL7FYhQScAStJ5LZOFK9kYAjeD2QWMGR6oUEHIvUEok1HKnWSMCxWC2QWMWRaoUEHItWg8Q6jlQtEnAsXgkSLzhSpUjAQZKOIfGGI3UUCTjoSXuQeMWR2osEHHSxa0i840jdQgIOutolJFFwpHJIwEG7OkcSDUfqORJw0KEeFBdHKiEBBxW1wtvWrDBHIiKiwf0P2IWBq12Wl/IAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.set_line_width(0.16)\n",
    "    cr.move_to(0.3, 0.33)\n",
    "    cr.rel_line_to(0.2, -0.2)\n",
    "    cr.rel_line_to(0.2, 0.2)\n",
    "    cr.set_line_join(cairo.LINE_JOIN_MITER)  # default\n",
    "    cr.stroke()\n",
    "\n",
    "    cr.move_to(0.3, 0.63)\n",
    "    cr.rel_line_to(0.2, -0.2)\n",
    "    cr.rel_line_to(0.2, 0.2)\n",
    "    cr.set_line_join(cairo.LINE_JOIN_BEVEL)\n",
    "    cr.stroke()\n",
    "\n",
    "    cr.move_to(0.3, 0.93)\n",
    "    cr.rel_line_to(0.2, -0.2)\n",
    "    cr.rel_line_to(0.2, 0.2)\n",
    "    cr.set_line_join(cairo.LINE_JOIN_ROUND)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO2debgUxdWH3wuyCQISBXFFUdwJ7qgREREFNS5EFAREjYl8asQ9i0ajxETjHj/9NDGiGPcNFXFf0LiDImKQiKIoi7IICLLf749fd6Zv356ZruoaZu699T7PPDA9M+fWTNepOlV1FvB4PB6Px+PxeDye8tG2yMNTnJuBakeyzgdmBP+/DPjIkdyQQcDcyPP3gXMsZQ0DTs/Yns7AS8ASYCKwT8J7HgVuNJR7EvAx8AMwE7gLaJXmg+vFnn8LfJLnvdsDTQwb5qls9gDeC/7fDNgZmFC+5nAX8ClwDPArpAzboo4N0BfYFzjZQOZhwCjgbuACYDM0MLQBvjdt4JwCr31lKqyBUpdmkFeAPwT/3wdYC2xgKGMw8CawEFiMBtiHgR8Zylk/+Pvdguctgud7Bc+bI+UZZCj3FmA2UGX4OaD2DOJpOFQBuwHXBs/3AP6DzJu0HAOMBi4BxiIL419AP9ShbVgba2M42PwG+BK411DeImBDtERYaNmm/+JnkOy4nEG2B44M/r8LMheyMgO1r9ijW57PR7kD+DD4/zCyr0FeB25Ds8mvga/RTLItmp12tJDZCVgNPIODJYJXkOxcB6wsdyMKsBPq/NcBU4P/dwPmARdFnrdIIWsksuN3x90i/QXgO+Bdcov0Z4A/WchrhGa4ecAqZPo1jrzeGA06W6QV6BUkO39AN6TSeQiN1gCbo1mjs6GMtmjUrwYWIPPqDKCdozYC/Az4As0qmwNPIVPpfeAnRT57IRqsdgcGoJnkHqQ4oBmpGjgibWO8gmTnDOCDcjciBbOAIcH/j6fwvS/GHmgHajIwHynLXgU/kY5WaFv26OD5OOABoCXa5fqWwpsK04H7I88HA2uAv6H1zWlohyz1xoRXkPpNONoXe9isdYYhE6s18G9kFmXlGjRjgMyhFcCBwfNGwfOeBT7/PXBT7NqpaCPgr+hs5OZCDfC7WA2LYWhUHoBmjf7B9XHA/wFjgufTU8qL7jKFLEYL962zNBSdyfwC+HHs78X/X2j7diLQB53xrAiu3QE0Rdu/S4HfmzTKzyDZuRHZupXMo+RG1s6ok29pIecO4C9AL2TvXw6MQHa/UcdL4FW0fRzlOWRitQn+zvzg//nYF5lQz6MFf3tgf+BBYDn63leaNMorSHZcbvOWgibobCA0o87E/gDyEOARdD6xCinGf5ByZLFOhgLT0MgfZSukJEvQeuegFLK6AY+jddFK4HPgVrT9exG6V5embZhXEI8tw8i+zVtxNCr+Fo+n4RKfBlfjZwqPHR/gN308Ho/H4/F4PB6Px+PxrCuiEWwuuR65M2TlNyhE1Co6rAAj0Hf3VAYdkb/U/g5ktUcu7wuQb9Yz2MWVAKVRkG2QH0x3B7JaIVfygQ5k7UDOzTmqIP2QH5Ar2uBj+U0ZjpJJZD2na4K2n2cBpyAftEmB7A42AkuhIDch332X8iY6kNMZeAK5IVyPfKgeQQ57pnERhfgeuVl70vMscknPyknIlSTqkrI5GrCvsRHoWkGaoeCWCxzK3A996d0dyeuDOvFS5FvkGq8gZrRGHfhwB7IeIfngexxKAGFMNAbaBQeizuzCvAppgjw0L84opwp13PdRLqZX0Mw0FLcuOF5BzBiInBHjjoo2TEWzUZyr0RqnaFhx3DXgE/LnxbIhVIxJDmWuQt6n+2aU0xfNGIeiVDLroai4q9Cs96SFzCYku1+3AjaKPF+J4iY8tTkaLaRXFHtjCtqRHN25EA2Qbcnl3CoLN2KRnCsFT+N2XeNqF+sI0kXsuYi2M6UxlZ8psylyxT/RkbxvgfsSrv8G3YeOxQSU2rmsOW5Ggjg/kC7rRlqewo1Z9Ra11zFPAjcAL0aulSOpw14owVsU19vlWTkY3dexjuQtQDmx4myIFOS7YgJKrSBhxFdSaGYW2uG2k1kt2BKYh9LWRFkDTEm4vq6ZAhxQ5jYU42gUSVi046ZkCsnJI3YBPqPM5hVowWsbzlmIGcDfHcssFX6Rno4qdF5xhkOZw1D/OzBybTMUbntt0gfWNZ1QA/sXeZ8JHQKZQ4q9sULIoiCboZ2Yc901xyl9UAyRab7cJPZF93VzB7JCmqAEEl+jhNfHoUX7N6RYf0DpIwpnAG/jduv4CGAZOuSr72xAZWfVb4QW/y760dHIjchlwN4qtCZ8BWWSHIVO0XuihNYVwRC0pdnSkbyXcXPKWhc4Be3quMxUWKlMBX5X7kaUg8YoA8WFDmTtgxZWrtc0lcpocuUJPPWYvXGz+DoC2ZEej8fj8Xg8Ho/H4/F4PJ6GzKYoYu9NtJ1ajU7DbTkIuBMlNF6G0ur/L4oTtmF/5Fj4FXIXmI0ODF0UawEF2FSjAyUbepPsvZvVb6wfMB6dyi9C9+fAgp9I5vE87asG3rFs2wEoe/q36LzrXbKFRB+A/LGWIbf0+5FHQVmIOytug+pGvItuQprs2YW4FEWI3Y0ygO+Eson3RXUfTCqqgpT1B+RG/w2wCaoh8TpyVcgSinskOmF1UV/wXFQZKSSLR/MvUe2O51GQ2DKgK/ruplyFSpBF6Qz8GYUQmLJb0K7JwNlo0BqGKtFWYV6Rdh/k9fw+KnTTEmWKfyX4W6UInTAi6jIwguwzSJeEa4MCuadkkBtlq0De9RlktEIK/HN0E0ZZyglnkF0ytCVKJzQg3OBIXhIjUXSdTcGbMDIvahGsh35Lmyw249BsGy2J9uPgb1xkIS8zcR+atYnvsmdawrVXgn9dTZtzkMPcqgwyRiKz7Q4nLRLrkz3e4hR0jy4Lnrv2natCrkCvoboZpjRF7vyLItdWB89t2tod9Y+oZTEJzcYuHV5TU47yB2Guo8kZZLQg58j3N2R2/MNS1p6orsVw3MWsvI6SQHyPqjnZZkn5CfJGPRF1kjXIAfRc3AQ79UJuO6MsP38nGphuRqWU26ORfgdkBpvSlGRzdDl2s3IndE//bPHZorgwseK0Qzd4IjXrVZsSLUY5G/v49MZBW66LXMtiYu2NikMOQFk5LkWj6VxSulfHmIoWvt+itVYfNBBUo7DRrIxGitwqg4zuyJ08vB9LUelmGyYgqyM6cHdA68JqzKNIt0Iz2h8t21MQ1wrSAk2f3wLbZpS1K9ADxVm8iXY7bHayzkemVdTmzaIgSfTAfhSbFnz26Nj1l9B3zjLIbIA6890ZZGyPZrbngaNQWbc70SwQb3MaTkHf92Y0oHRGJddWB9ddZDpxhksFaYYSFXyHdiNc0oLcTTKhI1KGU6mZyOB7tPvSFnchyV9QMyY9LW+iexAf4cOkA9tkaFPYGXtlkDEGLcjjHfd5NKvYcAkymcMZaWzwdxZYyisZrhSkCUpcsITsqXry8SzmCe+6U5p64Ul8jV1M+t+DdsQL3f+W7PdmPFLcLGuZGSRvD/8Jtc82c0oLZCVshto3lQoMkHOhIOuhReoy7A624iSZFB1QcgjTDtganXvEHz+g2a4n5oFKSTPO4eh3HGkoK/rZAbHrr5Mtd+02aMfyCsvPh7yFTNTmsesvo7VTFhMw5GT0G/R1IMuY+A2tIredFhZw74vWDbOBfxnK/z/gGOB2YGNqLt4+JTmpVyHGoSn9Q7T43RqZCq0wv9mLyW05R1mDto6TXivGUyjxwCQ0Y+6BzlZmYrer8zTqbLeh0fQL4AS0Ezgc+235k9C9vsvy8yF/RQePz6F7vQLF6/REC+M1hvK6AWeh0Nswu/tg1H9szlW2Qt4bV+EoWnE98psbT1nI+6iAvJst5A1Ho+c8tPX3KfBP3B3MQbZF+nno5i5E259fos5tc+od0hr9VnNQB5yMssXYUoVS3ryWQUaUIwNZ89CgMxENCjaz29bkNiCWo4FmOPZmYCdKuM3r8Xg8Ho/H4/F4PB6Px+PxeDwej8fj8YT0RD5Ds9Ch2cu4KzbqmtDP67pibyzAmdQ8/F2DXE/uI5vH9j7AA+h3XIkOIcdhHjQVb99SFBj2KPLqqLQCQvWej1GSgUEofmMGurkbFfhMWloi/7iXUcdZgFxursY8IKsFctWpRj5dtl7LYQc8HaWFPQpVNP4Gffe4k2VamWuQF8aFyA/tNPS7riZX296mff2Bc9BpfTVyco37kVUcVWSPD7FlI9zW6usUex46Gx6VUW4P5Av3Acpx3AuFDRyDfKGWYJb7OMwLMDb416TTRQk74A6x64OD66ZltfdFyvEwyUrbFfm3ZW0f5CJIbXzk1gk7IIe2LyhPUUtQx1iObshRuK/DEd6ELKXPeiD/sNMKvGdvNGqnVZJn0Qy0MfK0ftCybfk6YL/gej9DeY8F7XFV7qGQgoDiVn5A+QNS0YnSOndtjLw13wn+zhcodiDfF4izHrUrtSY90tYiaYncqV9EI9c8lLfLRV33PdA65JEMMtZH5tTPU7w3LA1RLIhqU/Rdbw2e34sGiaRil8UIO+DuyKO6DYrsfBetRUxrwizC7WBZTEF+FbzeI63AUsTwNkd25JPIw3UB8nDtgfkiqZRlljdFIbjvBzKmoeg2m3Q4O6Lv+RzZwkTPomaIQTvkvTwXeTKfhZKsHRO8/jBakxTiIvT9wuC1Q8nZ6abEF8Hh4zMU8GRCm+CztxZ7o0X78inIUcHrxzv8m0Z0R6PCcuAhFKfcNIO8H5Ec5BR/dM3wN0AJ7q5EC821wC2Gnx+LFCxrVa0XqGlaPYMU+GD0Pd9GuzxhnM2pFM+QOIWa6Zgao4jHNyzaF3bAQSgDywEoXuVNNPOZrC3LoSDHkByQ9l9KXQZ6FbIpW6IfoA0aUW2zFy5GuxvFyJodMWxrS2SOLDX8/M7IvjX9XJwu5L7v1mi03zVy7QQ0Wod8SeEds72Q8l9Fzc2JR1Fn6kJyLrNiTERhsSHPIAW5BAVnpWERur82M7YtYaWystYrbIxu7D2owyxDW3ZHYr4oLqWJtT2KSpweyHgP2agbW8h6hVyytyzMIpfkohcacOJm6SJyM8hgCs8gN1P4dzMNCy40Qk9Ds50J63qR/gKGi/RS0wpFwz1PblF8C0relgbXJlYbdLbwHrlNgyvRGqISeIfc9L8zamM0I+WGyAQMFeRJ8q8fm6Lf+y2Sf7P3MU/ikK8DbozM6ucMZEF5tnmNUtauy7rcm6GDoMmUd5t3EUo52hN3J6vzyB7vDdrhC7dgG6EQ1EfJnd/8E93kU5Fif4EGkSSODd6bz+Q5PXjdJGF5/CDuSJRsexJS3J8ayAo5CynJZHToeBxah92HNpAOz9C+/mhAfBHLg8Idgg+u60TBNlkHXdCW0pykfkftLOo2bIlMjv2C5zuhRXY16ix3otlvBdpO3ryArDHIxs9nTrQJ/tYog/Yl7WLNRRbCwQZy4nRHA8NsZFbOQwksTJPRxdu3DG28WLuaNKS63HWFM1HChqhPV0dyi+yO1AF3ifqCr8tdmZyPNjiuQ4v2pmj02wLZ0h+j0gseT4OlK7LDQyfDNci0eoncQaHHMd7dt+7RGGWTbEIuV5bH4/F4PB6Px+PxeOoh+dyXq7ErwVtIXpbaG3uiU+Qv0SI1rM99GWa+U4VcETYPXvu1I3k2rCt5u6MSEpNw9/vZEMpbQ/KhZxihWY08H9LKm0ttz+pOpHDzz+fNezZylIuyOkWD8pEkz9SRLeRMFCb5CUq5Px0dlO0d/J3eyPXak459kKvPp8iptBIqOS1FjpfxwL2hKLzYNNa9PXI8/ZNpQ/IpyHPUdF/Oiit5+yHleATFIESV9i5UA8JV/fWGwAEodmUyCo9dVPjt64xHUXnqqIK0Qb5d9wPDDOU9j/y6bsHwO5ajDHQWLkReor8geUb7jmxpbBoSvVAqnQlo5qgU5QAVFt2Jmp67xyHXdJs6NZcjE8vYCTefgmyAfZx3Gnk2ZYer0E0djxTBJUnft7Xjv1FJHIZmjtfRzGGzviwl05Crf7RQ0FDkwGhzMDoDeWyfQ35v50TyKcg7qMpP9PGARcPyybMpaNkadeQZCa+1ij1MPQSSvu8UizbWFa5HYbZHoVG5EhkNDETLgE5oXTk6g7yRyPvgQpMP5VuDnIR2iKLMt2hUPnmLLWTk6/St0MItSkfkhpGWpO+7MfbpcCqdsWhH6De4iXwsBfchc/kw5KD5OUpgYZvDaxaKdz8TAzM8n4K8g9tFugt5i5AibBW7voxc3qkTscvOkdS+QrEVdZ0LUIe5FK3pKrGG33y0RhqKintmmT1C/oTWr78lZSRhqZM2uKQapd3sjdYI4TpkLbKlwW/vpqUaRf41Q51mOXBDWVuUzN1oFm+EGwX5FrgJLdYfSvOBuraL9Rd05nEbdUu5K5FqtCX+ABpNbWbeUvMU2vK9CZ13ueAvaEC4JM2b83WyPiSXVn6S8rpXv460/zqU/mY0+uGaoRxMQ8nl4apPVJdI7hp0INcMnRGsQGG8piT1l0Xo/CELYd11lyxE/SdVYGA+BcmX0Nd08VsKbkSZOUagXLTtkUJMQ/HUt+J+G7hchNvhpRyUVqPMgo+hkggrUDpSE5L6yxTc1q93yfXoZN1oy9dTedyDOmyWbJQeT73jcJT9cBXmo7nHU+/5EJiJnDFtitB4PB6Px+PxeDwej8fj8TQMDkLH/PPQPvx05KvT3lBOPCZ9CQq1PR0lQHPZvusxr+URb99KFHp6Bfal0/oin7G5yJHyM+T3Y5IatBX5Y/mjjzTFhKL8nfyh070DmT/L83qcMSg8N9/vtAEKnR2VUt5AkusFdiAXVx7njOC1fAeSDwZt3CR2vTFK+v0fVBLbiHODP/oW6sj90bH8AhRDsL2BrHj6+RNRx67G3oO0UPtmAttlaN8gFM5rXDci4JTgs6+glP0DUKb8lzGLdGyMOmr0sRB5HUevmZZZdqkgYTmF/nlePxmzcgqbBu+/OHb9OKRoSckhHkCDZL5QiPbIK/jR2PWLkJPrgSnb9l/2Q/45oQdllM7IhWNSwmv5SMp60Qjt8y/BfBZJ074JpA+YSmpfFSopFo8xScNHKL476XtlPQ2fAzyeUYZLBQkL8ozJ8/rLmBfkmU7tojt/RT6AnyJX9SizkItMIYai7xX6dHVBQWKpaiHGO9kFyMwYjjQsSmjGdEVmhC1r0ejfCnNfmGLtuwGlsDEdWaNUoxRCrTAvA9EWdYo1Ca9lrZtYaaxECRT6Ursu4pZodB6NmaPlq6jKVNRHsAfwGnJUjZpf2yHfwPFFZN6NsrbcjEzwO5Dbe6oaOFEFCWO+XyV/9GAYYdcrjfACbI1GMpPIwmhMerH2ZS0FsBUy2RYafu5NlADhPOp3wFXIXSiMNV5GeTC6X3cbyhuPBqawFkpbtL54LXhEFaRH5DPF+CUqHPQWihk6nZR9L6ogrYPH5wXePyP4d4s0wiOsj774pigmuDdai5i4pYft+6zAe8L2xaMO07avI/Ly7INSCJm6mY9ASnINWg/NRItUk7JmdYl3UW2SobHrQ9DvYFoxN+zsYec/AG3CTEAKsgWKTw/fsxj4IIXcL9EMsg1ajzydtkHxGaRUTEA2/ddocf4ANet/pyFN+8Ldnbj5VYywfbOQ6/ZNyA/KlK/RjeuGpvAJaBH7Eor/ro/cjZL2dQme743WdKazB2jw+4qcgvQgVwt+GvBN7LV/kWzOxmmNlLYalcJO7d8WVZAw5rtQnepOwb8z0/6BgBPRaNANTZsnoAWeCWnbV4U6qk37jkW27tloR8uWScDVqKZeJ7SleDnljz9Yje550mCzXuQ9JtyDBqRwFhmKRn3bLDjjkRlURW79ERKuQzZHv2sa8woURbgh8pJuj0WGxZDHKVyn+vdIC9NWGnWdu3VdtG99NJLNwl397LOCv7NfsTcWwMUu1uXULiUdclrwWncLuc8i87YpWgBnyQbzy6Ad+yJ3/+iGywg0k5wYeU8xDkQKfE7w/OLgudW9+Enw4fuovcO1NVq0fpjwWj5cK0jYvnupPQqG7ZtO+u3jfO37WXB9hGH78tVXvyOQ19lQXhQXCnJQ0I7zY9erUGnkhdgVBB0UyL02+Nc2NQ/kKi2PQbNZNMngnpHXlqINgkK0QIeBb5Prs01QH/4Yy633C4NGvIH2nY9FuZPmo7K8+TpBEq4VBLTVW42m21NQvtaLkcm2BOVQytq+8Czka8xO1Gciu/g89LsNJVfLPGvndqEgoAXqGnQOMAjNHGHd8DMtZbZAJvBadOKdNaHG3EDWu7HrjdE9XovaXIy/oPXLrrHre6HfwLpg7cHoh5yP7MnP0OI1fmRfjFIoCNRsX7gwn0zh9UkShdrXL3htuIG8AehsYDo6jFqGRquLyV6q2ZWCNEMD3lR0b79Hg+GAjHL/jr0HQpyHAllJ3gfPBa9dWkTGnmgGujzP69eh77+zZRvrFLejLeOeZW6Hx1ORrIcWioswM7E8Ho/H4/F4PB6Px+PxeDweT32nNw1oe/0p5C0ZD34B+bysQS7gadmEdHHVbQ1kjop8Luuh2VTMvk8aRpBr3wzHskEes5eRzZHSNb9AHrhJ/abcXIPDZOuboZDV+2LXmyG/lYmYuRA0o3Zcdfg4F7kLvIdZ2O2ooC2dME8gEecqarsyZKU1attduFeQLVFcwzLMT/hLzbVogC1lyIQNThUE4Ofox/9p5NpI5FXZzdHfaIaSD8wn5z6fllGkC5BJw77ou5Yi8u9m3CpIB+TFOhUpyrVogBns8G/UR5wrCKjoySxk+nRFzl5XOJR/GzLXDrX47CjcKUgV+p5nOJIXxaWCbIjiSyZQM63R79DAdbSjv1MJ7IIsmC/Q2mY6StrQxlJeqCDdkUfvcjQLn5elkZ2Qx+RdyAT5CHf1KYahUfv3lp8fhTsFASlr1ipISbhSkJYodPUVkuu2n45MrixJKiqJw4ErkSf0gai/fEKuBqUp1yBnzC/RQHgwujdhqidrQi/X1SiE0gXdkIfrWOxt1VG4VZC+aIY02ShIg2sTqyHTDfXFuMt6Gq4JPhvf1HgAhW5Yu+VXoTVC6uD2ImyIXOY/C/5vyyjcKkhT5OB4okOZ4BXEliZoA2cCikxcHjxM8nVFuQat1eIxPf0DmdsWE5AvMrAa2bcucjlVofxIHYOGmabSKSUrUc6k+mTH12WuRptCdyNzazdyKZxs42kWUbvGY5jGNCn0uAbropTyJejLnozy8lYaj6N4kmaUt4KvR7tyN1GzKOieGWW2QcoVTTHVIfi3aHKPUtdJPwxFft1O+iTG65qxyNTKmmzOk40qlCQjXqE4a6RjFbXNsxPQGmRGsQ+XcgbZDMVjL0HpWfLZkK8ie7NcLEa7REcjZfGUh2q0o3ga8ATaeTqe2knpTFmKdsbaoXOkY1BfPB3zFEc1yBoDfRjpXE16GsgchdtFeshwZJe6mlH9It2ODihl0EI0cD0N7I/6ic2haHgOsg+5c5CZZDwHqWRGURoF2RTtduzvSJ5XEE9ZGIVO4b+nts9YJfA/qG0r8QpSL6g057JitCd3ovw9JfCzyUgbcu4gq5DLhMfjqXC6kDt0y/fokvfTDZi6NoN47GhC8ZIQX6BZz+PxeDwej8fjqY+8gEI0K4GTULTeSmq7OZQb1xFxF6Pdv0qVV3Hft9S+WJVOe5SV/FlUYapnWVtTer5BMf2VKq/iaOgKsh3yR7sTuSKU4pS+krgddwFwpZBXcSQpSFdUnH0+igD8hGwFKI8D/o322j/GLvAl3r4nkDn0AypYc4CFnFHkQjknIH+fGzK2DeR9Gn7fj1D4aFaTcmdUCHQp8CmqxGtDpZtYSZyMtp8vLvHfScUe6CZ8iLwoe6Gacf9rKe8g5OM0BjkvDkFemrOw6zA/RjfkbdQR+yJlXhG03YSNkNtzNSqW04n8tQ/TEn7fh1Ap6UGoQ9t+32uQN/QnyMHuCDTbVaPvbkqlK0h8DfJrpBynWspzrsAvoSCSlo7kvYpmjehMtQ+6wTYdJiwWGW1fI5T14zELeT2DtrhKaTSe2kFhu2L/fcOY6n6Ra1VI6WzKLNcVBalCQVPLqJmCyhSni/RmqMTuvWgWyUoVUoaHqFm3/G3gcwt5TdEI/Qg127cWdb6f2DXTGVXIHn80dn0yKiRpywoUFhwSlpvbMoPMSqYx6oND0Cz8RDkbEw2YaosaZ1pjPB/tkNLNSngt6VoxNkQuE7+idi6rxphlaCwF4ff9JuG1uQnX0vIdNQcYkNJkrXlYqbQCjkSz8VtlbksNBfkORVi5yjS4AN3IpCwm7TA/c1hErjrrLdmaVhLC75uUErUDar+nOIvQ+nIsKoh6Ahkj/7IQNbFWIK0dRM3a1LZUI3OqT+x6J+w8R5ej0NieyESbmvAoJ9Uopeqxseu7ou1kT3rGo02IQ1EOq2L10EtGfJv3AhTT8DaqQX4I2sWyHbEvQx36d4Hc7YB7qJlhwoTzUKnn11HWvYPRaHN18Cg3l6KdtgfRwDAQbR7MobaZ5CnM60hBDkG/Z1mUJK4gE1HY6XRUR/oJ4BzsA39eRlPkEGSbj0MKYmtbTkJF4KcjhXg6aGcXdNZQbl5GStEVeBKlPPo1Kg9QX02s6hLKfgMNNL3QZo+rFLieCqIj2nU7p9wNKQFX40OLPQa0QtnIj0Iz8WC0JTsX+FEZ2+WaDdGh5XRk/ng8qWiOUiXNRt7BC9C5yPblbFQJOALNii9iXuPF4/F4PB6Px+PxeDwej8fjWbf0QgehHo8ngZFUXqILpzT0mPS6SLzenmcdEkZ07YacxX5A0Wv9g9dPR6enS4DngC1SyjsA+V+F8mxjqkG+OW8EshYhn6edLGWF7euHEja4qKMdj8E/DvuY9LB9ByMH0h9QaQVbtkIu5HOQ9/ZX6GBzAwtZN1C71stXGdoG8tN7L+H6K5jXqhkQtKlrwmvjsEzQEcZATwXOQuGOz6C44KuQ0hyPnA9nI+e8YvKWozDUnsAmwNnYx1QfgmIDng/aNhDltFpI8dyz+dq3An3f7sjj+NTgmk0d7TAm/RHkidA12S8AAAZgSURBVDoY+SrNxl5Blgft64didTpbyAl5F+Ub6A/sF/x7O3ZuMO2QW81idJreieyxRC4VpDky/+Je3h1Qf7YaBMMY6GgMx8YoUOkroEXk+v8E7+1AfkJ5e8Wuf4BdTPVbaAaLBnptidw6bFzyw/YdGrt+C3Z1tF9FHsfRpOC7kz0mvZfFZ+M0Qcp7igNZIa7XIC4VBOBvqN9GlxIj0CDbMY2ApDXICmq6jn+LXNVfQlN8yJTg32Jm1jI0ckWZjnlMdXOkaA9SM8LsSxRgc6ChvJC1yKcoyrNotutkICeMwX+Ymi7gE5FZactq1EGysgop7++RibuLA5mVzmhUKzM6wAxB/Xt2GgFJCpIvBnpBwjUoHhu9JOHaqhSfi9MWtTcpNeUc7FP2LKZ2SOf84N+idbQjlComfT7ugq2OQObpb5GX8UzgXEeyK5HXkIk7JHi+I5rRR6cVUJd2sULF3SThtU3IdWpT2qLyw1FCxTBJYBHGpCeZnIXM0HXJ16iK7CYoFPgh4Fq0kVAJLCfZrG2dcC0N1chsOxbd4yEoDVDqFFF1SUGWo5jv46i9BjkA2f+2nBB7PoiUdbQjhDH4P6PmGmQPYNsMbSsVH6GF6grszS3X2VW+QPczen83BnbIIHM0itM5FjgRbaAsS/vhuqQgIPt5a7SzdgzaJXoRfWHbmPSlwB/Q4u1QtLD7aXDNNJvGZaizPYZ2nU5C8SCp7N0SsxVK03om2oTpDdyGFu+24cpTkFl5NsoJlrSlasKDaCfxjyg7TNfgWpbKV9PQwPVnpHypzask8qWfn0HtvLXd0ahZKGFbPnn3Yx+XHj0HWYybcxCXdbQHoG3ZFegcpD/Zz0Fc0Aa4I2jbUmSy/otsmQsbIyWbh8zfrOcgoN9rCrlzpIHY72KFnEHunKauTQplxXU9inxUUj0UjwFemzyeAngF8Xg8Ho/H4/F4PB6Px+PxeBoyzVE9wbkoXMC2zNty5DHgirUofmYssKlDuR6PEcPQ6e0pqOyDbWZy1wqyDSqougS43qHceolpQJAnPTuiWJp/lLshMT4LHm9h76LTYIgeFO5Jbd+qs4JrIyPXtqN25dUkWiK/n3eoWfykD5rm43UGi3F08HeTyj2/QO2grGJsTu2Y6vDxTIHPpaUZBl6jZWApDSMBxM1kqGESVZCJyIEtGn3VCzkFxq+tQcEohViKHM1+DFwRXGuPQm2fwrz2+pPIkfCXsevbBm26zVDeHDTKRx8nox8zXsrZllIWl/GkY03wcMIYcokYGqEgoGuRu3FYt9DUE/ccNGP0RiPz18BGlu27GNnO0SwcV6PsJllru2+BlOY53Jieo1DMRVZcr0FC7sUys0ceCpVIiwek1VlGoBvSHIUmrkXRcN+Ty0IyB7jSQGYVKpW2PJB3cIb2dUAJGsKMI01RiKvpbBSnJZo1PkERhlmoQjEh3yD38qyUSkFGoJG1D/YltBuj+JJpaLZciIpuDkSxF9ui+pQPZW1spdCVXBaN88iZGs+gkXrn4PVDDOUOxJ3pcn9ETih31wzyqlCU2ULsqu/GWRW0aSLJJbBNKZWCNEbBXNUoMMwm2Olw4D9oPdkbGI5m4PA3qEax77YJNVxwPtqUcEIV2nkZifbJrw2uX4jSsZyFAoFMpsxN0FnABDSDnJ2xjT3QD78PCqR5I6O8K1AHMVX6fOyCOvRSam5u2FIqBTke/Y4XoTMamwV7R5JDblsjC8Qk6UWpuBz7fAWJPIyi6xajEQK0w7UGpf4ZbyCrCqXQmYmyflyHbnjW0MzJKAa9GhiaQU7YSc7K2J4k7seNjV8qBbmL8teWXxdcT7aQ3VqECeFWk8sm0QiZINUoVjst5yHFCqfYpsj0mELNJHS2bVyAfdKAHdE27DiUFCD6yJohEOBG4HMHckqlII+RLdFFXSHTNm8SOwYC4ztVY4LrPVPK2Q2ZY3EzY3tkftxq30TaB23JchIcnquU6hzkBtyUSC6VgjyOm4R0lU4mBUnazvw3NdPWhBxlKPt9ku3aT8i+JRuafqZnH1EeJ/l7umIVlX0Q1wzHpkd9pK6F3O6IsgNegQ4OK9mGnoFmuu6UVhFt2BItol2YgJ4K4gV0DjIeN+uEUrIh8Caa3ldhvzHh2sRaido0HW3b13eupp4X+anrtEP+a7bmlmsF6UJy+lZPAv8PwJg7Z2V8jUoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.select_font_face(\"Sans\", cairo.FONT_SLANT_NORMAL,\n",
    "                        cairo.FONT_WEIGHT_NORMAL)\n",
    "    # draw 0.08 glyphs in 0.10 squares, at(0.01, 0.02) from left corner\n",
    "    cr.set_font_size(0.08)\n",
    "\n",
    "    glyphs = []\n",
    "    index = 0\n",
    "    for y in range(10):\n",
    "        for x in range(10):\n",
    "            glyphs.append((index, x / 10.0 + 0.01, y / 10.0 + 0.08))\n",
    "            index += 1\n",
    "\n",
    "    cr.show_glyphs(glyphs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.select_font_face(\"Sans\", cairo.FONT_SLANT_NORMAL,\n",
    "                        cairo.FONT_WEIGHT_NORMAL)\n",
    "    # draw 0.16 glyphs in 0.20 squares, at (0.02, 0.04) from left corner\n",
    "    cr.set_font_size(0.16)\n",
    "\n",
    "    glyphs = []\n",
    "    index = 20\n",
    "    for y in range(5):\n",
    "        for x in range(5):\n",
    "            glyphs.append((index, x / 5.0 + 0.02, y / 5.0 + 0.16))\n",
    "            index += 1\n",
    "\n",
    "    cr.glyph_path(glyphs)\n",
    "    cr.set_source_rgb(0.5, 0.5, 1.0)\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source_rgb(0, 0, 0)\n",
    "    cr.set_line_width(0.005)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAAD+ElEQVR4nO3XSXIbQQxFQdKh+1+ZXsiQbJP6nLq7psyNFFz1BniF8+l0uZyAP87nz7+fc/Gr5adA7z6+/63JgRXdfkkpCAQf1z+5SVhJfjkpCAQ3ClLcJMzssZeSgkAQClLcJMzkuZeRgkDwQEGKm4SRvfYSUhAInihIcZMwkvdePgoCwQsFKW4SerbNS0dBIHijIMVNQk+2fdkoCAQbFKS4SWhpn5eMgkCwYUGKm4Qj7ftyURAIdihIcZOwp2NeKgoCwY4FKW4StnTsy0RBIDigIMVNwjvavEQUBIIDC1LcJDyj7ctDQSBoUJDiJiHp46WhIBA0LEjpY1PQi75eFgoCQQcFKX1tDo7W50tCQSDoqCClz03CXvp+OSgIBB0WpPS9WXjXGC8FBYGg44KUMTYNjxrrZaAgEAxQkDLW5uF/Y74EFASCgQpSxtxE6xq7/AoCwYAFKWNvpvnNUXoFgWDggpQ5NtU85iq7gkAwQUHKXJtrPHOWXEEgmKggZc5N1q+5y60gEExYkDL3ZmtvjVIrCAQTF6SssemOs1aZFQSCBQpS1tp821uzxAoCwUIFKWtuwtetXV4FgWDBgpS1N+N9Sns6KQhECxek2JT/Uta/KQgECvJl9c2ppLcoCAQKcmW1Tbp6OTMFgUBBfjT7Zl2tlK9REAgU5K7ZNu3sZdyWgkCgIA8bffPOVsJjKAgECvK0kTbx6NVrT0EgUJCX2c4rUBAIDAgEBgQCAwKBAYHAgEBgQCAwIBAYEAgMCAQGBAIDAoEBgcCAQGBAIDAgEBgQCAwIBAYEAgMCgQGBwIBAYEAgMCAQGBAIDAgEBgQCAwKBAYHAgEBgQCAwIBAYEAgMCAQGBAIDAoEBgcCAQGBAIDAgEBgQCAwIBAYEgo/WHzCuy6X1F7A/BYFAQZ52Prf+Ao6jIBAoyMPcHCtSEAgU5C43x8oUBAIF+ZGbAwWBSEGuuDn4piAQKMgXNwfXFAQCBXFzECgIBAsXxM3BfQoCwYIFcXPwOAWBYKGCuDl4noJAsEBB3By8TkEgmLggbg7epyAQTFgQNwfbURAIJiqIm4PtKQgEExTEzcF+FASCgQvi5mB/CgLBgAVxc3AcBYFgoIK4OTiegkAwQEHcHLSjIBB0XBA3B+0pCAQdFsTNQT8UBIKOCuLmoD8KAkEHBXFz0C8FgaBhQdwc9E9BIGhQEDcH41AQCA4siJuD8SgIBAcUxM3BuBQEgh0L4uZgfAoCwQ4FcXMwDwWBYMOCuDmYj4JAsEFB3BzMS0EgeKMgbg7mpyAQvFAQNwfrUBAIniiIm4P1KAgEDxTEzcG6FASCUBA3BygIBDcK4uaAoiAQnN0a8DMFgeA3/9h6J1+cU/4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(ctx, width, height):\n",
    "    wd = .02 * width\n",
    "    hd = .02 * height\n",
    "\n",
    "    width -= 2\n",
    "    height -= 2\n",
    "\n",
    "    ctx.move_to(width + 1, 1 - hd)\n",
    "    for i in range(20):\n",
    "        ctx.rel_line_to(0, height - hd * (2 * i - 1))\n",
    "        ctx.rel_line_to(-(width - wd * (2 * i)), 0)\n",
    "        ctx.rel_line_to(0, -(height - hd * (2 * i)))\n",
    "        ctx.rel_line_to(width - wd * (2 * i + 1), 0)\n",
    "\n",
    "    ctx.set_source_rgb(0, 0, 1)\n",
    "    ctx.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    cr.select_font_face(\"Sans\", cairo.FONT_SLANT_NORMAL,\n",
    "                        cairo.FONT_WEIGHT_BOLD)\n",
    "    cr.set_font_size(0.35)\n",
    "\n",
    "    cr.move_to(0.04, 0.53)\n",
    "    cr.show_text(\"Hello\")\n",
    "\n",
    "    cr.move_to(0.27, 0.65)\n",
    "    cr.text_path(\"void\")\n",
    "    cr.set_source_rgb(0.5, 0.5, 1)\n",
    "    cr.fill_preserve()\n",
    "    cr.set_source_rgb(0, 0, 0)\n",
    "    cr.set_line_width(0.01)\n",
    "    cr.stroke()\n",
    "\n",
    "    # draw helping lines\n",
    "    cr.set_source_rgba(1, 0.2, 0.2, 0.6)\n",
    "    cr.arc(0.04, 0.53, 0.02, 0, 2 * pi)\n",
    "    cr.arc(0.27, 0.65, 0.02, 0, 2 * pi)\n",
    "    cr.fill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    utf8 = \"cairo\"\n",
    "\n",
    "    cr.select_font_face(\"Sans\",\n",
    "                        cairo.FONT_SLANT_NORMAL,\n",
    "                        cairo.FONT_WEIGHT_NORMAL)\n",
    "\n",
    "    cr.set_font_size(0.2)\n",
    "    x_bearing, y_bearing, width, height, x_advance, y_advance = \\\n",
    "        cr.text_extents(utf8)\n",
    "    x = 0.5 - (width / 2 + x_bearing)\n",
    "    y = 0.5 - (height / 2 + y_bearing)\n",
    "\n",
    "    cr.move_to(x, y)\n",
    "    cr.show_text(utf8)\n",
    "\n",
    "    # draw helping lines\n",
    "    cr.set_source_rgba(1, 0.2, 0.2, 0.6)\n",
    "    cr.arc(x, y, 0.05, 0, 2 * pi)\n",
    "    cr.fill()\n",
    "    cr.move_to(0.5, 0)\n",
    "    cr.rel_line_to(0, 1)\n",
    "    cr.move_to(0, 0.5)\n",
    "    cr.rel_line_to(1, 0)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@disp\n",
    "def draw(cr, width, height):\n",
    "    cr.scale(width, height)\n",
    "    cr.set_line_width(0.04)\n",
    "\n",
    "    utf8 = \"cairo\"\n",
    "\n",
    "    cr.select_font_face(\"Sans\",\n",
    "                        cairo.FONT_SLANT_NORMAL,\n",
    "                        cairo.FONT_WEIGHT_NORMAL)\n",
    "\n",
    "    cr.set_font_size(0.4)\n",
    "    x_bearing, y_bearing, width, height, x_advance, y_advance = \\\n",
    "        cr.text_extents(utf8)\n",
    "\n",
    "    x = 0.1\n",
    "    y = 0.6\n",
    "\n",
    "    cr.move_to(x, y)\n",
    "    cr.show_text(utf8)\n",
    "\n",
    "    # draw helping lines\n",
    "    cr.set_source_rgba(1, 0.2, 0.2, 0.6)\n",
    "    cr.arc(x, y, 0.05, 0, 2 * pi)\n",
    "    cr.fill()\n",
    "    cr.move_to(x, y)\n",
    "    cr.rel_line_to(0, -height)\n",
    "    cr.rel_line_to(width, 0)\n",
    "    cr.rel_line_to(x_bearing, -y_bearing)\n",
    "    cr.stroke()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import math\n",
    "all_width = all_height = text_width = 0\n",
    "\n",
    "def warpPath(ctx, function):\n",
    "    first = True\n",
    "\n",
    "    for type, points in ctx.copy_path():\n",
    "        if type == cairo.PATH_MOVE_TO:\n",
    "            if first:\n",
    "                ctx.new_path()\n",
    "                first = False\n",
    "            x, y = function(*points)\n",
    "            ctx.move_to(x, y)\n",
    "\n",
    "        elif type == cairo.PATH_LINE_TO:\n",
    "            x, y = function(*points)\n",
    "            ctx.line_to(x, y)\n",
    "\n",
    "        elif type == cairo.PATH_CURVE_TO:\n",
    "            x1, y1, x2, y2, x3, y3 = points\n",
    "            x1, y1 = function(x1, y1)\n",
    "            x2, y2 = function(x2, y2)\n",
    "            x3, y3 = function(x3, y3)\n",
    "            ctx.curve_to(x1, y1, x2, y2, x3, y3)\n",
    "\n",
    "        elif type == cairo.PATH_CLOSE_PATH:\n",
    "            ctx.close_path()\n",
    "\n",
    "\n",
    "def spiral(x, y):\n",
    "    theta0 = -math.pi * 3 / 4\n",
    "    theta = x / all_width * math.pi * 2 + theta0\n",
    "    radius = y + 200 - x / 7\n",
    "    xnew = radius * math.cos(theta)\n",
    "    ynew = radius * math.sin(-theta)\n",
    "    return xnew + all_width / 2, ynew + all_height / 2\n",
    "\n",
    "\n",
    "def curl(x, y):\n",
    "    xn = x - text_width / 2\n",
    "    xnew = xn\n",
    "    ynew = y + xn ** 3 / ((text_width / 2) ** 3) * 70\n",
    "    return xnew + all_width / 2, ynew + all_height * 2 / 5\n",
    "\n",
    "\n",
    "@disp\n",
    "def draw(ctx, width, height):\n",
    "    global text_width, all_width, all_height\n",
    "\n",
    "    all_width, all_height = width, height\n",
    "\n",
    "    solidpattern = ctx.get_source()\n",
    "\n",
    "    # background\n",
    "    pat = cairo.LinearGradient(0.0, 0.0, 0, height)\n",
    "    pat.add_color_stop_rgba(1, 0, 0, 0, 1)\n",
    "    pat.add_color_stop_rgba(0, 1, 1, 1, 1)\n",
    "\n",
    "    ctx.rectangle(0, 0, width, height)\n",
    "    ctx.set_source(pat)\n",
    "    ctx.fill()\n",
    "\n",
    "    # foreground\n",
    "    ctx.set_source(solidpattern)\n",
    "    ctx.set_source_rgb(1, 1, 1)\n",
    "\n",
    "    ctx.select_font_face(\"Sans\")\n",
    "    ctx.set_font_size(80)\n",
    "\n",
    "    # spiral text\n",
    "    ctx.new_path()\n",
    "    ctx.move_to(0, 0)\n",
    "    ctx.text_path(\"pycairo - \" + \"spam \" * 5)\n",
    "    warpPath(ctx, spiral)\n",
    "    ctx.fill()\n",
    "\n",
    "    # curly text\n",
    "    ctx.new_path()\n",
    "    ctx.move_to(0, 0)\n",
    "    ctx.set_source_rgb(0.3, 0.3, 0.3)\n",
    "    text = \"I am curly :)\"\n",
    "    ctx.text_path(text)\n",
    "    text_width = ctx.text_extents(text)[2]\n",
    "    warpPath(ctx, curl)\n",
    "    ctx.fill()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {
      "image/png": {
       "width": 200
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from contextlib import contextmanager\n",
    "\n",
    "@disp\n",
    "def draw(ctx, width, height):\n",
    "    cr = ctx\n",
    "    @contextmanager\n",
    "    def saved(cr):\n",
    "        cr.save()\n",
    "        try:\n",
    "            yield cr\n",
    "        finally:\n",
    "            cr.restore()\n",
    "\n",
    "    def Tree(angle):\n",
    "        cr.move_to(0, 0)\n",
    "        cr.translate(0, -65)\n",
    "        cr.line_to(0, 0)\n",
    "        cr.stroke()\n",
    "        cr.scale(0.72, 0.72)\n",
    "        if angle > 0.12:\n",
    "            for a in [-angle, angle]:\n",
    "                with saved(cr):\n",
    "                    cr.rotate(a)\n",
    "                    Tree(angle * 0.75)\n",
    "\n",
    "\n",
    "    cr.translate(140, 203)\n",
    "    cr.set_line_width(5)\n",
    "    Tree(0.32)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
