summaryrefslogtreecommitdiffstats
path: root/Source/WebCore
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore')
-rw-r--r--Source/WebCore/bridge/jni/JavaMethodJobject.cpp2
-rw-r--r--Source/WebCore/bridge/jni/jsc/JavaFieldJSC.cpp6
-rw-r--r--Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp15
-rw-r--r--Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp13
-rw-r--r--Source/WebCore/platform/graphics/android/FontAndroid.cpp1
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp2
-rw-r--r--Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp7
-rw-r--r--Source/WebCore/platform/graphics/android/ShaderProgram.cpp36
-rw-r--r--Source/WebCore/platform/graphics/android/ShaderProgram.h6
9 files changed, 72 insertions, 16 deletions
diff --git a/Source/WebCore/bridge/jni/JavaMethodJobject.cpp b/Source/WebCore/bridge/jni/JavaMethodJobject.cpp
index 73cae54..01a0b5b 100644
--- a/Source/WebCore/bridge/jni/JavaMethodJobject.cpp
+++ b/Source/WebCore/bridge/jni/JavaMethodJobject.cpp
@@ -45,7 +45,7 @@ JavaMethodJobject::JavaMethodJobject(JNIEnv* env, jobject aMethod)
// Get return type name
jstring returnTypeName = 0;
if (jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;")) {
- returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
+ returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
if (!returnTypeName)
returnTypeName = env->NewStringUTF("<Unknown>");
env->DeleteLocalRef(returnType);
diff --git a/Source/WebCore/bridge/jni/jsc/JavaFieldJSC.cpp b/Source/WebCore/bridge/jni/jsc/JavaFieldJSC.cpp
index b7c664e..ee18f66 100644
--- a/Source/WebCore/bridge/jni/jsc/JavaFieldJSC.cpp
+++ b/Source/WebCore/bridge/jni/jsc/JavaFieldJSC.cpp
@@ -44,19 +44,23 @@ JavaField::JavaField(JNIEnv* env, jobject aField)
{
// Get field type name
jstring fieldTypeName = 0;
- if (jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"))
+ jclass fieldType = static_cast<jclass>(callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"));
+ if (fieldType)
fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
if (!fieldTypeName)
fieldTypeName = env->NewStringUTF("<Unknown>");
m_typeClassName = JavaString(env, fieldTypeName);
m_type = javaTypeFromClassName(m_typeClassName.utf8());
+ env->DeleteLocalRef(fieldType);
+ env->DeleteLocalRef(fieldTypeName);
// Get field name
jstring fieldName = static_cast<jstring>(callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;"));
if (!fieldName)
fieldName = env->NewStringUTF("<Unknown>");
m_name = JavaString(env, fieldName);
+ env->DeleteLocalRef(fieldName);
m_field = new JobjectWrapper(aField);
}
diff --git a/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp b/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp
index 0d1a9f2..a731fe1 100644
--- a/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp
+++ b/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp
@@ -107,7 +107,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
env->SetByteArrayRegion(static_cast<jbyteArray>(javaArray), i, 1, &bVal);
}
- } else if (!strcmp(javaClassName.data(), "[C")) {
+ } else if (!strcmp(javaClassName.data(), "[C")) {
// array of chars
javaArray = env->NewCharArray(length);
// Now iterate over each element and add to the array.
@@ -123,7 +123,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
env->SetCharArrayRegion(static_cast<jcharArray>(javaArray), i, 1, &cVal);
}
- } else if (!strcmp(javaClassName.data(), "[D")) {
+ } else if (!strcmp(javaClassName.data(), "[D")) {
// array of doubles
javaArray = env->NewDoubleArray(length);
// Now iterate over each element and add to the array.
@@ -135,7 +135,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
env->SetDoubleArrayRegion(static_cast<jdoubleArray>(javaArray), i, 1, &dVal);
}
}
- } else if (!strcmp(javaClassName.data(), "[F")) {
+ } else if (!strcmp(javaClassName.data(), "[F")) {
// array of floats
javaArray = env->NewFloatArray(length);
// Now iterate over each element and add to the array.
@@ -147,7 +147,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
env->SetFloatArrayRegion(static_cast<jfloatArray>(javaArray), i, 1, &fVal);
}
}
- } else if (!strcmp(javaClassName.data(), "[I")) {
+ } else if (!strcmp(javaClassName.data(), "[I")) {
// array of ints
javaArray = env->NewIntArray(length);
// Now iterate over each element and add to the array.
@@ -162,7 +162,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
env->SetIntArrayRegion(static_cast<jintArray>(javaArray), i, 1, &iVal);
}
- } else if (!strcmp(javaClassName.data(), "[J")) {
+ } else if (!strcmp(javaClassName.data(), "[J")) {
// array of longs
javaArray = env->NewLongArray(length);
// Now iterate over each element and add to the array.
@@ -177,7 +177,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
env->SetLongArrayRegion(static_cast<jlongArray>(javaArray), i, 1, &jVal);
}
- } else if (!strcmp(javaClassName.data(), "[S")) {
+ } else if (!strcmp(javaClassName.data(), "[S")) {
// array of shorts
javaArray = env->NewShortArray(length);
// Now iterate over each element and add to the array.
@@ -192,7 +192,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
env->SetShortArrayRegion(static_cast<jshortArray>(javaArray), i, 1, &sVal);
}
- } else if (!strcmp(javaClassName.data(), "[Z")) {
+ } else if (!strcmp(javaClassName.data(), "[Z")) {
// array of booleans
javaArray = env->NewBooleanArray(length);
// Now iterate over each element and add to the array.
@@ -210,6 +210,7 @@ JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass)
}
result.m_objectValue = adoptRef(new JavaInstanceJobject(javaArray));
+ env->DeleteLocalRef(javaArray);
}
break;
#endif // PLATFORM(ANDROID)
diff --git a/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp
index 0fe5837..fb23cf5 100644
--- a/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp
+++ b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp
@@ -33,14 +33,23 @@ using namespace JSC::Bindings;
JavaFieldJobject::JavaFieldJobject(JNIEnv* env, jobject aField)
{
// Get field type
- jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;");
- jstring fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+ jstring fieldTypeName = 0;
+ jclass fieldType = static_cast<jclass>(callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"));
+ if (fieldType)
+ fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+ if (!fieldTypeName)
+ fieldTypeName = env->NewStringUTF("<Unknown>");
m_typeClassName = JavaString(env, fieldTypeName);
m_type = javaTypeFromClassName(m_typeClassName.utf8());
+ env->DeleteLocalRef(fieldType);
+ env->DeleteLocalRef(fieldTypeName);
// Get field name
jstring fieldName = static_cast<jstring>(callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;"));
+ if (!fieldName)
+ fieldName = env->NewStringUTF("<Unknown>");
m_name = JavaString(env, fieldName);
+ env->DeleteLocalRef(fieldName);
m_field = new JobjectWrapper(aField);
}
diff --git a/Source/WebCore/platform/graphics/android/FontAndroid.cpp b/Source/WebCore/platform/graphics/android/FontAndroid.cpp
index 31589e3..674938b 100644
--- a/Source/WebCore/platform/graphics/android/FontAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/FontAndroid.cpp
@@ -99,6 +99,7 @@ static bool setupForText(SkPaint* paint, GraphicsContext* gc,
SkLayerDrawLooper::LayerInfo info;
info.fPaintBits = SkLayerDrawLooper::kEntirePaint_Bits;
info.fColorMode = SkXfermode::kSrc_Mode;
+ info.fFlagsMask = SkPaint::kAllFlags;
// The paint is only valid until the looper receives another call to
// addLayer(). Therefore, we must cache certain state for later use.
diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
index e07c86f..bc07925 100644
--- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -473,7 +473,7 @@ double GLWebViewState::setupDrawing(IntRect& viewRect, SkRect& visibleRect,
glUseProgram(shader->program());
glUniform1i(shader->textureSampler(), 0);
shader->setViewRect(viewRect);
- shader->setViewport(visibleRect);
+ shader->setViewport(visibleRect, scale);
shader->setWebViewRect(webViewRect);
shader->setTitleBarHeight(titleBarHeight);
shader->setScreenClip(screenClip);
diff --git a/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
index aa30035..40d25e4 100644
--- a/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
@@ -693,6 +693,13 @@ bool GraphicsLayerAndroid::addAnimation(const KeyframeValueList& valueList,
const String& keyframesName,
double beginTime)
{
+ // For now, let webkit deals with the animations -- the current UI-side
+ // animation code has some annoying bugs, and we improved communication
+ // between webkit and UI enough that performance-wise it's not so much
+ // a problem to let webkit do everything.
+ // TODO: re-enable UI-side animations
+ return false;
+
if (!anim || anim->isEmptyOrZeroDuration() || valueList.size() < 2)
return false;
diff --git a/Source/WebCore/platform/graphics/android/ShaderProgram.cpp b/Source/WebCore/platform/graphics/android/ShaderProgram.cpp
index bf5f760..536d228 100644
--- a/Source/WebCore/platform/graphics/android/ShaderProgram.cpp
+++ b/Source/WebCore/platform/graphics/android/ShaderProgram.cpp
@@ -235,6 +235,8 @@ void ShaderProgram::init()
glBufferData(GL_ARRAY_BUFFER, 2 * 4 * sizeof(GLfloat), coord, GL_STATIC_DRAW);
GLUtils::checkGlError("init");
+
+ memset(m_webViewMatrix, 0, sizeof(m_webViewMatrix));
}
void ShaderProgram::resetBlending()
@@ -262,13 +264,14 @@ void ShaderProgram::setBlendingState(bool enableBlending)
// Drawing
/////////////////////////////////////////////////////////////////////////////////////////
-void ShaderProgram::setViewport(SkRect& viewport)
+void ShaderProgram::setViewport(SkRect& viewport, float scale)
{
TransformationMatrix ortho;
GLUtils::setOrthographicMatrix(ortho, viewport.fLeft, viewport.fTop,
viewport.fRight, viewport.fBottom, -1000, 1000);
m_projectionMatrix = ortho;
m_viewport = viewport;
+ m_currentScale = scale;
}
void ShaderProgram::setProjectionMatrix(SkRect& geometry, GLint projectionMatrixHandle)
@@ -277,8 +280,29 @@ void ShaderProgram::setProjectionMatrix(SkRect& geometry, GLint projectionMatrix
translate.translate3d(geometry.fLeft, geometry.fTop, 0.0);
TransformationMatrix scale;
scale.scale3d(geometry.width(), geometry.height(), 1.0);
-
- TransformationMatrix total = m_projectionMatrix * translate * scale;
+ // Translate float* to TransformationMatrix
+ TransformationMatrix webViewTransformMatrix(
+ m_webViewMatrix[0], m_webViewMatrix[1], m_webViewMatrix[2], m_webViewMatrix[3],
+ m_webViewMatrix[4], m_webViewMatrix[5], m_webViewMatrix[6], m_webViewMatrix[7],
+ m_webViewMatrix[8], m_webViewMatrix[9], m_webViewMatrix[10], m_webViewMatrix[11],
+ m_webViewMatrix[12], m_webViewMatrix[13], m_webViewMatrix[14], m_webViewMatrix[15] );
+
+
+ TransformationMatrix reposition;
+ // After the webViewTranform, we need to reposition the rect to match our viewport.
+ reposition.translate3d(-m_webViewRect.x(), -m_webViewRect.y() - m_titleBarHeight, 0);
+ reposition.translate3d(m_viewport.fLeft * m_currentScale, m_viewport.fTop * m_currentScale, 0);
+
+ // Basically, the webViewTransformMatrix should apply on the screen resolution.
+ // So we start by doing the scale and translate to get each tile into screen coordinates.
+ // After applying the webViewTransformMatrix, b/c the way it currently set up
+ // for scroll and titlebar, we need to offset both of them.
+ // Finally, map everything back to (-1, 1) by using the m_projectionMatrix.
+ // TODO: Given that webViewTransformMatrix contains most of the tranformation
+ // information, we should be able to get rid of some parameter we got from
+ // Java side and simplify our code.
+ TransformationMatrix total =
+ m_projectionMatrix * reposition * webViewTransformMatrix * translate * scale;
GLfloat projectionMatrix[16];
GLUtils::toGLMatrix(projectionMatrix, total);
@@ -573,6 +597,12 @@ void ShaderProgram::drawVideoLayerQuad(const TransformationMatrix& drawMatrix,
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
+void ShaderProgram::setWebViewMatrix(float* matrix)
+{
+ if (matrix)
+ memcpy(m_webViewMatrix, matrix, sizeof(m_webViewMatrix));
+}
+
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
diff --git a/Source/WebCore/platform/graphics/android/ShaderProgram.h b/Source/WebCore/platform/graphics/android/ShaderProgram.h
index d8447bf..f31eb91 100644
--- a/Source/WebCore/platform/graphics/android/ShaderProgram.h
+++ b/Source/WebCore/platform/graphics/android/ShaderProgram.h
@@ -39,7 +39,7 @@ public:
int program() { return m_program; }
// Drawing
- void setViewport(SkRect& viewport);
+ void setViewport(SkRect& viewport, float scale);
float zValue(const TransformationMatrix& drawMatrix, float w, float h);
// For drawQuad and drawLayerQuad, they can handle 3 cases for now:
@@ -88,6 +88,7 @@ public:
contrast = MAX_CONTRAST;
m_contrast = contrast;
}
+ void setWebViewMatrix(float* matrix);
private:
GLuint loadShader(GLenum shaderType, const char* pSource);
@@ -149,6 +150,9 @@ private:
// attribs
GLint m_hPosition;
GLint m_hVideoPosition;
+
+ float m_webViewMatrix[16];
+ float m_currentScale;
};
} // namespace WebCore