blob: bd08983ba1f0dd9178a36ee5809eb995365f34ce [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.gallery3d.photoeditor.actions;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.RectF;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Vector;
/**
* Doodle that consists of a color and doodling path for drawing.
*/
public class Doodle implements Parcelable {
private final int color;
private final Path normalizedPath = new Path();
private final Vector<PointF> points = new Vector<PointF>();
/**
* Creates paint for doodles.
*/
public static Paint createPaint() {
Paint paint = new Paint(Paint.DITHER_FLAG | Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(15);
return paint;
}
public Doodle(int color, PointF startPoint) {
this.color = Color.argb(192, Color.red(color), Color.green(color), Color.blue(color));
normalizedPath.moveTo(startPoint.x, startPoint.y);
points.add(startPoint);
}
/**
* Checks if the constructed doodle path is in (0, 0, 1, 1) bounds.
*/
public boolean inBounds() {
RectF r = new RectF();
normalizedPath.computeBounds(r, false);
return r.intersects(0, 0, 1, 1);
}
/**
* Adds control points whose coordinates range from 0 to 1 to construct the doodle path.
*/
public void addControlPoint(PointF point) {
PointF last = points.lastElement();
normalizedPath.quadTo(last.x, last.y, (last.x + point.x) / 2, (last.y + point.y) / 2);
points.add(point);
}
public int getColor() {
return color;
}
public boolean isEmpty() {
return normalizedPath.isEmpty();
}
/**
* Gets the drawing path from the normalized doodle path.
*/
public void getDrawingPath(Matrix matrix, Path path) {
path.set(normalizedPath);
path.transform(matrix);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(color);
dest.writeInt(points.size());
for (PointF point : points) {
dest.writeParcelable(point, 0);
}
}
public static final Parcelable.Creator<Doodle> CREATOR = new Parcelable.Creator<Doodle>() {
@Override
public Doodle createFromParcel(Parcel source) {
int color = source.readInt();
int size = source.readInt();
if (size > 0) {
Doodle doodle = new Doodle(color, (PointF) source.readParcelable(null));
for (int i = 1; i < size; i++) {
doodle.addControlPoint((PointF) source.readParcelable(null));
}
return doodle;
}
return new Doodle(color, new PointF(0, 0));
}
@Override
public Doodle[] newArray(int size) {
return new Doodle[size];
}};
}