Render electrode state shapes.

        By default, draw each electrode shape filled white.

        See also :meth:`render_shapes()`.

        Parameters
        ----------
        df_shapes = : pandas.DataFrame


        .. versionadded:: 0.12

def render_electrode_shapes(self, df_shapes=None, shape_scale=0.8,
                                fill=(1, 1, 1)):
        '''
        Render electrode state shapes.

        By default, draw each electrode shape filled white.

        See also :meth:`render_shapes()`.

        Parameters
        ----------
        df_shapes = : pandas.DataFrame


        .. versionadded:: 0.12
        '''
        surface = self.get_surface()
        if df_shapes is None:
            if hasattr(self.canvas, 'df_canvas_shapes'):
                df_shapes = self.canvas.df_canvas_shapes
            else:
                return surface
        if 'x_center' not in df_shapes or 'y_center' not in df_shapes:
            # No center points have been computed for shapes.
            return surface

        cairo_context = cairo.Context(surface)

        df_shapes = df_shapes.copy()
        # Scale shapes to leave shape edges uncovered.
        df_shapes[['x', 'y']] = (df_shapes[['x_center', 'y_center']] +
                                 df_shapes[['x_center_offset',
                                            'y_center_offset']].values *
                                 shape_scale)

        for path_id, df_path_i in (df_shapes.groupby(self.canvas
                                                     .shape_i_columns)[['x',
                                                                        'y']]):
            # Use attribute lookup for `x` and `y`, since it is considerably
            # faster than `get`-based lookup using columns name strings.
            vertices_x = df_path_i.x.values
            vertices_y = df_path_i.y.values
            cairo_context.move_to(vertices_x[0], vertices_y[0])
            for x, y in itertools.izip(vertices_x[1:], vertices_y[1:]):
                cairo_context.line_to(x, y)
            cairo_context.close_path()

            # Draw filled shape to indicate actuated electrode state.
            cairo_context.set_source_rgba(*fill)
            cairo_context.fill()
        return surface