docs: def add_visual(self, visual):
          """Add a visual to the canvas, and build its program by the same
          occasion.
  
          We can't build the visual's program before, because we need the canvas'
          transforms first.
  
          """
          # Retrieve the visual's GLSL inserter.
          inserter = visual.inserter
          # Add the visual's transforms.
          inserter.add_transform_chain(visual.transforms)
          # Then, add the canvas' transforms.
          canvas_transforms = visual.canvas_transforms_filter(self.transforms)
          inserter.add_transform_chain(canvas_transforms)
          # Also, add the canvas' inserter.
          inserter += self.inserter
          # Now, we insert the transforms GLSL into the shaders.
          vs, fs = visual.vertex_shader, visual.fragment_shader
          vs, fs = inserter.insert_into_shaders(vs, fs)
          # Finally, we create the visual's program.
          visual.program = gloo.Program(vs, fs)
          logger.log(5, "Vertex shader: %s", vs)
          logger.log(5, "Fragment shader: %s", fs)
          # Initialize the size.
          visual.on_resize(self.size)
          # Register the visual in the list of visuals in the canvas.
          self.visuals.append(visual)
          self.events.visual_added(visual=visual)