merge in oc-dr1-release history after reset to master
diff --git a/chromium/plat_support/graphics_utils.cpp b/chromium/plat_support/graphics_utils.cpp
index 89beb75..5d8d0a5 100644
--- a/chromium/plat_support/graphics_utils.cpp
+++ b/chromium/plat_support/graphics_utils.cpp
@@ -38,15 +38,15 @@
 
 class PixelInfo : public AwPixelInfo {
  public:
-  explicit PixelInfo(android::Canvas* canvas);
+  explicit PixelInfo(SkCanvas* canvas);
   ~PixelInfo();
 };
 
 
-PixelInfo::PixelInfo(android::Canvas* canvas) {
+PixelInfo::PixelInfo(SkCanvas* canvas) {
   memset(this, 0, sizeof(AwPixelInfo));
   version = kAwPixelInfoVersion;
-  state = canvas->captureCanvasState();
+  state = SkCanvasStateUtils::CaptureCanvasState(canvas);
 }
 
 PixelInfo::~PixelInfo() {
@@ -59,7 +59,21 @@
   if (!nativeCanvas)
     return NULL;
 
-  PixelInfo* pixels = new PixelInfo(nativeCanvas);
+  SkCanvas* canvas = nativeCanvas->asSkCanvas();
+  if (!canvas)
+    return NULL;
+
+  // Workarounds for http://crbug.com/271096: SW draw only supports
+  // translate & scale transforms, and a simple rectangular clip.
+  // (This also avoids significant wasted time in calling
+  // SkCanvasStateUtils::CaptureCanvasState when the clip is complex).
+  if (!canvas->isClipRect() ||
+      (canvas->getTotalMatrix().getType() &
+                ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask))) {
+    return NULL;
+  }
+
+  PixelInfo* pixels = new PixelInfo(canvas);
   if (!pixels->state) {
       delete pixels;
       pixels = NULL;