summaryrefslogtreecommitdiffstats
path: root/tools/layoutlib
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2010-11-01 18:45:20 -0700
committerXavier Ducrohet <xav@android.com>2010-11-01 18:45:20 -0700
commitabff653ce84e5079f35afab008c906063b0b2b6c (patch)
tree80bcc1121378c031cd99ea097bb422ebd3666394 /tools/layoutlib
parent5802deabf06a0754c36e990ce2af7b5c8727e543 (diff)
downloadframeworks_base-abff653ce84e5079f35afab008c906063b0b2b6c.zip
frameworks_base-abff653ce84e5079f35afab008c906063b0b2b6c.tar.gz
frameworks_base-abff653ce84e5079f35afab008c906063b0b2b6c.tar.bz2
More layout Canvas/Paint implementation.
Change-Id: Ib3da4a4b2259dc7c53b24444b5c0b78cee15d387
Diffstat (limited to 'tools/layoutlib')
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java126
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java71
2 files changed, 161 insertions, 36 deletions
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
index 2b54711..e7996ed 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
@@ -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));
-
+ Graphics2D g = (Graphics2D) canvasDelegate.getGraphics2d().create();
+ try {
+ if (paintDelegate.isAntiAliased()) {
+ g.setRenderingHint(
+ RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ }
- // 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;
+ // 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();
- try {
+ 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,
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
index f2602b5..6074bd3 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
@@ -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);