Skip to content

Commit

Permalink
Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
MISTER-CHAN committed Jul 1, 2024
1 parent 69e593e commit bda5962
Show file tree
Hide file tree
Showing 15 changed files with 127 additions and 127 deletions.
10 changes: 5 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ android {
minSdk 30
targetSdk 34
versionCode 1
versionName '24.6.10'
versionName '24.7.1'

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand All @@ -34,14 +34,14 @@ android {
dependencies {

implementation 'androidx.activity:activity:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2'
implementation 'androidx.preference:preference:1.2.1'
implementation 'com.google.android.material:material:1.12.0'
implementation('io.github.waynejo:androidndkgif:1.0.1')
implementation(platform('org.jetbrains.kotlin:kotlin-bom:1.9.20'))
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}
33 changes: 30 additions & 3 deletions app/src/main/java/com/misterchan/iconeditor/CellGrid.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,42 @@
package com.misterchan.iconeditor;

import androidx.annotation.IntRange;
import android.graphics.Canvas;
import android.graphics.Paint;

public class CellGrid {
public boolean enabled = false;

@IntRange(from = 0)
public int sizeX = 16, sizeY = 16;

@IntRange(from = 0)
public int spacingX = 0, spacingY = 0;

public int offsetX = 0, offsetY = 0;

public void draw(Canvas canvas, float l, float t, float r, float b, float tx, float ty, float s, Paint paint) {
if (sizeX + spacingX > 1) {
final float scaledSizeX = sizeX * s, scaledSpacingX = spacingX * s;
float x = (tx >= 0.0f ? tx : tx % (scaledSizeX + scaledSpacingX)) + offsetX % (sizeX + spacingX) * s;
while (true) {
if (x >= l) canvas.drawLine(x, t, x, b, paint);
if ((x += scaledSizeX) > r) break;
if (spacingX != 0) {
if (x >= l) canvas.drawLine(x, t, x, b, paint);
if ((x += scaledSpacingX) > r) break;
}
}
}
if (sizeY + spacingY > 1) {
final float scaledSizeY = sizeY * s, scaledSpacingY = spacingY * s;
float y = (ty >= 0.0f ? ty : ty % (scaledSizeY + scaledSpacingY)) + offsetY % (sizeY + spacingY) * s;
if (y < ty) y += scaledSizeY + scaledSpacingY;
while (true) {
if (y >= t) canvas.drawLine(l, y, r, y, paint);
if ((y += scaledSizeY) > b) break;
if (spacingY != 0) {
if (y >= t) canvas.drawLine(l, y, r, y, paint);
if ((y += scaledSpacingY) > b) break;
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public interface OnConfirmListener {

public AnimationClipper(Context context, Project project, OnConfirmListener listener) {
builder = new MaterialAlertDialogBuilder(context)
.setIcon(R.drawable.ic_content_cut).setTitle(R.string.clip)
.setIcon(R.drawable.ic_content_cut).setTitle(R.string.clip_verb)
.setView(R.layout.animation_clipper)
.setPositiveButton(R.string.ok, (dialog, which) ->
listener.onConfirm(from, to))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,34 +40,14 @@ public CellGridManager(Context context, CellGrid cellGrid, OnApplyListener onUpd
.setView(R.layout.cell_grid);
}

public void show() {
final AlertDialog dialog = builder.show();

cbEnabled = dialog.findViewById(R.id.cb_enabled);
tietSizeX = dialog.findViewById(R.id.tiet_size_x);
tietSizeY = dialog.findViewById(R.id.tiet_size_y);
tietSpacingX = dialog.findViewById(R.id.tiet_spacing_x);
tietSpacingY = dialog.findViewById(R.id.tiet_spacing_y);
tietOffsetX = dialog.findViewById(R.id.tiet_offset_x);
tietOffsetY = dialog.findViewById(R.id.tiet_offset_y);

cbEnabled.setChecked(cellGrid.enabled);
tietSizeX.setText(String.valueOf(cellGrid.sizeX));
tietSizeY.setText(String.valueOf(cellGrid.sizeY));
tietSpacingX.setText(String.valueOf(cellGrid.spacingX));
tietSpacingY.setText(String.valueOf(cellGrid.spacingY));
tietOffsetX.setText(String.valueOf(cellGrid.offsetX));
tietOffsetY.setText(String.valueOf(cellGrid.offsetY));
}

private void onPositiveButtonClick(DialogInterface dialog, int which) {
final int sizeX, sizeY, spacingX, spacingY, offsetX, offsetY;

try {
sizeX = Integer.parseUnsignedInt(tietSizeX.getText().toString());
sizeY = Integer.parseUnsignedInt(tietSizeY.getText().toString());
spacingX = Integer.parseUnsignedInt(tietSpacingX.getText().toString());
spacingY = Integer.parseUnsignedInt(tietSpacingY.getText().toString());
sizeX = Integer.parseInt(tietSizeX.getText().toString());
sizeY = Integer.parseInt(tietSizeY.getText().toString());
spacingX = Integer.parseInt(tietSpacingX.getText().toString());
spacingY = Integer.parseInt(tietSpacingY.getText().toString());
offsetX = Integer.parseInt(tietOffsetX.getText().toString());
offsetY = Integer.parseInt(tietOffsetY.getText().toString());
} catch (NumberFormatException e) {
Expand All @@ -84,4 +64,24 @@ private void onPositiveButtonClick(DialogInterface dialog, int which) {

onUpdateListener.onApply();
}

public void show() {
final AlertDialog dialog = builder.show();

cbEnabled = dialog.findViewById(R.id.cb_enabled);
tietSizeX = dialog.findViewById(R.id.tiet_size_x);
tietSizeY = dialog.findViewById(R.id.tiet_size_y);
tietSpacingX = dialog.findViewById(R.id.tiet_spacing_x);
tietSpacingY = dialog.findViewById(R.id.tiet_spacing_y);
tietOffsetX = dialog.findViewById(R.id.tiet_offset_x);
tietOffsetY = dialog.findViewById(R.id.tiet_offset_y);

cbEnabled.setChecked(cellGrid.enabled);
tietSizeX.setText(String.valueOf(cellGrid.sizeX));
tietSizeY.setText(String.valueOf(cellGrid.sizeY));
tietSpacingX.setText(String.valueOf(cellGrid.spacingX));
tietSpacingY.setText(String.valueOf(cellGrid.spacingY));
tietOffsetX.setText(String.valueOf(cellGrid.offsetX));
tietOffsetY.setText(String.valueOf(cellGrid.offsetY));
}
}
21 changes: 16 additions & 5 deletions app/src/main/java/com/misterchan/iconeditor/tool/BrushTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,17 @@

import androidx.annotation.NonNull;

import com.misterchan.iconeditor.util.BitmapUtils;

public class BrushTool {
public enum TipShape {
PRESET_BRUSH, REF
PRESET_BRUSH, CLIP;

private static final TipShape[] values = values();

public static TipShape valueAt(int ordinal) {
return values[ordinal];
}
}

private static final Paint PAINT = new Paint() {
Expand Down Expand Up @@ -38,18 +46,21 @@ public void setToBrush(long color) {
tipShape = TipShape.PRESET_BRUSH;
}

public void setToRef(Bitmap src, long color) {
public void setToClip(Bitmap src, long color) {
if (src == null) return;
set(src, color);
tipShape = TipShape.REF;
tipShape = TipShape.CLIP;
}

public void set(long color) {
set(src, color);
}

private void set(@NonNull Bitmap src, long color) {
if (tipShape == TipShape.REF && this.src != null) this.src.recycle();
this.src = src;
if (src != this.src) {
if (this.src != null) this.src.recycle();
this.src = BitmapUtils.createBitmap(src);
}
final Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
dst.eraseColor(color);
new Canvas(dst).drawBitmap(src, 0.0f, 0.0f, PAINT);
Expand Down
102 changes: 25 additions & 77 deletions app/src/main/java/com/misterchan/iconeditor/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -714,10 +714,7 @@ public void onDestroyActionMode(ActionMode mode) {
final int checkedItem = brush.tipShape.ordinal();
new MaterialAlertDialogBuilder(this).setTitle(R.string.tip_shape)
.setSingleChoiceItems(R.array.brush_tip_shapes, checkedItem, (dialog, which) -> {
updateBrush(switch (which) {
default -> BrushTool.TipShape.PRESET_BRUSH;
case 1 -> BrushTool.TipShape.REF;
});
updateBrush(BrushTool.TipShape.valueAt(which));
})
.setPositiveButton(R.string.ok, null)
.show();
Expand Down Expand Up @@ -2951,8 +2948,8 @@ public void onIVTouch(View v, MotionEvent event) {
}
case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly, R.id.b_mesh -> {
final boolean isTransformerButtonChecked = switch (activityMain.tools.btgTools.getCheckedButtonId()) {
case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly, R.id.b_mesh ->
true;
case R.id.b_translation, R.id.b_scale, R.id.b_rotation, R.id.b_poly,
R.id.b_mesh -> true;
default -> false;
};
if (isChecked) {
Expand Down Expand Up @@ -3180,7 +3177,6 @@ private boolean checkOrRequestPermission() {
@SuppressLint("NonConstantResourceId")
private boolean checkRefNecessity() {
return switch (activityMain.tools.btgTools.getCheckedButtonId()) {
case R.id.b_brush -> brush.tipShape == BrushTool.TipShape.REF;
case R.id.b_magic_eraser, R.id.b_magic_paint -> true;
default -> false;
};
Expand Down Expand Up @@ -3627,56 +3623,15 @@ private void drawGridOntoView() {
for (float y = t; y <= b; y += scale)
gridCanvas.drawLine(l, y, r, y, PAINT_GRID);
}
gridCanvas.drawLine(l, t, l - 100.0f, t, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(r, t, r + 100.0f, t, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(r, t - 100.0f, r, t, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(r, b, r, b + 100.0f, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(r + 100.0f, b, r, b, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(l, b, l - 100.0f, b, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(l, b + 100.0f, l, b, PAINT_IMAGE_BOUND);
gridCanvas.drawLine(l, t, l, t - 100.0f, PAINT_IMAGE_BOUND);
CanvasUtils.drawRightAngles(gridCanvas, l, t, r, b, PAINT_IMAGE_BOUND);
}

final CellGrid cellGrid = project.cellGrid;
if (cellGrid.enabled) {
final Bitmap background = frame.getBackgroundLayer().bitmap;
final float l = translationX >= 0.0f ? translationX : translationX % scale, t = translationY >= 0.0f ? translationY : translationY % scale;
final float r = Math.min(translationX + toScaled(background.getWidth()), viewWidth), b = Math.min(translationY + toScaled(background.getHeight()), viewHeight);
if (cellGrid.sizeX > 1) {
final float t = translationY >= 0.0f ? translationY : translationY % scale;
final float scaledSizeX = toScaled(cellGrid.sizeX), scaledSpacingX = toScaled(cellGrid.spacingX);
float x = (translationX >= 0.0f ? translationX : translationX % (scaledSizeX + scaledSpacingX))
+ toScaled(cellGrid.offsetX % (cellGrid.sizeX + cellGrid.spacingX));
if (x < translationX) x += scaledSizeX + scaledSpacingX;
if (cellGrid.spacingX <= 0) {
do gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID);
while ((x += scaledSizeX) <= r);
} else {
do {
gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID);
if ((x += scaledSizeX) > r) break;
gridCanvas.drawLine(x, t, x, b, PAINT_CELL_GRID);
if ((x += scaledSpacingX) > r) break;
} while (true);
}
}
if (cellGrid.sizeY > 1) {
final float l = translationX >= 0.0f ? translationX : translationX % scale;
final float scaledSizeY = toScaled(cellGrid.sizeY), scaledSpacingY = toScaled(cellGrid.spacingY);
float y = (translationY >= 0.0f ? translationY : translationY % (scaledSizeY + scaledSpacingY))
+ toScaled(cellGrid.offsetY % (cellGrid.sizeY + cellGrid.spacingY));
if (y < translationY) y += scaledSizeY + scaledSpacingY;
if (cellGrid.spacingY <= 0) {
do gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID);
while ((y += scaledSizeY) <= b);
} else {
do {
gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID);
if ((y += scaledSizeY) > b) break;
gridCanvas.drawLine(l, y, r, y, PAINT_CELL_GRID);
if ((y += scaledSpacingY) > b) break;
} while (true);
}
}
cellGrid.draw(gridCanvas, l, t, r, b, translationX, translationY, scale, PAINT_CELL_GRID);
}

for (final Guide guide : project.guides) {
Expand Down Expand Up @@ -3904,12 +3859,9 @@ ActivityMainBinding getBinding() {
}

private FloatingLayer getCurrentFloatingLayer() {
if (!transformer.isRecycled()) {
return transformer;
} else if (!dpPreview.isRecycled()) {
return dpPreview;
}
return null;
return !transformer.isRecycled() ? transformer
: !dpPreview.isRecycled() ? dpPreview
: null;
}

private Rect getVisibleSubset() {
Expand Down Expand Up @@ -4413,18 +4365,21 @@ private boolean onLayerOptionsItemSelected(MenuItem item, int itemId) {
layer.paint.getAlpha()));
}
case R.id.i_layer_blend_mode_clear,
R.id.i_layer_blend_mode_src, R.id.i_layer_blend_mode_dst,
R.id.i_layer_blend_mode_src_over, R.id.i_layer_blend_mode_dst_over,
R.id.i_layer_blend_mode_src_in, R.id.i_layer_blend_mode_dst_in,
R.id.i_layer_blend_mode_src_out, R.id.i_layer_blend_mode_dst_out,
R.id.i_layer_blend_mode_src_atop, R.id.i_layer_blend_mode_dst_atop,
R.id.i_layer_blend_mode_xor, R.id.i_layer_blend_mode_plus,
R.id.i_layer_blend_mode_modulate, R.id.i_layer_blend_mode_screen, R.id.i_layer_blend_mode_overlay,
R.id.i_layer_blend_mode_darken, R.id.i_layer_blend_mode_lighten,
R.id.i_layer_blend_mode_color_dodge, R.id.i_layer_blend_mode_color_burn,
R.id.i_layer_blend_mode_hard_light, R.id.i_layer_blend_mode_soft_light,
R.id.i_layer_blend_mode_difference, R.id.i_layer_blend_mode_exclusion, R.id.i_layer_blend_mode_multiply,
R.id.i_layer_blend_mode_hue, R.id.i_layer_blend_mode_saturation, R.id.i_layer_blend_mode_color, R.id.i_layer_blend_mode_luminosity -> {
R.id.i_layer_blend_mode_src, R.id.i_layer_blend_mode_dst,
R.id.i_layer_blend_mode_src_over, R.id.i_layer_blend_mode_dst_over,
R.id.i_layer_blend_mode_src_in, R.id.i_layer_blend_mode_dst_in,
R.id.i_layer_blend_mode_src_out, R.id.i_layer_blend_mode_dst_out,
R.id.i_layer_blend_mode_src_atop, R.id.i_layer_blend_mode_dst_atop,
R.id.i_layer_blend_mode_xor, R.id.i_layer_blend_mode_plus,
R.id.i_layer_blend_mode_modulate, R.id.i_layer_blend_mode_screen,
R.id.i_layer_blend_mode_overlay,
R.id.i_layer_blend_mode_darken, R.id.i_layer_blend_mode_lighten,
R.id.i_layer_blend_mode_color_dodge, R.id.i_layer_blend_mode_color_burn,
R.id.i_layer_blend_mode_hard_light, R.id.i_layer_blend_mode_soft_light,
R.id.i_layer_blend_mode_difference, R.id.i_layer_blend_mode_exclusion,
R.id.i_layer_blend_mode_multiply,
R.id.i_layer_blend_mode_hue, R.id.i_layer_blend_mode_saturation,
R.id.i_layer_blend_mode_color, R.id.i_layer_blend_mode_luminosity -> {
layer.paint.setBlendMode(switch (itemId) {
case R.id.i_layer_blend_mode_clear -> BlendMode.CLEAR;
case R.id.i_layer_blend_mode_src -> BlendMode.SRC;
Expand Down Expand Up @@ -5862,12 +5817,8 @@ private float toViewYRel(int y) {
private void updateBrush(BrushTool.TipShape tipShape) {
if (tipShape == null) tipShape = brush.tipShape;
switch (tipShape) {
case CLIP -> brush.setToClip(clipboard, paint.getColorLong());
case PRESET_BRUSH -> brush.setToBrush(paint.getColorLong());
case REF -> {
updateReference(true);
if (brush.tipShape == BrushTool.TipShape.PRESET_BRUSH)
brush.setToRef(ref.bm(), paint.getColorLong());
}
}
}

Expand All @@ -5878,8 +5829,5 @@ private void updateReference() {
private void updateReference(boolean nonNull) {
final Bitmap rb = frame.mergeReferenceLayers();
ref.set(rb != null ? rb : nonNull || checkRefNecessity() ? BitmapUtils.createBitmap(bitmap) : null);
if (activityMain.tools.btgTools.getCheckedButtonId() == R.id.b_brush && brush.tipShape == BrushTool.TipShape.REF) {
brush.setToRef(ref.bm(), paint.getColorLong());
}
}
}
11 changes: 11 additions & 0 deletions app/src/main/java/com/misterchan/iconeditor/util/CanvasUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,15 @@ public static void drawInclusiveLine(Canvas canvas, int startX, int startY, int

canvas.drawLine(startX, startY, stopX, stopY, paint);
}

public static void drawRightAngles(Canvas canvas, float l, float t, float r, float b, Paint paint) {
canvas.drawLine(l, t, l - 100.0f, t, paint);
canvas.drawLine(r, t, r + 100.0f, t, paint);
canvas.drawLine(r, t - 100.0f, r, t, paint);
canvas.drawLine(r, b, r, b + 100.0f, paint);
canvas.drawLine(r + 100.0f, b, r, b, paint);
canvas.drawLine(l, b, l - 100.0f, b, paint);
canvas.drawLine(l, b + 100.0f, l, b, paint);
canvas.drawLine(l, t, l, t - 100.0f, paint);
}
}
Loading

0 comments on commit bda5962

Please sign in to comment.