summaryrefslogtreecommitdiff
path: root/chromium/plat_support
diff options
context:
space:
mode:
authorTorne (Richard Coles) <torne@google.com>2013-09-12 12:14:12 +0100
committerTorne (Richard Coles) <torne@google.com>2013-09-12 12:14:12 +0100
commit2479270939ee95cbf8f7f1f2f20d7d68b66bb1d2 (patch)
tree4b8ba6fae8a783750df7c75a04e68b32eaa1d413 /chromium/plat_support
parenta68073f3c0ef06b8a5c0a6c71cf33bc1f37664b9 (diff)
parentf2a866b33d4874f6bcda37e593f83df1b1fb2fd2 (diff)
downloadwebview-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.cpp26
-rw-r--r--chromium/plat_support/graphics_utils.cpp109
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) {