diff options
Diffstat (limited to 'Source/WebCore')
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 |