/* ChibiPaint Copyright (c) 2006-2008 Marc Schefer This file is part of ChibiPaint. ChibiPaint is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ChibiPaint is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ChibiPaint. If not, see <http://www.gnu.org/licenses/>. */ package com.chibipaint; import idv.jlchntoz.oekakimobile.PaintCanvas; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import com.chibipaint.engine.*; import com.chibipaint.util.*; public abstract class CPController { final static String VERSION_STRING = "0.7.11.2"; private CPColor curColor = new CPColor(); // int curAlpha = 255; // int brushSize = 16; // some important object references public CPArtwork artwork; public PaintCanvas canvas; CPBrushInfo curBrush; int curMode = M_DRAW; private LinkedList<ICPColorListener> colorListeners = new LinkedList<ICPColorListener>(); private LinkedList<ICPToolListener> toolListeners = new LinkedList<ICPToolListener>(); private LinkedList<ICPModeListener> modeListeners = new LinkedList<ICPModeListener>(); private LinkedList<ICPViewListener> viewListeners = new LinkedList<ICPViewListener>(); private LinkedList<ICPEventListener> cpEventListeners = new LinkedList<ICPEventListener>(); // // Definition of all the standard tools available // public static final int T_PENCIL = 0; public static final int T_ERASER = 1; public static final int T_PEN = 2; public static final int T_SOFTERASER = 3; public static final int T_AIRBRUSH = 4; public static final int T_DODGE = 5; public static final int T_BURN = 6; public static final int T_WATER = 7; public static final int T_BLUR = 8; public static final int T_SMUDGE = 9; public static final int T_BLENDER = 10; public static final int T_MAX = 11; // // Definition of all the modes available // public static final int M_DRAW = 0; public static final int M_FLOODFILL = 1; public static final int M_RECT_SELECTION = 2; public static final int M_MOVE_TOOL = 3; public static final int M_ROTATE_CANVAS = 4; public static final int M_COLOR_PICKER = 5; public static final int M_MOVE_CANVAS = 6; public static final int M_MAX = 7; // Image loader cache private Map<String, Bitmap> imageCache = new HashMap<String, Bitmap>(); public interface ICPColorListener { public void newColor(CPColor color); } public interface ICPToolListener { public void newTool(int tool, CPBrushInfo toolInfo); } public interface ICPModeListener { public void modeChange(int mode); } public interface ICPViewListener { public void viewChange(CPViewInfo viewInfo); } public interface ICPEventListener { public void cpEvent(); } public static class CPViewInfo { public float zoom; public int offsetX, offsetY; } public CPController() { } public void setArtwork(CPArtwork artwork) { this.artwork = artwork; } public void setCanvas(PaintCanvas canvas) { this.canvas = canvas; } public void setCurColor(CPColor color) { if (!curColor.isEqual(color)) { artwork.setForegroundColor(color.getRgb()); curColor.copyFrom(color); for (Object l : colorListeners) ((ICPColorListener) l).newColor(color); } } public CPColor getCurColor() { return (CPColor) curColor.clone(); } public int getCurColorRgb() { return curColor.getRgb(); } public void setCurColorRgb(int color) { CPColor col = new CPColor(color); setCurColor(col); } public void setBrushSize(int size) { curBrush.size = Math.max(1, Math.min(200, size)); callToolListeners(); } public int getBrushSize() { return curBrush.size; } public void setAlpha(int alpha) { curBrush.alpha = alpha; callToolListeners(); } public int getAlpha() { return curBrush.alpha; } public void setTool(CPBrushInfo tool) { setMode(M_DRAW); curBrush = tool; artwork.setBrush(tool); callToolListeners(); } public CPBrushInfo getBrushInfo() { return curBrush; } public void setMode(int mode) { curMode = mode; callModeListeners(); } public void addColorListener(ICPColorListener listener) { colorListeners.addLast(listener); } public void addToolListener(ICPToolListener listener) { toolListeners.addLast(listener); } public void callToolListeners() { for (ICPToolListener l : toolListeners) l.newTool(curBrush.toolNb, curBrush); } public void addModeListener(ICPModeListener listener) { modeListeners.addLast(listener); } public void callModeListeners() { for (ICPModeListener l : modeListeners) l.modeChange(curMode); } public void addViewListener(ICPViewListener listener) { viewListeners.addLast(listener); } public void callViewListeners(CPViewInfo info) { for (ICPViewListener l : viewListeners) l.viewChange(info); } public void addCPEventListener(ICPEventListener listener) { cpEventListeners.addLast(listener); } public void callCPEventListeners() { for (ICPEventListener l : cpEventListeners) l.cpEvent(); } byte[] getPngData(Bitmap img) { Bitmap.Config imageType = Bitmap.Config.ARGB_8888; Bitmap bi = Bitmap.createBitmap(img.getWidth(), img.getHeight(), imageType); ByteArrayOutputStream pngFileStream = new ByteArrayOutputStream(1024); bi.compress(CompressFormat.PNG, 100, pngFileStream); byte[] pngData = pngFileStream.toByteArray(); return pngData; } public Bitmap loadImage(String imageName) { Bitmap img = imageCache.get(imageName); if (img == null) { try { ClassLoader loader = getClass().getClassLoader(); @SuppressWarnings({ "unused", "rawtypes" }) Class[] classes = { Bitmap.class }; URL url = loader.getResource("images/" + imageName); img = BitmapFactory.decodeFile(url.toString()); } catch (Throwable t) { } imageCache.put(imageName, img); } return img; } public CPArtwork getArtwork() { return artwork; } public boolean isRunningAsApplet() { return false; } }