diff options
author | Torne (Richard Coles) <torne@google.com> | 2013-09-12 12:14:12 +0100 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2013-09-12 12:14:12 +0100 |
commit | 2479270939ee95cbf8f7f1f2f20d7d68b66bb1d2 (patch) | |
tree | 4b8ba6fae8a783750df7c75a04e68b32eaa1d413 /chromium/plat_support | |
parent | a68073f3c0ef06b8a5c0a6c71cf33bc1f37664b9 (diff) | |
parent | f2a866b33d4874f6bcda37e593f83df1b1fb2fd2 (diff) | |
download | webview-2479270939ee95cbf8f7f1f2f20d7d68b66bb1d2.tar.gz |
Merge master-chromium into master at r222756
This commit was generated by merge_to_master.py.
Change-Id: Ic5aa443a2c3226f2213b40627871fb6d31282d26
Diffstat (limited to 'chromium/plat_support')
-rw-r--r-- | chromium/plat_support/draw_gl_functor.cpp | 26 | ||||
-rw-r--r-- | chromium/plat_support/graphics_utils.cpp | 109 |
2 files changed, 35 insertions, 100 deletions
diff --git a/chromium/plat_support/draw_gl_functor.cpp b/chromium/plat_support/draw_gl_functor.cpp index c07e2db..d83ead7 100644 --- a/chromium/plat_support/draw_gl_functor.cpp +++ b/chromium/plat_support/draw_gl_functor.cpp @@ -21,8 +21,12 @@ #include "android_webview/public/browser/draw_gl.h" +#include <errno.h> #include <jni.h> #include <private/hwui/DrawGlInfo.h> +#include <string.h> +#include <sys/resource.h> +#include <sys/time.h> #include <utils/Functor.h> #include <utils/Log.h> @@ -97,7 +101,29 @@ class DrawGLFunctor : public Functor { int view_context_; }; +// Raise the file handle soft limit to the hard limit since gralloc buffers +// uses file handles. +void RaiseFileNumberLimit() { + static bool have_raised_limit = false; + if (have_raised_limit) + return; + + have_raised_limit = true; + struct rlimit limit_struct; + limit_struct.rlim_cur = 0; + limit_struct.rlim_max = 0; + if (getrlimit(RLIMIT_NOFILE, &limit_struct) == 0) { + limit_struct.rlim_cur = limit_struct.rlim_max; + if (setrlimit(RLIMIT_NOFILE, &limit_struct) != 0) { + ALOGE("setrlimit failed: %s", strerror(errno)); + } + } else { + ALOGE("getrlimit failed: %s", strerror(errno)); + } +} + jint CreateGLFunctor(JNIEnv*, jclass, jint view_context) { + RaiseFileNumberLimit(); return reinterpret_cast<jint>(new DrawGLFunctor(view_context)); } diff --git a/chromium/plat_support/graphics_utils.cpp b/chromium/plat_support/graphics_utils.cpp index d504dbf..e584f93 100644 --- a/chromium/plat_support/graphics_utils.cpp +++ b/chromium/plat_support/graphics_utils.cpp @@ -26,9 +26,9 @@ #include <jni.h> #include <UniquePtr.h> #include <utils/Log.h> -#include <utils/Vector.h> #include "graphic_buffer_impl.h" #include "GraphicsJNI.h" +#include "SkCanvasStateUtils.h" #include "SkGraphics.h" #include "SkPicture.h" @@ -39,112 +39,20 @@ namespace { class PixelInfo : public AwPixelInfo { public: - PixelInfo(SkCanvas* canvas, const SkBitmap* bitmap); + PixelInfo(SkCanvas* canvas); ~PixelInfo(); - - void AddRectToClip(const SkIRect& rect); - - private: - const SkBitmap* bitmap_; - SkAutoLockPixels bitmap_locker_; - Vector<int> clip_rect_storage_; }; -class ClipValidator : public SkCanvas::ClipVisitor { - public: - ClipValidator() : failed_(false) {} - bool failed() { return failed_; } - - // ClipVisitor - virtual void clipRect(const SkRect& rect, SkRegion::Op op, bool antialias) { - failed_ |= antialias; - } - - virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) { - failed_ |= antialias; - } - private: - bool failed_; -}; - -PixelInfo::PixelInfo(SkCanvas* canvas, const SkBitmap* bitmap) - : bitmap_(bitmap), - bitmap_locker_(*bitmap) { +PixelInfo::PixelInfo(SkCanvas* canvas) { memset(this, 0, sizeof(AwPixelInfo)); version = kAwPixelInfoVersion; + state = SkCanvasStateUtils::CaptureCanvasState(canvas); } -PixelInfo::~PixelInfo() {} - -void PixelInfo::AddRectToClip(const SkIRect& rect) { - ALOG_ASSERT(rect.width() >= 0 && rect.height() >= 0); - clip_rect_storage_.push_back(rect.x()); - clip_rect_storage_.push_back(rect.y()); - clip_rect_storage_.push_back(rect.width()); - clip_rect_storage_.push_back(rect.height()); - clip_rects = const_cast<int*>(clip_rect_storage_.array()); - clip_rect_count = clip_rect_storage_.size() / 4; -} - -PixelInfo* TryToCreatePixelInfo(SkCanvas* canvas) { - // Check the clip can decompose into simple rectangles. This validator is - // not a perfect guarantee, but it's the closest I can do with the current - // API. TODO: compile this out in release builds as currently Java canvases - // do not allow for antialiased clip. - ClipValidator validator; - canvas->replayClips(&validator); - if (validator.failed()) - return NULL; - - SkCanvas::LayerIter layer(SkCanvas::LayerIter(canvas, false)); - if (layer.done()) - return NULL; - SkDevice* device = layer.device(); - if (!device) - return NULL; - const SkBitmap* bitmap = &device->accessBitmap(true); - if (!bitmap->lockPixelsAreWritable()) - return NULL; - const SkRegion& region = layer.clip(); - layer.next(); - // Currently don't handle multiple layers well, so early out - // TODO: Return all layers in PixelInfo - if (!layer.done()) - return NULL; - - UniquePtr<PixelInfo> pixels(new PixelInfo(canvas, bitmap)); - pixels->config = - bitmap->config() == SkBitmap::kARGB_8888_Config ? AwConfig_ARGB_8888 : - bitmap->config() == SkBitmap::kARGB_4444_Config ? AwConfig_ARGB_4444 : - bitmap->config() == SkBitmap::kRGB_565_Config ? AwConfig_RGB_565 : -1; - if (pixels->config < 0) - return NULL; - - pixels->width = bitmap->width(); - pixels->height = bitmap->height(); - pixels->row_bytes = bitmap->rowBytes(); - pixels->pixels = bitmap->getPixels(); - const SkMatrix& matrix = layer.matrix(); - for (int i = 0; i < 9; i++) { - pixels->matrix[i] = matrix.get(i); - } - - if (region.isEmpty()) { - pixels->AddRectToClip(region.getBounds()); - } else { - SkRegion::Iterator clip_iterator(region); - for (; !clip_iterator.done(); clip_iterator.next()) { - pixels->AddRectToClip(clip_iterator.rect()); - } - } - - // WebViewClassic used the DrawFilter for its own purposes (e.g. disabling - // dithering when zooming/scrolling) so for now at least, just ignore any - // client supplied DrawFilter. - ALOGW_IF(canvas->getDrawFilter(), - "DrawFilter not supported in webviewchromium, will be ignored"); - return pixels.release(); +PixelInfo::~PixelInfo() { + if (state) + SkCanvasStateUtils::ReleaseCanvasState(state); } AwPixelInfo* GetPixels(JNIEnv* env, jobject java_canvas) { @@ -152,7 +60,8 @@ AwPixelInfo* GetPixels(JNIEnv* env, jobject java_canvas) { if (!canvas) return NULL; - return TryToCreatePixelInfo(canvas); + UniquePtr<PixelInfo> pixels(new PixelInfo(canvas)); + return pixels->state ? pixels.release() : NULL; } void ReleasePixels(AwPixelInfo* pixels) { |