/* 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.engine; public class CPBrushInfo implements Cloneable { // Stroke modes public static final int SM_FREEHAND = 0; public static final int SM_LINE = 1; public static final int SM_BEZIER = 2; // Brush dab types public static final int B_ROUND_PIXEL = 0; public static final int B_ROUND_AA = 1; public static final int B_ROUND_AIRBRUSH = 2; public static final int B_SQUARE_PIXEL = 3; public static final int B_SQUARE_AA = 4; // painting modes public static final int M_PAINT = 0; public static final int M_ERASE = 1; public static final int M_DODGE = 2; public static final int M_BURN = 3; public static final int M_WATER = 4; public static final int M_BLUR = 5; public static final int M_SMUDGE = 6; public static final int M_OIL = 7; // Brush settings public int toolNb; public int size, alpha; public boolean isAA, isAirbrush; public float minSpacing, spacing; public boolean pressureSize, pressureAlpha; public int type, paintMode; public int strokeMode = SM_FREEHAND; public float resat = 1f, bleed = 0f; public float texture = 1f; public boolean pressureScattering = false; public float scattering = 0.f, curScattering; public float squeeze = 0f, curSqueeze; public float angle = (float) Math.PI, curAngle; public float smoothing = 0f; // Current brush setting (once tablet pressure and stuff is applied) public float curSize; public int curAlpha; private String name = ""; public CPBrushInfo() { } public CPBrushInfo(int toolNb, int size, int alpha, boolean isAA, boolean isAirbrush, float minSpacing, float spacing, boolean pressureSize, boolean pressureAlpha, int brushType, int paintMode, float resat, float bleed) { this.toolNb = toolNb; this.size = size; this.alpha = alpha; this.isAA = isAA; // I don't know why it is needed to pass from constructor. this.isAirbrush = isAirbrush; // This one too. this.minSpacing = minSpacing; this.spacing = spacing; this.pressureSize = pressureSize; this.pressureAlpha = pressureAlpha; type = brushType; this.paintMode = paintMode; this.resat = resat; this.bleed = bleed; } public CPBrushInfo(int toolNb, int size, int alpha, float minSpacing, float spacing, boolean pressureSize, boolean pressureAlpha, int brushType, int paintMode, float resat, float bleed) { this.toolNb = toolNb; this.size = size; this.alpha = alpha; isAA = brushType == B_ROUND_AA || brushType == B_SQUARE_AA; isAirbrush = brushType == B_ROUND_AIRBRUSH; this.minSpacing = minSpacing; this.spacing = spacing; this.pressureSize = pressureSize; this.pressureAlpha = pressureAlpha; type = brushType; this.paintMode = paintMode; this.resat = resat; this.bleed = bleed; } public CPBrushInfo setName(String name) { this.name = name; return this; } public String getName() { return name; } public void applyPressure(float pressure) { // FIXME: no variable size for smudge and oil :( if (pressureSize && paintMode != M_SMUDGE && paintMode != M_OIL) curSize = Math.max(.1f, size * pressure); else curSize = Math.max(.1f, size); // FIXME: what is the point of doing that? if (curSize > 16) curSize = (int) curSize; curAlpha = pressureAlpha ? (int) (alpha * pressure) : alpha; curSqueeze = squeeze; curAngle = angle; curScattering = scattering * curSize * (pressureScattering ? pressure : 1.f); // tests // curScattering = scattering * pressure; // curSqueeze = squeeze * pressure; // curAngle = angle * pressure; } public CPBrushInfo clone(int newNB) { try { CPBrushInfo clonedObj = (CPBrushInfo) super.clone(); clonedObj.toolNb = newNB; return clonedObj; } catch (Exception ignored) { return null; } } @Override public Object clone() { try { return super.clone(); } catch (Exception ignored) { return null; } } }