More layout Canvas/Paint implementation.
Change-Id: Ib3da4a4b2259dc7c53b24444b5c0b78cee15d387
This commit is contained in:
@@ -458,8 +458,28 @@ public class Canvas_Delegate {
|
||||
|
||||
/*package*/ static void native_drawARGB(int nativeCanvas, int a, int r,
|
||||
int g, int b) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
|
||||
if (canvasDelegate == null) {
|
||||
assert false;
|
||||
return;
|
||||
}
|
||||
|
||||
// get a new graphics context.
|
||||
Graphics2D graphics = (Graphics2D)canvasDelegate.getGraphics2d().create();
|
||||
try {
|
||||
// reset its transform just in case
|
||||
graphics.setTransform(new AffineTransform());
|
||||
|
||||
// set the color
|
||||
graphics.setColor(new Color(r, g, b, a));
|
||||
|
||||
graphics.fillRect(0, 0, canvasDelegate.mBufferedImage.getWidth(),
|
||||
canvasDelegate.mBufferedImage.getHeight());
|
||||
} finally {
|
||||
// dispose Graphics2D object
|
||||
graphics.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/ static void native_drawColor(int nativeCanvas, int color) {
|
||||
@@ -676,32 +696,34 @@ public class Canvas_Delegate {
|
||||
return;
|
||||
}
|
||||
|
||||
Graphics2D g = canvasDelegate.getGraphics2d();
|
||||
|
||||
g = (Graphics2D)g.create();
|
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
// set the color. because this only handles RGB, the alpha channel is handled
|
||||
// as a composite.
|
||||
g.setColor(new Color(paintDelegate.getColor()));
|
||||
int alpha = paintDelegate.getAlpha();
|
||||
float falpha = alpha / 255.f;
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha));
|
||||
|
||||
|
||||
// Paint.TextAlign indicates how the text is positioned relative to X.
|
||||
// LEFT is the default and there's nothing to do.
|
||||
if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) {
|
||||
float m = paintDelegate.measureText(text, index, count);
|
||||
if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) {
|
||||
x -= m / 2;
|
||||
} else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
|
||||
x -= m;
|
||||
}
|
||||
}
|
||||
|
||||
List<FontInfo> fonts = paintDelegate.getFonts();
|
||||
Graphics2D g = (Graphics2D) canvasDelegate.getGraphics2d().create();
|
||||
try {
|
||||
if (paintDelegate.isAntiAliased()) {
|
||||
g.setRenderingHint(
|
||||
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
}
|
||||
|
||||
// set the color. because this only handles RGB, the alpha channel is handled
|
||||
// as a composite.
|
||||
g.setColor(new Color(paintDelegate.getColor()));
|
||||
int alpha = paintDelegate.getAlpha();
|
||||
float falpha = alpha / 255.f;
|
||||
|
||||
setModeInGraphics(g, PorterDuff.Mode.SRC_OVER, falpha);
|
||||
|
||||
// Paint.TextAlign indicates how the text is positioned relative to X.
|
||||
// LEFT is the default and there's nothing to do.
|
||||
if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) {
|
||||
float m = paintDelegate.measureText(text, index, count);
|
||||
if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) {
|
||||
x -= m / 2;
|
||||
} else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
|
||||
x -= m;
|
||||
}
|
||||
}
|
||||
|
||||
List<FontInfo> fonts = paintDelegate.getFonts();
|
||||
|
||||
if (fonts.size() > 0) {
|
||||
FontInfo mainFont = fonts.get(0);
|
||||
int i = index;
|
||||
@@ -873,6 +895,11 @@ public class Canvas_Delegate {
|
||||
Graphics2D g = getGraphics2d();
|
||||
g = (Graphics2D)g.create();
|
||||
|
||||
if (paint.isAntiAliased()) {
|
||||
g.setRenderingHint(
|
||||
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
}
|
||||
|
||||
// configure it
|
||||
g.setColor(new Color(paint.getColor()));
|
||||
int alpha = paint.getAlpha();
|
||||
@@ -932,6 +959,55 @@ public class Canvas_Delegate {
|
||||
return g;
|
||||
}
|
||||
|
||||
private static void setModeInGraphics(Graphics2D g, PorterDuff.Mode mode, float falpha) {
|
||||
switch (mode) {
|
||||
case CLEAR:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, falpha));
|
||||
break;
|
||||
case DARKEN:
|
||||
break;
|
||||
case DST:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST, falpha));
|
||||
break;
|
||||
case DST_ATOP:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_ATOP, falpha));
|
||||
break;
|
||||
case DST_IN:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, falpha));
|
||||
break;
|
||||
case DST_OUT:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OUT, falpha));
|
||||
break;
|
||||
case DST_OVER:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OVER, falpha));
|
||||
break;
|
||||
case LIGHTEN:
|
||||
break;
|
||||
case MULTIPLY:
|
||||
break;
|
||||
case SCREEN:
|
||||
break;
|
||||
case SRC:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, falpha));
|
||||
break;
|
||||
case SRC_ATOP:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, falpha));
|
||||
break;
|
||||
case SRC_IN:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, falpha));
|
||||
break;
|
||||
case SRC_OUT:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OUT, falpha));
|
||||
break;
|
||||
case SRC_OVER:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha));
|
||||
break;
|
||||
case XOR:
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.XOR, falpha));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void drawBitmap(
|
||||
int nativeCanvas,
|
||||
|
||||
@@ -77,6 +77,12 @@ public class Paint_Delegate {
|
||||
private float mTextScaleX;
|
||||
private float mTextSkewX;
|
||||
|
||||
private int mXfermode;
|
||||
private int mColorFilter;
|
||||
private int mShader;
|
||||
private int mPathEffect;
|
||||
private int mMaskFilter;
|
||||
|
||||
|
||||
// ---- Public Helper methods ----
|
||||
|
||||
@@ -92,6 +98,10 @@ public class Paint_Delegate {
|
||||
return mFonts;
|
||||
}
|
||||
|
||||
public boolean isAntiAliased() {
|
||||
return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
|
||||
}
|
||||
|
||||
public boolean isFilterBitmap() {
|
||||
return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
|
||||
}
|
||||
@@ -574,28 +584,58 @@ public class Paint_Delegate {
|
||||
}
|
||||
|
||||
/*package*/ static int native_setShader(int native_object, int shader) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(native_object);
|
||||
if (delegate == null) {
|
||||
assert false;
|
||||
return shader;
|
||||
}
|
||||
|
||||
return delegate.mShader = shader;
|
||||
}
|
||||
|
||||
/*package*/ static int native_setColorFilter(int native_object, int filter) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(native_object);
|
||||
if (delegate == null) {
|
||||
assert false;
|
||||
return filter;
|
||||
}
|
||||
|
||||
return delegate.mColorFilter = filter;
|
||||
}
|
||||
|
||||
/*package*/ static int native_setXfermode(int native_object, int xfermode) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(native_object);
|
||||
if (delegate == null) {
|
||||
assert false;
|
||||
return xfermode;
|
||||
}
|
||||
|
||||
return delegate.mXfermode = xfermode;
|
||||
}
|
||||
|
||||
/*package*/ static int native_setPathEffect(int native_object, int effect) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(native_object);
|
||||
if (delegate == null) {
|
||||
assert false;
|
||||
return effect;
|
||||
}
|
||||
|
||||
return delegate.mPathEffect = effect;
|
||||
}
|
||||
|
||||
/*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
|
||||
// FIXME
|
||||
throw new UnsupportedOperationException();
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(native_object);
|
||||
if (delegate == null) {
|
||||
assert false;
|
||||
return maskfilter;
|
||||
}
|
||||
|
||||
return delegate.mMaskFilter = maskfilter;
|
||||
}
|
||||
|
||||
/*package*/ static int native_setTypeface(int native_object, int typeface) {
|
||||
@@ -778,6 +818,11 @@ public class Paint_Delegate {
|
||||
mTextSize = paint.mTextSize;
|
||||
mTextScaleX = paint.mTextScaleX;
|
||||
mTextSkewX = paint.mTextSkewX;
|
||||
mXfermode = paint.mXfermode;
|
||||
mColorFilter = paint.mColorFilter;
|
||||
mShader = paint.mShader;
|
||||
mPathEffect = paint.mPathEffect;
|
||||
mMaskFilter = paint.mMaskFilter;
|
||||
}
|
||||
|
||||
private void reset() {
|
||||
@@ -793,6 +838,11 @@ public class Paint_Delegate {
|
||||
mTextSize = 20.f;
|
||||
mTextScaleX = 1.f;
|
||||
mTextSkewX = 0.f;
|
||||
mXfermode = 0;
|
||||
mColorFilter = 0;
|
||||
mShader = 0;
|
||||
mPathEffect = 0;
|
||||
mMaskFilter = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -877,7 +927,6 @@ public class Paint_Delegate {
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
|
||||
// get the delegate from the native int.
|
||||
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
|
||||
|
||||
Reference in New Issue
Block a user