summaryrefslogtreecommitdiffstats
path: root/graphics/java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2009-09-28 17:33:54 -0700
committerDianne Hackborn <hackbod@google.com>2009-09-28 17:33:54 -0700
commitafa78967b8553443aa32579d78970a076d7581f6 (patch)
tree5ba752438ef737e3b2a140b6fb42bd0bd6661091 /graphics/java
parentebd45e5ca9690110ecb50c26b0b791054ee4c0ef (diff)
downloadframeworks_base-afa78967b8553443aa32579d78970a076d7581f6.zip
frameworks_base-afa78967b8553443aa32579d78970a076d7581f6.tar.gz
frameworks_base-afa78967b8553443aa32579d78970a076d7581f6.tar.bz2
Hack to fix issue #2125365: Sports Trivia compatability with Eclair
Adds a mechanism to tell Paint the scaling factor its target canvas will have, for it to compute font metrics based on the correct font size. Only TextView uses this, but that is enough for the large majority of apps. Change-Id: I6cacaa0dd26d40ee3ad959bed0028678d6e9016e
Diffstat (limited to 'graphics/java')
-rw-r--r--graphics/java/android/graphics/Paint.java126
1 files changed, 114 insertions, 12 deletions
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 862e827..3d6d273 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -36,6 +36,10 @@ public class Paint {
private Typeface mTypeface;
private Xfermode mXfermode;
+ private boolean mHasCompatScaling;
+ private float mCompatScaling;
+ private float mInvCompatScaling;
+
private static final Style[] sStyleArray = {
Style.FILL, Style.STROKE, Style.FILL_AND_STROKE
};
@@ -189,6 +193,7 @@ public class Paint {
public Paint(int flags) {
mNativePaint = native_init();
setFlags(flags | DEFAULT_PAINT_FLAGS);
+ mCompatScaling = mInvCompatScaling = 1;
}
/**
@@ -200,12 +205,17 @@ public class Paint {
*/
public Paint(Paint paint) {
mNativePaint = native_initWithPaint(paint.mNativePaint);
+ mHasCompatScaling = paint.mHasCompatScaling;
+ mCompatScaling = paint.mCompatScaling;
+ mInvCompatScaling = paint.mInvCompatScaling;
}
/** Restores the paint to its default settings. */
public void reset() {
native_reset(mNativePaint);
setFlags(DEFAULT_PAINT_FLAGS);
+ mHasCompatScaling = false;
+ mCompatScaling = mInvCompatScaling = 1;
}
/**
@@ -225,9 +235,24 @@ public class Paint {
mShader = src.mShader;
mTypeface = src.mTypeface;
mXfermode = src.mXfermode;
+ mHasCompatScaling = src.mHasCompatScaling;
+ mCompatScaling = src.mCompatScaling;
+ mInvCompatScaling = src.mInvCompatScaling;
}
}
+ /** @hide */
+ public void setCompatibilityScaling(float factor) {
+ if (factor == 1.0) {
+ mHasCompatScaling = false;
+ mCompatScaling = mInvCompatScaling = 1.0f;
+ } else {
+ mHasCompatScaling = true;
+ mCompatScaling = factor;
+ mInvCompatScaling = 1.0f/factor;
+ }
+ }
+
/**
* Return the paint's flags. Use the Flag enum to test flag values.
*
@@ -972,8 +997,17 @@ public class Paint {
* @param count THe number of characters to measure, beginning with start
* @return The width of the text
*/
- public native float measureText(char[] text, int index, int count);
+ public float measureText(char[] text, int index, int count) {
+ if (!mHasCompatScaling) return native_measureText(text, index, count);
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ float w = native_measureText(text, index, count);
+ setTextSize(oldSize);
+ return w*mInvCompatScaling;
+ }
+ private native float native_measureText(char[] text, int index, int count);
+
/**
* Return the width of the text.
*
@@ -982,16 +1016,34 @@ public class Paint {
* @param end 1 beyond the index of the last character to measure
* @return The width of the text
*/
- public native float measureText(String text, int start, int end);
+ public float measureText(String text, int start, int end) {
+ if (!mHasCompatScaling) return native_measureText(text, start, end);
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ float w = native_measureText(text, start, end);
+ setTextSize(oldSize);
+ return w*mInvCompatScaling;
+ }
+ private native float native_measureText(String text, int start, int end);
+
/**
* Return the width of the text.
*
* @param text The text to measure
* @return The width of the text
*/
- public native float measureText(String text);
+ public float measureText(String text) {
+ if (!mHasCompatScaling) return native_measureText(text);
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ float w = native_measureText(text);
+ setTextSize(oldSize);
+ return w*mInvCompatScaling;
+ }
+ private native float native_measureText(String text);
+
/**
* Return the width of the text.
*
@@ -1013,10 +1065,10 @@ public class Paint {
}
char[] buf = TemporaryBuffer.obtain(end - start);
- TextUtils.getChars(text, start, end, buf, 0);
- float result = measureText(buf, 0, end - start);
+ TextUtils.getChars(text, start, end, buf, 0);
+ float result = measureText(buf, 0, end - start);
TemporaryBuffer.recycle(buf);
- return result;
+ return result;
}
/**
@@ -1036,8 +1088,22 @@ public class Paint {
* @return The number of chars that were measured. Will always be <=
* abs(count).
*/
- public native int breakText(char[] text, int index, int count,
- float maxWidth, float[] measuredWidth);
+ public int breakText(char[] text, int index, int count,
+ float maxWidth, float[] measuredWidth) {
+ if (!mHasCompatScaling) {
+ return native_breakText(text, index, count, maxWidth, measuredWidth);
+ }
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ int res = native_breakText(text, index, count, maxWidth*mCompatScaling,
+ measuredWidth);
+ setTextSize(oldSize);
+ if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
+ return res;
+ }
+
+ public native int native_breakText(char[] text, int index, int count,
+ float maxWidth, float[] measuredWidth);
/**
* Measure the text, stopping early if the measured width exceeds maxWidth.
@@ -1094,8 +1160,22 @@ public class Paint {
* @return The number of chars that were measured. Will always be <=
* abs(count).
*/
- public native int breakText(String text, boolean measureForwards,
- float maxWidth, float[] measuredWidth);
+ public int breakText(String text, boolean measureForwards,
+ float maxWidth, float[] measuredWidth) {
+ if (!mHasCompatScaling) {
+ return native_breakText(text, measureForwards, maxWidth, measuredWidth);
+ }
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ int res = native_breakText(text, measureForwards, maxWidth*mCompatScaling,
+ measuredWidth);
+ setTextSize(oldSize);
+ if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
+ return res;
+ }
+
+ public native int native_breakText(String text, boolean measureForwards,
+ float maxWidth, float[] measuredWidth);
/**
* Return the advance widths for the characters in the string.
@@ -1113,7 +1193,18 @@ public class Paint {
|| count > widths.length) {
throw new ArrayIndexOutOfBoundsException();
}
- return native_getTextWidths(mNativePaint, text, index, count, widths);
+
+ if (!mHasCompatScaling) {
+ return native_getTextWidths(mNativePaint, text, index, count, widths);
+ }
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ int res = native_getTextWidths(mNativePaint, text, index, count, widths);
+ setTextSize(oldSize);
+ for (int i=0; i<res; i++) {
+ widths[i] *= mInvCompatScaling;
+ }
+ return res;
}
/**
@@ -1164,7 +1255,18 @@ public class Paint {
if (end - start > widths.length) {
throw new ArrayIndexOutOfBoundsException();
}
- return native_getTextWidths(mNativePaint, text, start, end, widths);
+
+ if (!mHasCompatScaling) {
+ return native_getTextWidths(mNativePaint, text, start, end, widths);
+ }
+ final float oldSize = getTextSize();
+ setTextSize(oldSize*mCompatScaling);
+ int res = native_getTextWidths(mNativePaint, text, start, end, widths);
+ setTextSize(oldSize);
+ for (int i=0; i<res; i++) {
+ widths[i] *= mInvCompatScaling;
+ }
+ return res;
}
/**