function tutorial_filters
file = 'matterhorn_small.jpg';
fig = figure;
set(fig, 'DefaultAxesFontName', 'Arial')
set(fig, 'DefaultAxesFontSize', 6)
plotCounter = 1;
xPlots = 3;
yPlots = 4;
% a) Original plot with a line, patch, and text object
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
title('a) Original')
% b) Adding a Gaussian blur filter for each object that uses the standard
%    color channels for the blur operation. The bounding box is covering
%    the axis region for each object. Note: there is no bounding box
%    overlap specified. This would lead to some distortion at the border if
%    a offset filter followed the blur filter.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'off')
svgGaussianBlur(h, 'SourceGraphic', 2, 'blur');
title('b) Blur on (S = SourceGraphic)')
% c) Identical to b) but the blur filter uses the alpha channel. This mode
%    is very useful to create shadows.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'off')
svgGaussianBlur(h, 'SourceAlpha', 2, 'blur');
title('c) Blur (S = SourceAlpha)')
% d) Adding a image filter that covers the whole axis region. The filter
%    replaces the object as no other combine filter is defined. The image
%    is scaled to the bounding box. This leads to a distortion of the
%    aspect ratio.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'on')
svgImage(h, file, 'none', 'pic');
title('d) Pict (BB = axes, none)')
% e) Identical to d) but with correct aspect ratio of the image. The
%    setting 'xMidYMid slice' centers the image and scales x and y so that
%    both cover the bonding box region defined by the axis region. The
%    clipping of the axis object removes the overlap.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'on')
svgImage(h, file, 'xMidYMid slice', 'pic');
title('e) Pict (BB = axes, xMidYMid slice)')
% f) Identical to e) but with image scaling 'xMidYMid meet'. This setting
%    also conserves the aspect ratio. However, the image may no more cover
%    the whole bounding box. 
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'on')
svgImage(h, file, 'xMidYMid meet', 'pic');
title('f) Pict (BB = axes, xMidYMid meet)')
% h) Identical to f) but with bounding box defined by the object. The
%    bounding box may be larger than the object extension due to line
%    width and marker size.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'element', 0, 'on')
svgImage(h, file, 'xMidYMid meet', 'pic');
title('g) Pict (BB = element, xMidYMid meet)')
% g) Now we add a composite filter that combines the filter result from the
%    image filter and the source graphic. The keyword 'atop' restricts the
%    image filter to the object boundaries.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'on')
svgImage(h, file, 'xMidYMid slice', 'pic');
svgComposite(h, 'pic', 'SourceGraphic', 'atop', 'obj');
title('h) Pict (BB = axes, xMidYMid slice)')
% i) Identical to g) but with a filter bounding box defined by the object
%    extension. The image scaling 'xMidYMid meet' is not well suited for
%    this application. The image is not covering the whole object.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'element', 0, 'on')
svgImage(h, file, 'xMidYMid meet', 'pic');
svgComposite(h, 'pic', 'SourceGraphic', 'atop', 'obj');
title('i) Pict (BB = element, xMidYMid meet)')
% j) Identical to i) but with a better image scaling that conserves the
%    spect ratio and makes sure that the whole bounding box is covered.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'element', 0, 'on')
svgImage(h, file, 'xMidYMid slice', 'pic');
svgComposite(h, 'pic', 'SourceGraphic', 'atop', 'obj');
title('j) Pict (BB = element, xMidYMid slice)')
% k) Identical to j) but with a bounding box overlap of 5 pixel. This is
%    important to avoid distortions at the border. 
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'element', 5, 'on')
svgImage(h, file, 'xMidYMid slice', 'pic');
svgComposite(h, 'pic', 'SourceGraphic', 'atop', 'obj');
title('k) Pict (BB = element, xMidYMid slice)')
% l) Identical to k) but the composition is based on the image filter and a
%    blur filter. In addition, the image filter covers the whole axis
%    region.
subplot(yPlots, xPlots, plotCounter)
plotCounter = plotCounter + 1;
h = create_plot;
svgBoundingBox(h, 'axes', 0, 'on')
svgImage(h, file, 'xMidYMid slice', 'pic');
svgGaussianBlur(h, 'SourceAlpha', 2, 'blur');
svgComposite(h, 'pic', 'blur', 'atop', 'obj');
title('l) Blur + Pict (BB = axes, xMidYMid slice)')
% Save the result
plot2svg('tutorial_filters.svg')

function handles = create_plot
% Helper function to plot the objects
hold on
s1 = text(3, 1, 'plot2svg', 'FontName', 'Arial', 'FontSize', 16, ...
    'Color', 'red', 'FontWeight', 'bold', 'Margin', 0.01, 'Clipping', 'on');
s2 = plot([6 8], [3 6], 'b', 'LineWidth', 20);
s3 = patch([1 2 3 4 3 2 1], [1 3 2 3 4 5 3],'black');
handles = [s1 s2 s3];
box on 
grid on
axis([0 10 0 6])
