Android Open Source - pixel-art Flood Fill






From Project

Back to project page pixel-art.

License

The source code is released under:

Apache License

If you think the Android project pixel-art listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.jaween.pixelart.tools;
//w w  w  .  ja  v  a 2  s .  c  o m
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.Log;

import com.jaween.pixelart.tools.attributes.ToolAttributes;
import com.jaween.pixelart.util.Debug;

/**
 * Created by ween on 9/28/14.
 */
public class FloodFill extends Tool {

    private static final int TOOL_ID = 5;
    private int[] bitmapArray;
    private int[] pixelStack;
    private int width, height;

    public FloodFill(String name, Drawable icon) {
        super(name, icon, TOOL_ID);

        toolAttributes = new ToolAttributes();

        // Floods pixel by pixel, so attributes must reflect this
        toolAttributes.getPaint().setStrokeWidth(0);
        toolAttributes.getPaint().setAntiAlias(false);
    }

    @Override
    protected void onStart(Bitmap bitmap, PointF event) {
        performFloodFill(bitmap, event);
        setPixels(bitmapArray, bitmap);
    }

    @Override
    protected void onMove(Bitmap bitmap, PointF event) {
        setPixels(bitmapArray, bitmap);
    }

    @Override
    protected void onEnd(Bitmap bitmap, PointF event) {
        setPixels(bitmapArray, bitmap);
    }

    private void setPixels(int[] source, Bitmap destination) {
            destination.setPixels(
                    source,
                    0,
                    destination.getWidth(),
                    0,
                    0,
                    destination.getWidth(),
                    destination.getHeight());
    }

    private int colour(int x, int y) {
        return bitmapArray[x + y * width];
    }

    public void setBitmapConfiguration(int width, int height) {
        bitmapArray = new int[width * height];
        pixelStack = new int[height * 2];

        this.width = width;
        this.height = height;
    }

    // Vertical scanline stack based four-way flood fill algorithm
    private void performFloodFill(Bitmap bitmap, PointF event) {
        long startTime = System.currentTimeMillis();

        // No bitmap
        if (bitmap == null) {
            return;
        }

        // Gets an array of the bitmap's colours
        bitmap.getPixels(bitmapArray, 0, width, 0, 0, width, height);

        // Out of bounds
        if (!isInBounds(bitmap, event)) {
            return;
        }

        // Colour to be replaced and the colour which will replace it
        int oldColour = colour((int) event.x, (int) event.y);
        int newColour = toolAttributes.getPaint().getColor();
        toolAttributes.getPaint().setColor(toolAttributes.getPaint().getColor());

        // Filling not required
        if (oldColour == newColour) {
            return;
        }

        // Resets the pixelStack
        int topOfStackIndex = 0;

        // Pushes the touched pixel onto the stack
        pixelStack[topOfStackIndex] = (int) event.x;
        pixelStack[topOfStackIndex + 1] = (int) event.y;
        topOfStackIndex += 2;


        // Four-way flood fill algorithm
        while (topOfStackIndex > 0) {

            // Pops a pixel from the stack
            int x = pixelStack[topOfStackIndex - 2];
            int y1 = pixelStack[topOfStackIndex - 1];
            topOfStackIndex -= 2;

            while (y1 >= 0 && colour(x, y1) == oldColour) {
                y1--;
            }
            y1++;

            boolean spanLeft = false;
            boolean spanRight = false;

            while (y1 < height && colour( x, y1) == oldColour) {
                bitmapArray[x + y1 * width] = toolAttributes.getPaint().getColor();

                if (!spanLeft && x > 0 && colour( x - 1, y1) == oldColour) {
                    // Pixel to the left must also be changed, pushes it to the stack
                    pixelStack[topOfStackIndex] = x - 1;
                    pixelStack[topOfStackIndex + 1] = y1;
                    topOfStackIndex += 2;
                    spanLeft = true;
                } else if (spanLeft && x > 0 && colour( x - 1, y1) != oldColour) {
                    // Pixel to the left has already been changed
                    spanLeft = false;
                }

                if (!spanRight && x < width - 1 && colour(x + 1, y1) == oldColour) {
                    // Pixel to the right must also be changed, pushes it to the stack
                    pixelStack[topOfStackIndex] = x + 1;
                    pixelStack[topOfStackIndex + 1] = y1;
                    topOfStackIndex += 2;
                    spanRight = true;
                } else if (spanRight && x < width - 1 && colour(x + 1, y1) != oldColour) {
                    // Pixel to the right has already been changed
                    spanRight = false;
                }
                y1++;
            }
        }

        // Debug log
        if (Debug.ON) {
            Log.d("FloodFill", "Flooding took " + (System.currentTimeMillis() - startTime) + "ms");
        }
    }
}




Java Source Code List

com.jaween.pixelart.ContainerActivity.java
com.jaween.pixelart.ContainerFragment.java
com.jaween.pixelart.PanelManagerFragment.java
com.jaween.pixelart.io.AnimationFile.java
com.jaween.pixelart.io.FileAdapter.java
com.jaween.pixelart.io.ImportExport.java
com.jaween.pixelart.io.LoadFileDialog.java
com.jaween.pixelart.tools.Command.java
com.jaween.pixelart.tools.Dropper.java
com.jaween.pixelart.tools.Eraser.java
com.jaween.pixelart.tools.FloodFill.java
com.jaween.pixelart.tools.FreeSelect.java
com.jaween.pixelart.tools.MagicWand.java
com.jaween.pixelart.tools.Oval.java
com.jaween.pixelart.tools.Pen.java
com.jaween.pixelart.tools.RectSelect.java
com.jaween.pixelart.tools.Rect.java
com.jaween.pixelart.tools.Selection.java
com.jaween.pixelart.tools.ToolReport.java
com.jaween.pixelart.tools.Tool.java
com.jaween.pixelart.tools.attributes.EraserToolAttributes.java
com.jaween.pixelart.tools.attributes.MagicWandToolAttributes.java
com.jaween.pixelart.tools.attributes.OvalToolAttributes.java
com.jaween.pixelart.tools.attributes.PenToolAttributes.java
com.jaween.pixelart.tools.attributes.RectToolAttributes.java
com.jaween.pixelart.tools.attributes.ToolAttributes.java
com.jaween.pixelart.tools.options.EraserOptionsView.java
com.jaween.pixelart.tools.options.MagicWandOptionsView.java
com.jaween.pixelart.tools.options.OvalOptionsView.java
com.jaween.pixelart.tools.options.PenOptionsView.java
com.jaween.pixelart.tools.options.RectOptionsView.java
com.jaween.pixelart.tools.options.ToolOptionsView.java
com.jaween.pixelart.ui.ColourButton.java
com.jaween.pixelart.ui.ColourSelector.java
com.jaween.pixelart.ui.DrawingFragment.java
com.jaween.pixelart.ui.DrawingSurface.java
com.jaween.pixelart.ui.PaletteFragment.java
com.jaween.pixelart.ui.PanelFragment.java
com.jaween.pixelart.ui.PixelGrid.java
com.jaween.pixelart.ui.Thumbnail.java
com.jaween.pixelart.ui.ToolButton.java
com.jaween.pixelart.ui.ToolboxFragment.java
com.jaween.pixelart.ui.TransparencyCheckerboard.java
com.jaween.pixelart.ui.animation.AnimationFragment.java
com.jaween.pixelart.ui.animation.FrameAdapter.java
com.jaween.pixelart.ui.animation.Frame.java
com.jaween.pixelart.ui.colourpicker.ColourPickerDialog.java
com.jaween.pixelart.ui.colourpicker.ColourPickerFragment.java
com.jaween.pixelart.ui.colourpicker.ColourPickerView.java
com.jaween.pixelart.ui.layer.LayerAdapter.java
com.jaween.pixelart.ui.layer.LayerFragment.java
com.jaween.pixelart.ui.layer.Layer.java
com.jaween.pixelart.ui.undo.DrawOpManager.java
com.jaween.pixelart.ui.undo.DrawOpUndoData.java
com.jaween.pixelart.ui.undo.FrameUndoData.java
com.jaween.pixelart.ui.undo.LayerUndoData.java
com.jaween.pixelart.ui.undo.UndoItem.java
com.jaween.pixelart.ui.undo.UndoManager.java
com.jaween.pixelart.util.AbsVerticalSeekBar.java
com.jaween.pixelart.util.AnimatedGifEncoder.java
com.jaween.pixelart.util.AutoSaver.java
com.jaween.pixelart.util.BitmapEncoder.java
com.jaween.pixelart.util.Color.java
com.jaween.pixelart.util.ConfigChangeFragment.java
com.jaween.pixelart.util.Debug.java
com.jaween.pixelart.util.MarchingAnts.java
com.jaween.pixelart.util.PreferenceManager.java
com.jaween.pixelart.util.ScaleListener.java
com.jaween.pixelart.util.SlideAnimator.java
com.jaween.pixelart.util.SlidingLinearLayout.java
com.jaween.pixelart.util.VerticalProgressBar.java
com.tokaracamara.android.verticalslidevar.VerticalSeekBar.java