diff options
Diffstat (limited to 'native/webview/plat_support/graphics_utils.cpp')
-rw-r--r-- | native/webview/plat_support/graphics_utils.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/native/webview/plat_support/graphics_utils.cpp b/native/webview/plat_support/graphics_utils.cpp new file mode 100644 index 000000000000..89beb754b52c --- /dev/null +++ b/native/webview/plat_support/graphics_utils.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Provides a webviewchromium glue layer adapter from the internal Android +// graphics types into the types the chromium stack expects, and back. + +#define LOG_TAG "webviewchromium_plat_support" + +#include "draw_gl.h" +#include "draw_sw.h" + +#include <cstdlib> +#include <jni.h> +#include <utils/Log.h> +#include "graphic_buffer_impl.h" +#include "GraphicsJNI.h" +#include "SkCanvasStateUtils.h" +#include "SkGraphics.h" +#include "SkPicture.h" + +#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) + +namespace android { +namespace { + +class PixelInfo : public AwPixelInfo { + public: + explicit PixelInfo(android::Canvas* canvas); + ~PixelInfo(); +}; + + +PixelInfo::PixelInfo(android::Canvas* canvas) { + memset(this, 0, sizeof(AwPixelInfo)); + version = kAwPixelInfoVersion; + state = canvas->captureCanvasState(); +} + +PixelInfo::~PixelInfo() { + if (state) + SkCanvasStateUtils::ReleaseCanvasState(state); +} + +AwPixelInfo* GetPixels(JNIEnv* env, jobject java_canvas) { + android::Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, java_canvas); + if (!nativeCanvas) + return NULL; + + PixelInfo* pixels = new PixelInfo(nativeCanvas); + if (!pixels->state) { + delete pixels; + pixels = NULL; + } + return pixels; +} + +void ReleasePixels(AwPixelInfo* pixels) { + delete static_cast<PixelInfo*>(pixels); +} + +jlong GetDrawSWFunctionTable(JNIEnv* env, jclass) { + static AwDrawSWFunctionTable function_table; + function_table.version = kAwDrawSWFunctionTableVersion; + function_table.access_pixels = &GetPixels; + function_table.release_pixels = &ReleasePixels; + return reinterpret_cast<intptr_t>(&function_table); +} + +jlong GetDrawGLFunctionTable(JNIEnv* env, jclass) { + static AwDrawGLFunctionTable function_table; + function_table.version = kAwDrawGLFunctionTableVersion; + function_table.create_graphic_buffer = &GraphicBufferImpl::Create; + function_table.release_graphic_buffer = &GraphicBufferImpl::Release; + function_table.map = &GraphicBufferImpl::MapStatic; + function_table.unmap = &GraphicBufferImpl::UnmapStatic; + function_table.get_native_buffer = &GraphicBufferImpl::GetNativeBufferStatic; + function_table.get_stride = &GraphicBufferImpl::GetStrideStatic; + return reinterpret_cast<intptr_t>(&function_table); +} + +const char kClassName[] = "com/android/webview/chromium/GraphicsUtils"; +const JNINativeMethod kJniMethods[] = { + { "nativeGetDrawSWFunctionTable", "()J", + reinterpret_cast<void*>(GetDrawSWFunctionTable) }, + { "nativeGetDrawGLFunctionTable", "()J", + reinterpret_cast<void*>(GetDrawGLFunctionTable) }, +}; + +} // namespace + +void RegisterGraphicsUtils(JNIEnv* env) { + jclass clazz = env->FindClass(kClassName); + LOG_ALWAYS_FATAL_IF(!clazz, "Unable to find class '%s'", kClassName); + + int res = env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods)); + LOG_ALWAYS_FATAL_IF(res < 0, "register native methods failed: res=%d", res); +} + +} // namespace android |