001    /*
002     * Mirror
003     * 
004     * Copyright (c) 2001, 2002, 2003 Marco Schmidt.
005     * All rights reserved.
006     */
007    
008    package net.sourceforge.jiu.geometry;
009    
010    import net.sourceforge.jiu.data.IntegerImage;
011    import net.sourceforge.jiu.data.PixelImage;
012    import net.sourceforge.jiu.ops.ImageToImageOperation;
013    import net.sourceforge.jiu.ops.MissingParameterException;
014    import net.sourceforge.jiu.ops.WrongParameterException;
015    
016    /**
017     * Mirrors images (leftmost column becomes rightmost column and vice versa, and so on).
018     * <p>
019     * Supported image types: {@link IntegerImage}.
020     * <h3>Usage example</h3>
021     * <pre>
022     * PixelImage image = ...; // something implementing IntegerImage
023     * Mirror mirror = new Mirror();
024     * mirror.setInputImage(image);
025     * mirror.process();
026     * PixelImage mirroredImage = mirror.getOutputImage();
027     * </pre>
028     * @author Marco Schmidt
029     */
030    public class Mirror extends ImageToImageOperation
031    {
032            private void process(IntegerImage in, IntegerImage out)
033            {
034                    final int WIDTH = in.getWidth();
035                    final int HEIGHT = in.getHeight();
036                    if (out == null)
037                    {
038                            out = (IntegerImage)in.createCompatibleImage(WIDTH, HEIGHT);
039                            setOutputImage(out);
040                    }
041                    int totalItems = in.getNumChannels() * WIDTH;
042                    int processedItems = 0;
043                    for (int c = 0; c < in.getNumChannels(); c++)
044                    {
045                            for (int x1 = 0, x2 = WIDTH - 1; x1 < WIDTH; x1++, x2--)
046                            {
047                                    for (int y = 0; y < HEIGHT; y++)
048                                    {
049                                            out.putSample(c, x2, y, in.getSample(c, x1, y));
050                                    }
051                                    setProgress(processedItems++, totalItems);
052                            }
053                    }
054            }
055    
056            public void process() throws
057                    MissingParameterException,
058                    WrongParameterException
059            {
060                    ensureInputImageIsAvailable();
061                    ensureImagesHaveSameResolution();
062                    PixelImage in = getInputImage();
063                    if (in instanceof IntegerImage)
064                    {
065                            process((IntegerImage)in, (IntegerImage)getOutputImage());
066                    }
067                    else
068                    {
069                            throw new WrongParameterException("Input image must be of type IntegerImage.");
070                    }
071            }
072    }