Skip to content

Commit 449ccaa

Browse files
committed
put Android2D inside separate package, update SVG
1 parent 4b54631 commit 449ccaa

File tree

8 files changed

+667
-614
lines changed

8 files changed

+667
-614
lines changed

core/src/processing/core/PGraphicsAndroid2D.java renamed to core/src/procesing/a2d/PGraphicsAndroid2D.java

Lines changed: 58 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,22 @@
2121
Boston, MA 02111-1307 USA
2222
*/
2323

24-
package processing.core;
24+
package procesing.a2d;
2525

2626
import java.io.InputStream;
2727
import java.util.zip.GZIPInputStream;
2828

2929
import processing.android.AppComponent;
30+
import processing.core.PApplet;
31+
import processing.core.PFont;
32+
import processing.core.PGraphics;
33+
import processing.core.PImage;
34+
import processing.core.PMatrix;
35+
import processing.core.PMatrix2D;
36+
import processing.core.PMatrix3D;
37+
import processing.core.PShape;
38+
import processing.core.PShapeSVG;
39+
import processing.core.PSurface;
3040
import processing.data.XML;
3141
import android.app.Activity;
3242
import android.app.ActivityManager;
@@ -1045,20 +1055,23 @@ public void noSmooth() {
10451055
protected void imageImpl(PImage src,
10461056
float x1, float y1, float x2, float y2,
10471057
int u1, int v1, int u2, int v2) {
1048-
if (src.bitmap != null && src.bitmap.isRecycled()) {
1058+
Bitmap bitmap = (Bitmap)src.getNative();
1059+
1060+
if (bitmap != null && bitmap.isRecycled()) {
10491061
// Let's make sure it is recreated
1050-
src.bitmap = null;
1062+
bitmap = null;
10511063
}
10521064

1053-
if (src.bitmap == null && src.format == ALPHA) {
1065+
if (bitmap == null && src.format == ALPHA) {
10541066
// create an alpha bitmap for this feller
1055-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
1067+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
10561068
int[] px = new int[src.pixels.length];
10571069
for (int i = 0; i < px.length; i++) {
10581070
px[i] = src.pixels[i] << 24 | 0xFFFFFF;
10591071
}
1060-
src.bitmap.setPixels(px, 0, src.width, 0, 0, src.width, src.height);
1061-
src.modified = false;
1072+
bitmap.setPixels(px, 0, src.width, 0, 0, src.width, src.height);
1073+
modified = false;
1074+
src.setNative(bitmap);
10621075
}
10631076

10641077
// this version's not usable because it doesn't allow you to set output w/h
@@ -1069,23 +1082,26 @@ protected void imageImpl(PImage src,
10691082
// src.format == ARGB, tint ? tintPaint : null);
10701083
// } else {
10711084

1072-
if (src.bitmap == null ||
1073-
src.width != src.bitmap.getWidth() ||
1074-
src.height != src.bitmap.getHeight()) {
1075-
if (src.bitmap != null) src.bitmap.recycle();
1076-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
1077-
src.modified = true;
1085+
if (bitmap == null ||
1086+
src.width != bitmap.getWidth() ||
1087+
src.height != bitmap.getHeight()) {
1088+
if (bitmap != null) bitmap.recycle();
1089+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
1090+
modified = true;
1091+
src.setNative(bitmap);
10781092
}
1079-
if (src.modified) {
1093+
1094+
if (src.isModified()) {
10801095
//System.out.println("mutable, recycled = " + who.bitmap.isMutable() + ", " + who.bitmap.isRecycled());
1081-
if (!src.bitmap.isMutable()) {
1082-
src.bitmap.recycle();
1083-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
1096+
if (!bitmap.isMutable()) {
1097+
bitmap.recycle();
1098+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
1099+
src.setNative(bitmap);
10841100
}
10851101
if (src.pixels != null) {
1086-
src.bitmap.setPixels(src.pixels, 0, src.width, 0, 0, src.width, src.height);
1102+
bitmap.setPixels(src.pixels, 0, src.width, 0, 0, src.width, src.height);
10871103
}
1088-
src.modified = false;
1104+
src.setModified(false);
10891105
}
10901106

10911107
if (imageImplSrcRect == null) {
@@ -1099,7 +1115,7 @@ protected void imageImpl(PImage src,
10991115
//System.out.println(PApplet.hex(fillPaint.getColor()));
11001116
//canvas.drawBitmap(who.bitmap, imageImplSrcRect, imageImplDstRect, fillPaint);
11011117
// System.out.println("drawing lower, tint = " + tint + " " + PApplet.hex(tintPaint.getColor()));
1102-
canvas.drawBitmap(src.bitmap, imageImplSrcRect, imageImplDstRect, tint ? tintPaint : null);
1118+
canvas.drawBitmap(bitmap, imageImplSrcRect, imageImplDstRect, tint ? tintPaint : null);
11031119

11041120
// If the OS things the memory is low, then recycles bitmaps automatically...
11051121
// but I don't think it is particularly efficient, as the bitmaps are stored
@@ -1110,8 +1126,8 @@ protected void imageImpl(PImage src,
11101126
ActivityManager activityManager = (ActivityManager) activity.getSystemService(android.content.Context.ACTIVITY_SERVICE);
11111127
activityManager.getMemoryInfo(mi);
11121128
if (mi.lowMemory) {
1113-
src.bitmap.recycle();
1114-
src.bitmap = null;
1129+
bitmap.recycle();
1130+
src.setNative(null);
11151131
}
11161132
}
11171133

@@ -1339,7 +1355,7 @@ protected void textLineImpl(char buffer[], int start, int stop,
13391355
// textFont.smooth ?
13401356
// RenderingHints.VALUE_ANTIALIAS_ON :
13411357
// RenderingHints.VALUE_ANTIALIAS_OFF);
1342-
fillPaint.setAntiAlias(textFont.smooth);
1358+
fillPaint.setAntiAlias(textFont.isSmooth());
13431359

13441360
//System.out.println("setting frac metrics");
13451361
//g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
@@ -2067,28 +2083,32 @@ public void set(int x, int y, PImage src) {
20672083
throw new RuntimeException("set() not available for ALPHA images");
20682084
}
20692085

2070-
if (src.bitmap == null) {
2071-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2072-
src.modified = true;
2086+
Bitmap bitmap = (Bitmap)src.getNative();
2087+
if (bitmap == null) {
2088+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2089+
src.setNative(bitmap);
2090+
src.setModified();
20732091
}
2074-
if (src.width != src.bitmap.getWidth() ||
2075-
src.height != src.bitmap.getHeight()) {
2076-
src.bitmap.recycle();
2077-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2078-
src.modified = true;
2092+
if (src.width != bitmap.getWidth() ||
2093+
src.height != bitmap.getHeight()) {
2094+
bitmap.recycle();
2095+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2096+
src.setNative(bitmap);
2097+
src.setModified();
20792098
}
2080-
if (src.modified) {
2081-
if (!src.bitmap.isMutable()) {
2082-
src.bitmap.recycle();
2083-
src.bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2099+
if (src.isModified()) {
2100+
if (!bitmap.isMutable()) {
2101+
bitmap.recycle();
2102+
bitmap = Bitmap.createBitmap(src.width, src.height, Config.ARGB_8888);
2103+
setNative(bitmap);
20842104
}
2085-
src.bitmap.setPixels(src.pixels, 0, src.width, 0, 0, src.width, src.height);
2086-
src.modified = false;
2105+
bitmap.setPixels(src.pixels, 0, src.width, 0, 0, src.width, src.height);
2106+
src.setModified(false);
20872107
}
20882108
// set() happens in screen coordinates, so need to clear the ctm
20892109
canvas.save(Canvas.MATRIX_SAVE_FLAG);
20902110
canvas.setMatrix(null); // set to identity
2091-
canvas.drawBitmap(src.bitmap, x, y, null);
2111+
canvas.drawBitmap(bitmap, x, y, null);
20922112
canvas.restore();
20932113
}
20942114

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package procesing.a2d;
2+
3+
import android.graphics.Shader;
4+
import processing.core.PGraphics;
5+
import processing.core.PShapeSVG;
6+
import processing.data.XML;
7+
8+
public class PShapeAndroid2D extends PShapeSVG {
9+
protected Shader strokeGradientPaint;
10+
protected Shader fillGradientPaint;
11+
12+
13+
public PShapeAndroid2D(XML svg) {
14+
super(svg);
15+
}
16+
17+
18+
public PShapeAndroid2D(PShapeSVG parent, XML properties, boolean parseKids) {
19+
super(parent, properties, parseKids);
20+
}
21+
22+
23+
@Override
24+
protected void setParent(PShapeSVG parent) {
25+
super.setParent(parent);
26+
27+
if (parent instanceof PShapeAndroid2D) {
28+
PShapeAndroid2D pj = (PShapeAndroid2D) parent;
29+
fillGradientPaint = pj.fillGradientPaint;
30+
strokeGradientPaint = pj.strokeGradientPaint;
31+
32+
} else { // parent is null or not Android2D
33+
fillGradientPaint = null;
34+
strokeGradientPaint = null;
35+
}
36+
}
37+
38+
39+
/** Factory method for subclasses. */
40+
@Override
41+
protected PShapeSVG createShape(PShapeSVG parent, XML properties, boolean parseKids) {
42+
return new PShapeAndroid2D(parent, properties, parseKids);
43+
}
44+
45+
46+
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47+
48+
49+
protected Shader calcGradientPaint(Gradient gradient) {
50+
// TODO just do this with the other parsing
51+
int[] colors = new int[gradient.count];
52+
int opacityMask = ((int) (opacity * 255)) << 24;
53+
for (int i = 0; i < gradient.count; i++) {
54+
colors[i] = opacityMask | (gradient.color[i] & 0xFFFFFF);
55+
}
56+
57+
if (gradient instanceof LinearGradient) {
58+
LinearGradient grad = (LinearGradient) gradient;
59+
// return new LinearGradientPaint(grad.x1, grad.y1, grad.x2, grad.y2,
60+
// grad.offset, grad.color, grad.count,
61+
// opacity);
62+
return new android.graphics.LinearGradient(grad.x1, grad.y1,
63+
grad.x2, grad.y2,
64+
colors, grad.offset,
65+
Shader.TileMode.CLAMP );
66+
67+
} else if (gradient instanceof RadialGradient) {
68+
RadialGradient grad = (RadialGradient) gradient;
69+
// return new RadialGradientPaint(grad.cx, grad.cy, grad.r,
70+
// grad.offset, grad.color, grad.count,
71+
// opacity);
72+
return new android.graphics.RadialGradient(grad.cx, grad.cy, grad.r,
73+
colors, grad.offset,
74+
Shader.TileMode.CLAMP);
75+
}
76+
return null;
77+
}
78+
79+
80+
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81+
82+
83+
@Override
84+
protected void styles(PGraphics g) {
85+
super.styles(g);
86+
87+
if (g instanceof PGraphicsAndroid2D) {
88+
PGraphicsAndroid2D gg = (PGraphicsAndroid2D) g;
89+
90+
if (strokeGradient != null) {
91+
// gg.strokeGradient = true;
92+
if (strokeGradientPaint == null) {
93+
strokeGradientPaint = calcGradientPaint(strokeGradient);
94+
}
95+
gg.strokePaint.setShader(strokeGradientPaint);
96+
}
97+
if (fillGradient != null) {
98+
// gg.fillGradient = true;
99+
if (fillGradientPaint == null) {
100+
fillGradientPaint = calcGradientPaint(fillGradient);
101+
}
102+
gg.fillPaint.setShader(fillGradientPaint);
103+
} else {
104+
// need to shut off, in case parent object has a gradient applied
105+
//gg.fillGradient = false;
106+
}
107+
}
108+
}
109+
}

core/src/processing/core/PSurfaceAndroid2D.java renamed to core/src/procesing/a2d/PSurfaceAndroid2D.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
Boston, MA 02111-1307 USA
2121
*/
2222

23-
package processing.core;
23+
package procesing.a2d;
2424

2525
import android.content.Context;
2626

@@ -31,6 +31,9 @@
3131
import android.view.SurfaceView;
3232
import processing.android.AppComponent;
3333
import processing.android.PFragment;
34+
import processing.core.PApplet;
35+
import processing.core.PGraphics;
36+
import processing.core.PSurfaceNone;
3437

3538
public class PSurfaceAndroid2D extends PSurfaceNone {
3639

core/src/processing/android/PWatchFaceCanvas.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
import android.view.SurfaceHolder;
3939
import android.view.WindowInsets;
4040
import android.view.WindowManager;
41+
import procesing.a2d.PGraphicsAndroid2D;
4142
import processing.core.PApplet;
42-
import processing.core.PGraphicsAndroid2D;
4343
import processing.event.MouseEvent;
4444

4545

core/src/processing/core/PApplet.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import android.view.SurfaceView;
4747
import android.view.View;
4848
import android.view.ViewGroup;
49+
import procesing.a2d.PGraphicsAndroid2D;
4950
import processing.android.AppComponent;
5051
import processing.data.*;
5152
import processing.event.*;
@@ -159,7 +160,6 @@ public class PApplet extends Object implements PConstants {
159160
/** height of this applet's associated PGraphics */
160161
public int height = DEFAULT_HEIGHT;
161162

162-
// can't call this because causes an ex, but could set elsewhere
163163
/** The logical density of the display from getDisplayMetrics().density
164164
* According to Android's documentation:
165165
* This is a scaling factor for the Density Independent Pixel unit,
@@ -9672,6 +9672,11 @@ public Object getNative() {
96729672
}
96739673

96749674

9675+
public void setNative(Object nativeObject) {
9676+
g.setNative(nativeObject);
9677+
}
9678+
9679+
96759680
/**
96769681
* Returns an ARGB "color" type (a packed 32 bit int with the color.
96779682
* If the coordinate is outside the image, zero is returned

core/src/processing/core/PFont.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,11 @@ public int getDefaultSize() {
426426
}
427427

428428

429+
public boolean isSmooth() {
430+
return smooth;
431+
}
432+
433+
429434
public void setSubsetting() {
430435
subsetting = true;
431436
}

core/src/processing/core/PImage.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,13 @@ public Object getNative() {
208208
}
209209

210210

211+
public void setNative(Object nativeObject) {
212+
Bitmap bitmap = (Bitmap) nativeObject;
213+
this.bitmap = bitmap;
214+
}
215+
216+
217+
211218
//////////////////////////////////////////////////////////////
212219

213220
// MARKING IMAGE AS MODIFIED / FOR USE w/ GET/SET

0 commit comments

Comments
 (0)