diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..39fb081
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..96cc43e
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..7ac24c7
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml
new file mode 100644
index 0000000..57927c5
--- /dev/null
+++ b/.idea/markdown-navigator/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..b0a270f
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..92fb2f5
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/acrylic/.gitignore b/acrylic/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/acrylic/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/acrylic/build.gradle b/acrylic/build.gradle
new file mode 100644
index 0000000..8aad7e4
--- /dev/null
+++ b/acrylic/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 25
+ buildToolsVersion "25.0.2"
+
+ defaultConfig {
+ applicationId "anupam.acrylic"
+ minSdkVersion 15
+ targetSdkVersion 25
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+ compile 'com.android.support:appcompat-v7:25.1.1'
+ testCompile 'junit:junit:4.12'
+}
diff --git a/acrylic/proguard-rules.pro b/acrylic/proguard-rules.pro
new file mode 100644
index 0000000..82c750e
--- /dev/null
+++ b/acrylic/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Edmur\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/acrylic/src/androidTest/java/anupam/acrylic/ExampleInstrumentedTest.java b/acrylic/src/androidTest/java/anupam/acrylic/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..06cd55b
--- /dev/null
+++ b/acrylic/src/androidTest/java/anupam/acrylic/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package anupam.acrylic;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("anupam.acrylic", appContext.getPackageName());
+ }
+}
diff --git a/acrylic/src/main/AndroidManifest.xml b/acrylic/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e244c56
--- /dev/null
+++ b/acrylic/src/main/AndroidManifest.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acrylic/src/main/java/anupam/acrylic/AboutActivity.java b/acrylic/src/main/java/anupam/acrylic/AboutActivity.java
new file mode 100644
index 0000000..26d3bb9
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/AboutActivity.java
@@ -0,0 +1,21 @@
+package anupam.acrylic;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.text.Html;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.widget.TextView;
+
+public class AboutActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_about);
+ Spanned htmlText = Html.fromHtml(getResources().getString(R.string.about_description));
+ TextView aboutTextView = (TextView) findViewById(R.id.aboutTextView);
+ aboutTextView.setText(htmlText);
+ aboutTextView.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/ColorPickerDialog.java b/acrylic/src/main/java/anupam/acrylic/ColorPickerDialog.java
new file mode 100644
index 0000000..947b52f
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/ColorPickerDialog.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2014 Valerio Bozzolan
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+*/
+
+package anupam.acrylic;
+
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.SweepGradient;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+
+@SuppressLint("ClickableViewAccessibility")
+public class ColorPickerDialog extends Dialog {
+
+ private OnColorChangedListener mListener;
+ private int mInitialColor;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ OnColorChangedListener l = new OnColorChangedListener() {
+ public void colorChanged(int color) {
+ mListener.colorChanged(color);
+ dismiss();
+ }
+ };
+
+ setContentView(new ColorPickerView(getContext(), l, mInitialColor));
+ setTitle(R.string.pick_color);
+ }
+
+ public interface OnColorChangedListener {
+ void colorChanged(int color);
+ }
+
+ private static class ColorPickerView extends View {
+ private static final int CENTER_X = 230;
+ private static final int CENTER_Y = 230;
+ private static final int CENTER_RADIUS = 100;
+ private Paint mPaint;
+ private Paint mCenterPaint;
+ private final int[] mColors;
+ private OnColorChangedListener mListener;
+ private boolean mTrackingCenter;
+ private boolean mHighlightCenter;
+
+ ColorPickerView(Context c, OnColorChangedListener l, int color) {
+ super(c);
+ mListener = l;
+ mColors = new int[] {
+ 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
+ 0xFFFFFF00, 0xFFFF0000
+ };
+ Shader s = new SweepGradient(0, 0, mColors, null);
+
+ mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mPaint.setShader(s);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeWidth(32);
+
+ mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mCenterPaint.setColor(color);
+ mCenterPaint.setStrokeWidth(EasyPaint.DEFAULT_BRUSH_SIZE);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ float r = CENTER_X - mPaint.getStrokeWidth()*0.5f - 30;
+
+ canvas.translate(CENTER_X, CENTER_X);
+
+ canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
+ canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);
+
+ if (mTrackingCenter) {
+ int c = mCenterPaint.getColor();
+ mCenterPaint.setStyle(Paint.Style.STROKE);
+
+ if (mHighlightCenter) {
+ mCenterPaint.setAlpha(0xFF);
+ } else {
+ mCenterPaint.setAlpha(0x80);
+ }
+ canvas.drawCircle(0, 0,
+ CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
+ mCenterPaint);
+
+ mCenterPaint.setStyle(Paint.Style.FILL);
+ mCenterPaint.setColor(c);
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
+ }
+
+ private int floatToByte(float x) {
+ int n = java.lang.Math.round(x);
+ return n;
+ }
+ private int pinToByte(int n) {
+ if (n < 0) {
+ n = 0;
+ } else if (n > 255) {
+ n = 255;
+ }
+ return n;
+ }
+
+ private int ave(int s, int d, float p) {
+ return s + java.lang.Math.round(p * (d - s));
+ }
+
+ private int interpColor(int colors[], float unit) {
+ if (unit <= 0) {
+ return colors[0];
+ }
+ if (unit >= 1) {
+ return colors[colors.length - 1];
+ }
+
+ float p = unit * (colors.length - 1);
+ int i = (int)p;
+ p -= i;
+
+ // now p is just the fractional part [0...1) and i is the index
+ int c0 = colors[i];
+ int c1 = colors[i+1];
+ int a = ave(Color.alpha(c0), Color.alpha(c1), p);
+ int r = ave(Color.red(c0), Color.red(c1), p);
+ int g = ave(Color.green(c0), Color.green(c1), p);
+ int b = ave(Color.blue(c0), Color.blue(c1), p);
+
+ return Color.argb(a, r, g, b);
+ }
+
+ @SuppressWarnings("unused")
+ private int rotateColor(int color, float rad) {
+ float deg = rad * 180 / 3.1415927f;
+ int r = Color.red(color);
+ int g = Color.green(color);
+ int b = Color.blue(color);
+
+ ColorMatrix cm = new ColorMatrix();
+ ColorMatrix tmp = new ColorMatrix();
+
+ cm.setRGB2YUV();
+ tmp.setRotate(0, deg);
+ cm.postConcat(tmp);
+ tmp.setYUV2RGB();
+ cm.postConcat(tmp);
+
+ final float[] a = cm.getArray();
+
+ int ir = floatToByte(a[0] * r + a[1] * g + a[2] * b);
+ int ig = floatToByte(a[5] * r + a[6] * g + a[7] * b);
+ int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);
+
+ return Color.argb(Color.alpha(color), pinToByte(ir),
+ pinToByte(ig), pinToByte(ib));
+ }
+
+ private static final float PI = 3.1415926f;
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX() - CENTER_X;
+ float y = event.getY() - CENTER_Y;
+ boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mTrackingCenter = inCenter;
+ if (inCenter) {
+ mHighlightCenter = true;
+ invalidate();
+ break;
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (mTrackingCenter) {
+ if (mHighlightCenter != inCenter) {
+ mHighlightCenter = inCenter;
+ invalidate();
+ }
+ } else {
+ float angle = (float)java.lang.Math.atan2(y, x);
+ // need to turn angle [-PI ... PI] into unit [0....1]
+ float unit = angle/(2*PI);
+ if (unit < 0) {
+ unit += 1;
+ }
+ mCenterPaint.setColor(interpColor(mColors, unit));
+ invalidate();
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mTrackingCenter) {
+ if (inCenter) {
+ mListener.colorChanged(mCenterPaint.getColor());
+ }
+ mTrackingCenter = false; // so we draw w/o halo
+ invalidate();
+ }
+ break;
+ }
+ return true;
+ }
+ }
+
+ public ColorPickerDialog(Context context,
+ OnColorChangedListener listener,
+ int initialColor) {
+ super(context);
+
+ mListener = listener;
+ mInitialColor = initialColor;
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/EasyPaint.java b/acrylic/src/main/java/anupam/acrylic/EasyPaint.java
new file mode 100644
index 0000000..cc29d57
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/EasyPaint.java
@@ -0,0 +1,593 @@
+/*
+ * Copyright (C) 2014, 2016 Valerio Bozzolan & James Dearing (TheOpenSourceNinja)
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+
+package anupam.acrylic;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Calendar;
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapShader;
+import android.graphics.BlurMaskFilter;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.EmbossMaskFilter;
+import android.graphics.MaskFilter;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Point;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Shader;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.MediaStore;
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+import android.renderscript.ScriptIntrinsicBlur;
+import android.util.Log;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SeekBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+@SuppressLint("ClickableViewAccessibility")
+public class EasyPaint extends GraphicsActivity implements
+ ColorPickerDialog.OnColorChangedListener {
+
+ public static int DEFAULT_BRUSH_SIZE = 10;
+ private static int MAX_POINTERS = 10;
+ private static final float TOUCH_TOLERANCE = 4;
+
+ private Paint mPaint;
+ private MaskFilter mEmboss;
+ private MaskFilter mBlur;
+ private static final int CHOOSE_IMAGE = 0;
+ private MyView contentView;
+
+ private boolean waitingForBackgroundColor = false; //If true and colorChanged() is called, fill the background, else mPaint.setColor()
+ private boolean extractingColor = false; //If this is true, the next touch event should extract a color rather than drawing a line.
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // it removes the title from the actionbar(more space for icons?)
+ this.getActionBar().setDisplayShowTitleEnabled(false);
+
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ contentView = new MyView( this );
+ setContentView( contentView );
+
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+ mPaint.setColor(Color.GREEN);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ mPaint.setStrokeWidth(DEFAULT_BRUSH_SIZE);
+
+ // Where did these magic numbers come from? What do they mean? Can I change them? ~TheOpenSourceNinja
+ // Absolutely random numbers in order to see the emboss. asd! ~Valerio
+ mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);
+
+ mBlur = new BlurMaskFilter(5, BlurMaskFilter.Blur.NORMAL);
+
+ if (isFirstTime()) {
+ AlertDialog.Builder alert = new AlertDialog.Builder(this);
+
+ alert.setTitle(R.string.app_name);
+ alert.setMessage(R.string.app_description);
+ alert.setNegativeButton(R.string.continue_fuck,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ Toast.makeText(getApplicationContext(),
+ R.string.here_is_your_canvas,
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ alert.show();
+ } else {
+ Toast.makeText(getApplicationContext(),
+ R.string.here_is_your_canvas, Toast.LENGTH_SHORT).show();
+ }
+
+ loadFromIntents();
+ }
+
+ @Override
+ public void onBackPressed() {
+
+ super.onBackPressed();
+ return;
+ }
+ public void colorChanged(int color) {
+ if( waitingForBackgroundColor ) {
+ waitingForBackgroundColor = false;
+ contentView.mBitmapBackground.eraseColor( color );
+ //int[] colors = new int[ 1 ];
+ //colors[ 0 ] = color;
+ //contentView.mBitmapBackground = Bitmap.createBitmap( colors, contentView.mBitmapBackground.getWidth(), contentView.mBitmapBackground.getHeight(), contentView.mBitmapBackground.getConfig() );
+ } else {
+ mPaint.setColor( color );
+ }
+ }
+
+ public class MyView extends View {
+
+ public Bitmap mBitmap;
+ private Bitmap mBitmapBackground;
+ private Canvas mCanvas;
+ private Paint mBitmapPaint;
+ private MultiLinePathManager multiLinePathManager;
+
+ private class LinePath extends Path {
+ private Integer idPointer;
+ private float lastX;
+ private float lastY;
+
+ LinePath() {
+ this.idPointer = null;
+ }
+
+ public float getLastX() {
+ return lastX;
+ }
+
+ public float getLastY() {
+ return lastY;
+ }
+
+ public void touchStart(float x, float y) {
+ this.reset();
+ this.moveTo(x, y);
+ this.lastX = x;
+ this.lastY = y;
+ }
+
+ public void touchMove(float x, float y) {
+ float dx = Math.abs(x - lastX);
+ float dy = Math.abs(y - lastY);
+ if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
+ this.quadTo(lastX, lastY, (x + lastX) / 2, (y + lastY) / 2);
+ lastX = x;
+ lastY = y;
+ }
+ }
+
+ public boolean isDisassociatedFromPointer() {
+ return idPointer == null;
+ }
+
+ public boolean isAssociatedToPointer(int idPointer) {
+ return this.idPointer != null
+ && (int) this.idPointer == idPointer;
+ }
+
+ public void disassociateFromPointer() {
+ idPointer = null;
+ }
+
+ public void associateToPointer(int idPointer) {
+ this.idPointer = idPointer;
+ }
+ }
+
+ private class MultiLinePathManager {
+ public LinePath[] superMultiPaths;
+
+ MultiLinePathManager(int maxPointers) {
+ superMultiPaths = new LinePath[maxPointers];
+ for (int i = 0; i < maxPointers; i++) {
+ superMultiPaths[i] = new LinePath();
+ }
+ }
+
+ public LinePath findLinePathFromPointer(int idPointer) {
+ for (LinePath superMultiPath : superMultiPaths) {
+ if (superMultiPath.isAssociatedToPointer(idPointer)) {
+ return superMultiPath;
+ }
+ }
+ return null;
+ }
+
+ public LinePath addLinePathWithPointer(int idPointer) {
+ for (LinePath superMultiPath : superMultiPaths) {
+ if (superMultiPath.isDisassociatedFromPointer()) {
+ superMultiPath.associateToPointer(idPointer);
+ return superMultiPath;
+ }
+ }
+ return null;
+ }
+ }
+
+ public MyView(Context c) {
+ super(c);
+
+ setId(R.id.CanvasId);
+ Display display = getWindowManager().getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+ mBitmapBackground = Bitmap.createBitmap(size.x, size.y, Bitmap.Config.ARGB_8888);
+ mBitmap = Bitmap.createBitmap(size.x, size.y,
+ Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+ multiLinePathManager = new MultiLinePathManager(MAX_POINTERS);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ canvas.drawColor(0xFFFFFFFF);
+ canvas.drawBitmap( mBitmapBackground, 0, 0, new Paint() );
+ canvas.drawBitmap( mBitmap, 0, 0, mBitmapPaint );
+ for (int i = 0; i < multiLinePathManager.superMultiPaths.length; i++) {
+ canvas.drawPath(multiLinePathManager.superMultiPaths[i], mPaint);
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ LinePath linePath;
+ int index;
+ int id;
+ int eventMasked = event.getActionMasked();
+ switch (eventMasked) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_POINTER_DOWN: {
+ index = event.getActionIndex( );
+ id = event.getPointerId( index );
+
+ if( extractingColor ) { //If the user chose the 'extract color' menu option, the touch event indicates where they want to extract the color from.
+ extractingColor = false;
+
+ View v = findViewById(R.id.CanvasId);
+ v.setDrawingCacheEnabled(true);
+ Bitmap cachedBitmap = v.getDrawingCache();
+
+ int newColor = cachedBitmap.getPixel( Math.round( event.getX( index ) ), Math.round( event.getY( index ) ) );
+
+ v.destroyDrawingCache();
+ colorChanged( newColor );
+
+ Toast.makeText(getApplicationContext(),
+ R.string.color_extracted,
+ Toast.LENGTH_SHORT).show();
+ } else {
+
+ linePath = multiLinePathManager.addLinePathWithPointer( id );
+ if( linePath != null ) {
+ linePath.touchStart( event.getX( index ), event.getY( index ) );
+ } else {
+ Log.e( "anupam", "Too many fingers!" );
+ }
+ }
+
+ break;
+ }
+ case MotionEvent.ACTION_MOVE:
+ for (int i = 0; i < event.getPointerCount(); i++) {
+ id = event.getPointerId(i);
+ index = event.findPointerIndex(id);
+ linePath = multiLinePathManager.findLinePathFromPointer(id);
+ if (linePath != null) {
+ linePath.touchMove(event.getX(index), event.getY(index));
+ }
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_POINTER_UP:
+ case MotionEvent.ACTION_CANCEL:
+ index = event.getActionIndex();
+ id = event.getPointerId(index);
+ linePath = multiLinePathManager.findLinePathFromPointer(id);
+ if (linePath != null) {
+ linePath.lineTo(linePath.getLastX(), linePath.getLastY());
+
+ // Commit the path to our offscreen
+ mCanvas.drawPath(linePath, mPaint);
+
+ // Kill this so we don't double draw
+ linePath.reset();
+
+ // Allow this LinePath to be associated to another idPointer
+ linePath.disassociateFromPointer();
+ }
+ break;
+ }
+ invalidate();
+ return true;
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.main, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ mPaint.setXfermode(null);
+ mPaint.setAlpha(0xFF);
+
+ switch (item.getItemId()) {
+ case R.id.normal_brush_menu:
+ mPaint.setShader( null );
+ mPaint.setMaskFilter(null);
+ return true;
+ case R.id.color_menu:
+ new ColorPickerDialog(this, this, mPaint.getColor()).show();
+ return true;
+ case R.id.emboss_menu:
+ mPaint.setShader( null );
+ mPaint.setMaskFilter(mEmboss);
+ return true;
+
+ case R.id.blur_menu:
+ mPaint.setShader( null );
+ mPaint.setMaskFilter(mBlur);
+ return true;
+ case R.id.size_menu: {
+ LayoutInflater inflater = ( LayoutInflater ) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
+ View layout = inflater.inflate( R.layout.brush,
+ ( ViewGroup ) findViewById( R.id.root ) );
+ AlertDialog.Builder builder = new AlertDialog.Builder( this )
+ .setView( layout );
+ builder.setTitle( R.string.choose_width );
+ final AlertDialog alertDialog = builder.create( );
+ alertDialog.show( );
+ SeekBar sb = ( SeekBar ) layout.findViewById( R.id.brushSizeSeekBar );
+ sb.setProgress( getStrokeSize( ) );
+ final TextView txt = ( TextView ) layout
+ .findViewById( R.id.sizeValueTextView );
+ txt.setText( String.format(
+ getResources( ).getString( R.string.your_selected_size_is ),
+ getStrokeSize( ) + 1 ) );
+ sb.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener( ) {
+ public void onProgressChanged( SeekBar seekBar,
+ final int progress, boolean fromUser ) {
+ // Do something here with new value
+ mPaint.setStrokeWidth( progress );
+ txt.setText( String.format(
+ getResources( ).getString(
+ R.string.your_selected_size_is ), progress + 1 ) );
+ }
+
+ @Override
+ public void onStartTrackingTouch( SeekBar seekBar ) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void onStopTrackingTouch( SeekBar seekBar ) {
+ // TODO Auto-generated method stub
+ }
+ } );
+ return true;
+ }
+ case R.id.erase_menu: {
+ LayoutInflater inflater_e = ( LayoutInflater ) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
+ View layout_e = inflater_e.inflate( R.layout.brush,
+ ( ViewGroup ) findViewById( R.id.root ) );
+ AlertDialog.Builder builder_e = new AlertDialog.Builder( this )
+ .setView( layout_e );
+ builder_e.setTitle( R.string.choose_width );
+ final AlertDialog alertDialog_e = builder_e.create( );
+ alertDialog_e.show( );
+ SeekBar sb_e = ( SeekBar ) layout_e.findViewById( R.id.brushSizeSeekBar );
+ sb_e.setProgress( getStrokeSize( ) );
+ final TextView txt_e = ( TextView ) layout_e
+ .findViewById( R.id.sizeValueTextView );
+ txt_e.setText( String.format(
+ getResources( ).getString( R.string.your_selected_size_is ),
+ getStrokeSize( ) + 1 ) );
+ sb_e.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener( ) {
+ public void onProgressChanged( SeekBar seekBar,
+ final int progress, boolean fromUser ) {
+ // Do something here with new value
+ mPaint.setStrokeWidth( progress );
+ txt_e.setText( String.format(
+ getResources( ).getString(
+ R.string.your_selected_size_is ), progress + 1 ) );
+ }
+
+ public void onStartTrackingTouch( SeekBar seekBar ) {
+ // TODO Auto-generated method stub
+ }
+
+ public void onStopTrackingTouch( SeekBar seekBar ) {
+ // TODO Auto-generated method stub
+ }
+ } );
+ mPaint.setShader( null );
+ mPaint.setXfermode( new PorterDuffXfermode( Mode.CLEAR ) );
+ return true;
+ }
+ case R.id.clear_all_menu: {
+ contentView.mBitmap.eraseColor( Color.TRANSPARENT );
+ return true;
+ }
+ case R.id.save_menu:
+ takeScreenshot(true);
+ break;
+ case R.id.fill_background_with_color: {
+ waitingForBackgroundColor = true;
+ new ColorPickerDialog( this, this, contentView.mBitmapBackground.getPixel( 0, 0 ) ).show();
+ return true;
+ }
+ case R.id.about_menu:
+ startActivity(new Intent(this, AboutActivity.class));
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * This takes the screenshot of the whole screen. Is this a good thing?
+ */
+ private File takeScreenshot(boolean showToast) {
+ View v = findViewById(R.id.CanvasId);
+ v.setDrawingCacheEnabled(true);
+ Bitmap cachedBitmap = v.getDrawingCache();
+ Bitmap copyBitmap = cachedBitmap.copy(Bitmap.Config.RGB_565, true);
+ v.destroyDrawingCache();
+ FileOutputStream output = null;
+ File file = null;
+ try {
+ File path = Places.getScreenshotFolder();
+ Calendar cal = Calendar.getInstance();
+
+ file = new File(path,
+
+ cal.get(Calendar.YEAR) + "_" + (1 + cal.get(Calendar.MONTH)) + "_"
+ + cal.get(Calendar.DAY_OF_MONTH) + "_"
+ + cal.get(Calendar.HOUR_OF_DAY) + "_"
+ + cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)
+ + ".png");
+ output = new FileOutputStream(file);
+ copyBitmap.compress(CompressFormat.PNG, 100, output);
+ } catch (FileNotFoundException e) {
+ file = null;
+ e.printStackTrace();
+ } finally {
+ if (output != null) {
+ try {
+ output.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ if (file != null) {
+ if (showToast)
+ Toast.makeText(
+ getApplicationContext(),
+ String.format(
+ getResources().getString(
+ R.string.saved_your_location_to),
+ file.getAbsolutePath()), Toast.LENGTH_LONG)
+ .show();
+ // sending a broadcast to the media scanner so it will scan the new
+ // screenshot.
+ Intent requestScan = new Intent(
+ Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
+ requestScan.setData(Uri.fromFile(file));
+ sendBroadcast(requestScan);
+
+ return file;
+ } else {
+ return null;
+ }
+ }
+
+ private boolean isFirstTime() {
+ SharedPreferences preferences = getPreferences(MODE_PRIVATE);
+ boolean ranBefore = preferences.getBoolean("RanBefore", false);
+ if (!ranBefore) {
+ // first time
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putBoolean("RanBefore", true);
+ editor.commit();
+ }
+ return !ranBefore;
+ }
+
+ private int getStrokeSize() {
+ return (int) mPaint.getStrokeWidth();
+ }
+
+ public void onActivityResult( int requestCode, int resultCode, Intent data ) {
+ super.onActivityResult( requestCode, resultCode, data );
+
+ if( resultCode != RESULT_CANCELED ) { //"The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation." (quote from https://developer.android.com/reference/android/app/Activity.html#onActivityResult(int,%20int,%20android.content.Intent) )
+ switch( requestCode ) {
+ case CHOOSE_IMAGE: {
+ setBackgroundUri( data.getData() );
+ }
+ }
+ }
+ }
+
+ public void setBackgroundUri(Uri uri) {
+ if (uri == null) {
+ return;
+ }
+
+ try {
+ //I don't like loading both full-sized and reduced-size copies of the image (the larger copy can use a lot of memory), but I couldn't find any other way to do this.
+ Bitmap fullsize = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
+ Bitmap resized = Bitmap.createScaledBitmap(fullsize, contentView.mBitmap.getWidth(), contentView.mBitmap.getHeight(), true);
+ contentView.mBitmapBackground = resized;
+ //contentView.mCanvas = new Canvas( contentView.mBitmapBackground );
+ } catch (IOException exception) {
+ //TODO: How should we handle this exception?
+ }
+ }
+
+ public void loadFromIntents() {
+ Intent intent = getIntent();
+ String action = intent.getAction();
+ String type = intent.getType();
+ System.out.println("Intentoso " + action + " type " + type);
+ if(Intent.ACTION_SEND.equals(action) && type != null) {
+ if( type.startsWith("image/") ) {
+ setBackgroundUri( (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM) );
+ }
+
+ }
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/GraphicsActivity.java b/acrylic/src/main/java/anupam/acrylic/GraphicsActivity.java
new file mode 100644
index 0000000..ebd8bb9
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/GraphicsActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2014 Valerio Bozzolan
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+*/
+
+package anupam.acrylic;
+
+import android.app.Activity;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+
+class GraphicsActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.setRequestedOrientation(
+ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ }
+
+ @SuppressWarnings("unused")
+ @Override
+ public void setContentView(View view) {
+ if (false) { // set to true to test Picture
+ ViewGroup vg = new PictureLayout(this);
+ vg.addView(view);
+ view = vg;
+ }
+ super.setContentView(view);
+ }
+}
+
diff --git a/acrylic/src/main/java/anupam/acrylic/MainActivity.java b/acrylic/src/main/java/anupam/acrylic/MainActivity.java
new file mode 100644
index 0000000..3ddbec4
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/MainActivity.java
@@ -0,0 +1,13 @@
+package anupam.acrylic;
+
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/PictureLayout.java b/acrylic/src/main/java/anupam/acrylic/PictureLayout.java
new file mode 100644
index 0000000..26a0037
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/PictureLayout.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2014 Valerio Bozzolan
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+*/
+
+package anupam.acrylic;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+
+public class PictureLayout extends ViewGroup {
+ private static String error = "PictureLayout can host only one direct child";
+ private final Picture mPicture = new Picture();
+
+ public PictureLayout(Context context) {
+ super(context);
+ }
+
+ public PictureLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void addView(View child) {
+ if (getChildCount() > 1) {
+ throw new IllegalStateException(error);
+ }
+
+ super.addView(child);
+ }
+
+ @Override
+ public void addView(View child, int index) {
+ if (getChildCount() > 1) {
+ throw new IllegalStateException(error);
+ }
+
+ super.addView(child, index);
+ }
+
+ @Override
+ public void addView(View child, LayoutParams params) {
+ if (getChildCount() > 1) {
+ throw new IllegalStateException(error);
+ }
+
+ super.addView(child, params);
+ }
+
+ @Override
+ public void addView(View child, int index, LayoutParams params) {
+ if (getChildCount() > 1) {
+ throw new IllegalStateException(error);
+ }
+
+ super.addView(child, index, params);
+ }
+
+ @Override
+ protected LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int count = getChildCount();
+
+ int maxHeight = 0;
+ int maxWidth = 0;
+
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ measureChild(child, widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+
+ maxWidth += getPaddingLeft() + getPaddingRight();
+ maxHeight += getPaddingTop() + getPaddingBottom();
+
+ Drawable drawable = getBackground();
+ if (drawable != null) {
+ maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
+ maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
+ }
+
+ setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
+ resolveSize(maxHeight, heightMeasureSpec));
+ }
+
+ private void drawPict(Canvas canvas, int x, int y, int w, int h,
+ float sx, float sy) {
+ canvas.save();
+ canvas.translate(x, y);
+ canvas.clipRect(0, 0, w, h);
+ canvas.scale(0.5f, 0.5f);
+ canvas.scale(sx, sy, w, h);
+ canvas.drawPicture(mPicture);
+ canvas.restore();
+ }
+
+ @SuppressWarnings("unused")
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
+ mPicture.endRecording();
+
+ int x = getWidth()/2;
+ int y = getHeight()/2;
+
+ if (false) {
+ canvas.drawPicture(mPicture);
+ } else {
+ drawPict(canvas, 0, 0, x, y, 1, 1);
+ drawPict(canvas, x, 0, x, y, -1, 1);
+ drawPict(canvas, 0, y, x, y, 1, -1);
+ drawPict(canvas, x, y, x, y, -1, -1);
+ }
+ }
+
+ @Override
+ public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
+ location[0] = getLeft();
+ location[1] = getTop();
+ dirty.set(0, 0, getWidth(), getHeight());
+ return getParent();
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ final int count = super.getChildCount();
+
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final int childLeft = getPaddingLeft();
+ final int childTop = getPaddingTop();
+ child.layout(childLeft, childTop,
+ childLeft + child.getMeasuredWidth(),
+ childTop + child.getMeasuredHeight());
+
+ }
+ }
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/Places.java b/acrylic/src/main/java/anupam/acrylic/Places.java
new file mode 100644
index 0000000..2a7c690
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/Places.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2014 Valerio Bozzolan
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+*/
+
+package anupam.acrylic;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.os.Environment;
+
+public class Places {
+ public static File getScreenshotFolder() {
+ File path = new File(Environment.getExternalStorageDirectory(),
+ "/Acrylic Paint/");
+ path.mkdirs();
+
+ return path;
+ }
+
+ public static File getCameraTempFolder() {
+ File path = new File(Environment.getExternalStorageDirectory(),
+ "/Acrylic Paint/Temp/");
+ path.mkdirs();
+ // this folder should not be scanned
+ File noScanning = new File(path, ".nomedia");
+ if (!noScanning.exists())
+ try {
+ noScanning.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return path;
+ }
+
+ public static File getCameraTempFile() {
+ return new File(getCameraTempFolder(), "temp.jpg");
+ }
+}
diff --git a/acrylic/src/main/java/anupam/acrylic/Splash.java b/acrylic/src/main/java/anupam/acrylic/Splash.java
new file mode 100644
index 0000000..10605ca
--- /dev/null
+++ b/acrylic/src/main/java/anupam/acrylic/Splash.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2014 Valerio Bozzolan
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+
+package anupam.acrylic;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import anupam.acrylic.R;
+
+public class Splash extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // TODO Auto-generated method stub
+ super.onCreate(savedInstanceState);
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ setContentView(R.layout.main);
+
+ Thread t = new Thread() {
+
+ public void run() {
+ try {
+ Thread.sleep(1000);
+
+ startActivity(new Intent().setClassName("anupam.acrylic",
+ "anupam.acrylic.EasyPaint"));
+ finish();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+ t.start();
+ }
+}
diff --git a/acrylic/src/main/res/drawable-hdpi/about.png b/acrylic/src/main/res/drawable-hdpi/about.png
new file mode 100644
index 0000000..f92af44
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/about.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/blur.png b/acrylic/src/main/res/drawable-hdpi/blur.png
new file mode 100644
index 0000000..3f6ae20
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/blur.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/clear_all.png b/acrylic/src/main/res/drawable-hdpi/clear_all.png
new file mode 100644
index 0000000..2b525fb
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/clear_all.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/color.png b/acrylic/src/main/res/drawable-hdpi/color.png
new file mode 100644
index 0000000..0b4203d
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/color.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/emboss.png b/acrylic/src/main/res/drawable-hdpi/emboss.png
new file mode 100644
index 0000000..81d3eca
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/emboss.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/erase.png b/acrylic/src/main/res/drawable-hdpi/erase.png
new file mode 100644
index 0000000..277b040
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/erase.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/extract_color.png b/acrylic/src/main/res/drawable-hdpi/extract_color.png
new file mode 100644
index 0000000..ab02815
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/extract_color.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/fill_background_with_color.png b/acrylic/src/main/res/drawable-hdpi/fill_background_with_color.png
new file mode 100644
index 0000000..9ca70d5
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/fill_background_with_color.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/ic_launcher.png b/acrylic/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..30a1010
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/import_image.png b/acrylic/src/main/res/drawable-hdpi/import_image.png
new file mode 100644
index 0000000..14bc447
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/import_image.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/save.png b/acrylic/src/main/res/drawable-hdpi/save.png
new file mode 100644
index 0000000..30d0dd2
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/save.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/share.png b/acrylic/src/main/res/drawable-hdpi/share.png
new file mode 100644
index 0000000..d4782a5
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/share.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/size.png b/acrylic/src/main/res/drawable-hdpi/size.png
new file mode 100644
index 0000000..ea423a1
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/size.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/smudge.png b/acrylic/src/main/res/drawable-hdpi/smudge.png
new file mode 100644
index 0000000..eb88cc9
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/smudge.png differ
diff --git a/acrylic/src/main/res/drawable-hdpi/splash.png b/acrylic/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 0000000..ec0651d
Binary files /dev/null and b/acrylic/src/main/res/drawable-hdpi/splash.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/about.png b/acrylic/src/main/res/drawable-mdpi/about.png
new file mode 100644
index 0000000..4174936
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/about.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/blur.png b/acrylic/src/main/res/drawable-mdpi/blur.png
new file mode 100644
index 0000000..ff288ae
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/blur.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/clear_all.png b/acrylic/src/main/res/drawable-mdpi/clear_all.png
new file mode 100644
index 0000000..8921447
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/clear_all.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/color.png b/acrylic/src/main/res/drawable-mdpi/color.png
new file mode 100644
index 0000000..dc48dc9
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/color.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/emboss.png b/acrylic/src/main/res/drawable-mdpi/emboss.png
new file mode 100644
index 0000000..641a4e5
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/emboss.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/erase.png b/acrylic/src/main/res/drawable-mdpi/erase.png
new file mode 100644
index 0000000..24d221d
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/erase.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/extract_color.png b/acrylic/src/main/res/drawable-mdpi/extract_color.png
new file mode 100644
index 0000000..8a7902a
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/extract_color.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/fill_background_with_color.png b/acrylic/src/main/res/drawable-mdpi/fill_background_with_color.png
new file mode 100644
index 0000000..e06fae0
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/fill_background_with_color.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/ic_launcher.png b/acrylic/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..5f69df3
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/import_image.png b/acrylic/src/main/res/drawable-mdpi/import_image.png
new file mode 100644
index 0000000..c63d256
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/import_image.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/save.png b/acrylic/src/main/res/drawable-mdpi/save.png
new file mode 100644
index 0000000..e4c5adc
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/save.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/share.png b/acrylic/src/main/res/drawable-mdpi/share.png
new file mode 100644
index 0000000..2e98e51
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/share.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/size.png b/acrylic/src/main/res/drawable-mdpi/size.png
new file mode 100644
index 0000000..d9921b9
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/size.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/smudge.png b/acrylic/src/main/res/drawable-mdpi/smudge.png
new file mode 100644
index 0000000..b01393a
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/smudge.png differ
diff --git a/acrylic/src/main/res/drawable-mdpi/splash.png b/acrylic/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 0000000..37caf10
Binary files /dev/null and b/acrylic/src/main/res/drawable-mdpi/splash.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/about.png b/acrylic/src/main/res/drawable-xhdpi/about.png
new file mode 100644
index 0000000..82f68cd
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/about.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/blur.png b/acrylic/src/main/res/drawable-xhdpi/blur.png
new file mode 100644
index 0000000..2a84a1a
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/blur.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/clear_all.png b/acrylic/src/main/res/drawable-xhdpi/clear_all.png
new file mode 100644
index 0000000..8927f9a
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/clear_all.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/color.png b/acrylic/src/main/res/drawable-xhdpi/color.png
new file mode 100644
index 0000000..16f2deb
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/color.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/emboss.png b/acrylic/src/main/res/drawable-xhdpi/emboss.png
new file mode 100644
index 0000000..e01c5ce
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/emboss.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/erase.png b/acrylic/src/main/res/drawable-xhdpi/erase.png
new file mode 100644
index 0000000..3ae2b80
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/erase.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/extract_color.png b/acrylic/src/main/res/drawable-xhdpi/extract_color.png
new file mode 100644
index 0000000..1daf16f
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/extract_color.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/fill_background_with_color.png b/acrylic/src/main/res/drawable-xhdpi/fill_background_with_color.png
new file mode 100644
index 0000000..50e4a97
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/fill_background_with_color.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/ic_launcher.png b/acrylic/src/main/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..6be33f0
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/import_image.png b/acrylic/src/main/res/drawable-xhdpi/import_image.png
new file mode 100644
index 0000000..6b8a298
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/import_image.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/save.png b/acrylic/src/main/res/drawable-xhdpi/save.png
new file mode 100644
index 0000000..8ed5ac9
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/save.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/share.png b/acrylic/src/main/res/drawable-xhdpi/share.png
new file mode 100644
index 0000000..1b784b0
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/share.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/size.png b/acrylic/src/main/res/drawable-xhdpi/size.png
new file mode 100644
index 0000000..b82770b
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/size.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/smudge.png b/acrylic/src/main/res/drawable-xhdpi/smudge.png
new file mode 100644
index 0000000..8c2a2c5
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/smudge.png differ
diff --git a/acrylic/src/main/res/drawable-xhdpi/splash.png b/acrylic/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 0000000..40d13f9
Binary files /dev/null and b/acrylic/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/about.png b/acrylic/src/main/res/drawable-xxhdpi/about.png
new file mode 100644
index 0000000..b90961a
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/about.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/blur.png b/acrylic/src/main/res/drawable-xxhdpi/blur.png
new file mode 100644
index 0000000..f9902fc
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/blur.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/clear_all.png b/acrylic/src/main/res/drawable-xxhdpi/clear_all.png
new file mode 100644
index 0000000..9c056c2
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/clear_all.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/color.png b/acrylic/src/main/res/drawable-xxhdpi/color.png
new file mode 100644
index 0000000..6e0fbd4
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/color.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/emboss.png b/acrylic/src/main/res/drawable-xxhdpi/emboss.png
new file mode 100644
index 0000000..eca88e9
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/emboss.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/erase.png b/acrylic/src/main/res/drawable-xxhdpi/erase.png
new file mode 100644
index 0000000..d3ecefd
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/erase.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/extract_color.png b/acrylic/src/main/res/drawable-xxhdpi/extract_color.png
new file mode 100644
index 0000000..e57533d
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/extract_color.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/fill_background_with_color.png b/acrylic/src/main/res/drawable-xxhdpi/fill_background_with_color.png
new file mode 100644
index 0000000..3b9f486
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/fill_background_with_color.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/ic_launcher.png b/acrylic/src/main/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0d4d3d
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/import_image.png b/acrylic/src/main/res/drawable-xxhdpi/import_image.png
new file mode 100644
index 0000000..0e7a716
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/import_image.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/save.png b/acrylic/src/main/res/drawable-xxhdpi/save.png
new file mode 100644
index 0000000..5ff06a3
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/save.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/share.png b/acrylic/src/main/res/drawable-xxhdpi/share.png
new file mode 100644
index 0000000..395ac79
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/share.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/size.png b/acrylic/src/main/res/drawable-xxhdpi/size.png
new file mode 100644
index 0000000..bd3b6eb
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/size.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/smudge.png b/acrylic/src/main/res/drawable-xxhdpi/smudge.png
new file mode 100644
index 0000000..2713e6f
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/smudge.png differ
diff --git a/acrylic/src/main/res/drawable-xxhdpi/splash.png b/acrylic/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 0000000..aeeee0c
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/about.png b/acrylic/src/main/res/drawable-xxxhdpi/about.png
new file mode 100644
index 0000000..e7d5690
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/about.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/actionbar_background.png b/acrylic/src/main/res/drawable-xxxhdpi/actionbar_background.png
new file mode 100644
index 0000000..7de242e
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/actionbar_background.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/blur.png b/acrylic/src/main/res/drawable-xxxhdpi/blur.png
new file mode 100644
index 0000000..968fb00
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/blur.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/clear_all.png b/acrylic/src/main/res/drawable-xxxhdpi/clear_all.png
new file mode 100644
index 0000000..72dbd22
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/clear_all.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/color.png b/acrylic/src/main/res/drawable-xxxhdpi/color.png
new file mode 100644
index 0000000..5f0728d
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/color.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/emboss.png b/acrylic/src/main/res/drawable-xxxhdpi/emboss.png
new file mode 100644
index 0000000..1b6a82e
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/emboss.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/erase.png b/acrylic/src/main/res/drawable-xxxhdpi/erase.png
new file mode 100644
index 0000000..878d319
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/erase.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/ic_launcher.png b/acrylic/src/main/res/drawable-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..a7ecb01
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/save.png b/acrylic/src/main/res/drawable-xxxhdpi/save.png
new file mode 100644
index 0000000..c18fe09
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/save.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/share.png b/acrylic/src/main/res/drawable-xxxhdpi/share.png
new file mode 100644
index 0000000..0f6d7f6
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/share.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/size.png b/acrylic/src/main/res/drawable-xxxhdpi/size.png
new file mode 100644
index 0000000..aad755e
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/size.png differ
diff --git a/acrylic/src/main/res/drawable-xxxhdpi/splash.png b/acrylic/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 0000000..68fa533
Binary files /dev/null and b/acrylic/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/acrylic/src/main/res/layout/activity_about.xml b/acrylic/src/main/res/layout/activity_about.xml
new file mode 100644
index 0000000..b16c0d7
--- /dev/null
+++ b/acrylic/src/main/res/layout/activity_about.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/acrylic/src/main/res/layout/activity_main.xml b/acrylic/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..2c1cb46
--- /dev/null
+++ b/acrylic/src/main/res/layout/activity_main.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/acrylic/src/main/res/layout/brush.xml b/acrylic/src/main/res/layout/brush.xml
new file mode 100644
index 0000000..c8994ff
--- /dev/null
+++ b/acrylic/src/main/res/layout/brush.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/acrylic/src/main/res/layout/main.xml b/acrylic/src/main/res/layout/main.xml
new file mode 100644
index 0000000..260750f
--- /dev/null
+++ b/acrylic/src/main/res/layout/main.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/acrylic/src/main/res/menu/main.xml b/acrylic/src/main/res/menu/main.xml
new file mode 100644
index 0000000..31040d9
--- /dev/null
+++ b/acrylic/src/main/res/menu/main.xml
@@ -0,0 +1,64 @@
+
+
diff --git a/acrylic/src/main/res/mipmap-hdpi/ic_launcher.png b/acrylic/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/acrylic/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/mipmap-mdpi/ic_launcher.png b/acrylic/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/acrylic/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/mipmap-xhdpi/ic_launcher.png b/acrylic/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/acrylic/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/mipmap-xxhdpi/ic_launcher.png b/acrylic/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/acrylic/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/acrylic/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
Binary files /dev/null and b/acrylic/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/acrylic/src/main/res/values-fr/strings.xml b/acrylic/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..ccd1185
--- /dev/null
+++ b/acrylic/src/main/res/values-fr/strings.xml
@@ -0,0 +1,58 @@
+
+
+
+ Acrylic Paint
+ Acrylic Paint est un logiciel libre qui libère votre créativité !\n\nAppuie sur menu pour plus d\'options.\n\nMerci à Anupam Shrivastava pour l\'idée, à Valerio Bozzolan pour avoir ressuscité le projet et au physicien Marco Gagino pour le formidable soutien. Merci à tous les contributeurs !\n\nBonne peinture :)
+ Voici ta toile. Commence à peindre !
+ Couleur
+ Gras
+ Flou
+ Taille de brosse
+ Effacer
+ Effacer tout
+ Enregistrer
+ Partager
+ À propos
+ Taille sélectionnée : %1$s
+ Taille de brosse
+ Peinture sauvegardée sous %1$s
+ Sélectionner
+ Continuer
+ OK
+ Choisir une couleur
+ Partager
+ Regardez ce que j\'ai peint avec Acrylic Paint! --- Acrylic Paint (peinture simple avec le doigt) - https://f-droid.org/app/anupam.acrylic
+ Partager comme du texte
+ Impossible de trouver une application pour partager…
+ Crayon
+ À propos
+ Appuie sur retour une nouvelle fois pour quitter !\n(en perdant tout le travail non enregistré)
+
+Acrylic Paint
+
Merci d\'utiliser Acrylic Paint! Un logiciel libre pour libérer votre créativité !
+
+
Crédits
+
Un grand merci à :
+Valerio Bozzolan pour le bon travail de relecture et d\'optimisation du code source. Il continue actuellement le travail pour cette version de AcrylicPaint.
+Marco Gagino for le restylage complet et sa grande participation !
+
+
+
Licences
+
Cette version de Acrylic Paint et son code source sont fournis par Valerio Bozzolan sous
+les termes de la licence GNU GPLv3+.
+Cette licence permet à tout monde d\'utiliser, étudier, améliorer et partager cette application par tous les moyens et pour tout usage tant que vous offrez les mêmes droits à vos utilisateurs.
+
Cette application est distribuée dans l\'espoir qu\'elle sera utile à tous, mais sans aucune garantie ; sans même la garantie implicite de
+COMMERCIALISATION ou D\'ADAPTATION A UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
+
+
Note
+
Si vous rencontrez des problèmes ou avez des idées, n\'hésitez pas à utiliser le bug tracker.
Lisez le fichier README pour plus d\'informations.
+
+
Amusez-vous bien !
+ ]]>
+
+
+
diff --git a/acrylic/src/main/res/values-it/strings.xml b/acrylic/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..2be53e6
--- /dev/null
+++ b/acrylic/src/main/res/values-it/strings.xml
@@ -0,0 +1,57 @@
+
+
+
+ Acrylic Paint è un software libero che libera la tua creatività!\n\nPremi il tasto menù per più opzioni.\n\nUn ringraziamento all\'autore originale Anupam Shrivastava, a Valerio Bozzolan per la riesumazione del progetto ed a Marco Gagino per il sostegno spaventoso. Grazie a tutti i contributori!\n\n…Divertiti! :)
+ Qui c\'è la tua tela. Inizia a colorare!
+ Colore
+ Grassetto
+ Sfocato
+ Dimensione
+ Gomma
+ Pulisci tutto
+ Salva
+ Condividi
+ Info
+ Apri immagine come sfondo
+ Dimensione scelta: %1$s
+ Scegli dimensione:
+ La tua creazione è stata salvata in %1$s
+ Seleziona
+ Continua
+
+ Scegli un Colore
+ Condividi
+ Guarda cosa ho dipinto con Acrylic Paint! --- Acrylic Paint (Simple finger painting) - https://f-droid.org/app/anupam.acrylic
+ Condividi come testo
+ Non risulta alcuna app con cui condividere la tua opera…
+ Matita
+ Informazioni
+ Premi ancora per uscire!\n(Hai salvato?)
+
+Acrylic Paint
+
Grazie per aver scelto Acrylic Paint! Un software libero che libera la tua creatività!
+
+
Crediti
+
Ringraziamenti speciali a:
+Valerio Bozzolan per l'intensa revisione al codice sorgente. È l'attuale manutentore di questa versione.
+Marco Gagino per il profondo restyling e grande spirito di collaborazione!
+
+
+
Licenze
+
Questa versione di Acrylic Paint e il relativo codice sorgente sono distribuiti da Valerio Bozzolan sotto i
+termini della licenza GNU GPLv3+.
+Ciò è per permettere a chiunque di usare, studiare, migliorare e ricondividere quest\'app con qualunque mezzo e per qualsiasi scopo a patto di mantenere sempre questi diritti.
+
Quest\'applicazione è rilasciata nella speranza che sia utile a tutti, ma senza alcuna garanzia (nè garanzie di commerciabilità).
+
+
Note
+
Se ti accorgi di qualche difetto o se hai idee, usa il bug tracker.
+ ]]>
+
+ Seleziona l\'immagine da aprire
+
diff --git a/acrylic/src/main/res/values-ru/strings.xml b/acrylic/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..9dcaad0
--- /dev/null
+++ b/acrylic/src/main/res/values-ru/strings.xml
@@ -0,0 +1,56 @@
+
+
+ Acrylic Paint
+ О программе
+ Размытие
+ Размер кисти
+ Размер кисти
+ Стереть всё
+ Цвет
+ Продолжить
+ Жирный
+ Стереть
+ Вот ваш холст. Начните рисовать!
+ Не удаётся найти приложение, чтобы поделиться с…
+ Карандаш
+ Ок
+ Выбрать цвет
+ Нажмите кнопку НАЗАД снова, чтобы выйти из программы!\n(Несохранённая работа будет потеряна)
+ Сохранить
+ Ваша работа сохранена в %1$s
+ Выбрать
+ Поделиться
+ Поделиться в виде текста
+ Посмотрите на то, что я нарисовал с помощью Acrylic Paint! --- Acrylic Paint (Простое рисование пальцем) - https://f-droid.org/app/anupam.acrylic
+ О программе
+ Поделиться
+ Выбранный размер: %1$s
+ Acrylic Paint - это Свободное Программное Обеспечение, которое позволяет вам свободно творить!\n\nНажмите на меню для отображения других опций.\n\nБлагодарю Anupam Shrivastava за идею, Valerio Bozzolan за возрождение проекта и физика Marco Gagino за потрясающую поддержку. Спасибо всем участникам!\n\nСчастливого рисования :)
+
+Acrylic Paint
+
Спасибо за использование Acrylic Paint! Свободное Программное Обеспечение, которое позволяет вам свободно творить!
+
+
Благодарности
+
Особая благодарность:
+Valerio Bozzolan за большую работу, проделанную над исходным кодом и его оптимизацией. В настоящее время он продолжает работу над этой версией Acrylic Paint.
+Marco Gagino за тщательный редизайн и за большое участие!
+
+
+
Лицензии
+
Эта версия Acrylic Paint и его исзодный код выпущен Valerio Bozzolan на условиях
+лицензии GNU GPLv3+.
+Дицензия даёт каждому право использовать, изучать, улучшать и делиться этим приложением любыми средствами и для любой цели до тех пор, пока предлагаете его на тех же условиях для остальных.
+
Приложение распространяется в надежде, что оно будет полезено для всех, но без каких-либо гарантий; в том числе без подразумеваемых гарантий
+КОММЕРЧЕСКОЙ ВЫГОДЫ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. Смотрите GNU General Public License для более подробной информации.
+
+
Примечание
+
Если вы заметили какие-либо проблемы или у вас есть некоторые идеи, не стесняйтесь использовать баг трекер.
Прочтите README для получения дополнительной информации.
+
+
Удачи!
+ ]]>
+
+
\ No newline at end of file
diff --git a/acrylic/src/main/res/values-w820dp/dimens.xml b/acrylic/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/acrylic/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/acrylic/src/main/res/values/colors.xml b/acrylic/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3ab3e9c
--- /dev/null
+++ b/acrylic/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/acrylic/src/main/res/values/dimens.xml b/acrylic/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..55c1e59
--- /dev/null
+++ b/acrylic/src/main/res/values/dimens.xml
@@ -0,0 +1,7 @@
+
+
+
+ 16dp
+ 16dp
+
+
diff --git a/acrylic/src/main/res/values/ids.xml b/acrylic/src/main/res/values/ids.xml
new file mode 100644
index 0000000..1d47fc2
--- /dev/null
+++ b/acrylic/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/acrylic/src/main/res/values/strings.xml b/acrylic/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6094c2d
--- /dev/null
+++ b/acrylic/src/main/res/values/strings.xml
@@ -0,0 +1,63 @@
+
+
+
+ Acrylic Paint
+ Acrylic Paint is a Free and Open Source Software that frees your creativity!\n\nPress menu for more options.\n\nThanks to Anupam Shrivastava for the idea, to Valerio Bozzolan for reviving the project and the physicist Marco Gagino for the terrific support. Thanks to all the contributors!\n\nHappy painting :)
+ Here is your canvas. Start to paint!
+ Color
+ Bold
+ Blur
+ Brush size
+ Erase
+ Erase entire foreground
+ Save
+ Share
+ About
+ Changer la couleur du fond
+ Selected size: %1$s
+ Brush size
+ Saved your artwork to %1$s
+ Select
+ Continue
+ OK
+ Pick a Color
+ Share
+ Look at what I painted with Acrylic Paint! --- Acrylic Paint (Simple finger painting) - https://f-droid.org/app/anupam.acrylic
+ Can\'t locate an app to share with…
+ Pencil
+ About
+
+Acrylic Paint
+
Thanks for using Acrylic Paint! A Free and Open Source Software to free your creativity!
+
+
Credits
+
Special thanks to:
+Valerio Bozzolan for the great work done reviewing the source code and optimising it. He currently carries on the work for this version of AcrylicPaint.
+Marco Gagino for the thorough restyling and the great participation!
+
+
+
Licenses
+
This version of Acrylic Paint and its source code are released by Valerio Bozzolan under the
+terms of the GNU GPLv3+ license.
+This license gives everyone the ability to use, study, better and share this app by any means and for every purpose as long as you offer these same rights to the others.
+
This app is distributed in the hope that it will be useful to everyone, 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.
+
+
Note
+
If you notice any problem or if you have some ideas feel free to use the bug tracker.