Reapply r5364 (Update ARM and NEON optimizations for S32A_Opaque_BlitRow32)

This reverts r5378.

Review URL: https://codereview.appspot.com/6815056

git-svn-id: http://skia.googlecode.com/svn/trunk@6727 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index cc06e04..716998f 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -1051,6 +1051,10 @@
         this->updateMatrix();
     }
 
+    if (fMeasureFPS) {
+        fMeasureFPS_Time = 0;
+    }
+
     if (fNClip) {
         this->INHERITED::draw(canvas);
         SkBitmap orig = capture_bitmap(canvas);
@@ -1111,6 +1115,11 @@
         magnify(canvas);
     }
 
+    if (fMeasureFPS && fMeasureFPS_Time) {
+        this->updateTitle();
+        this->postInvalDelay();
+    }
+
     // do this last
     fDevManager->publishCanvas(fDeviceType, canvas, this);
 }
@@ -1396,10 +1405,8 @@
     }
 
     // Do this after presentGL and other finishing, rather than in afterChild
-    if (fMeasureFPS && fMeasureFPS_Time) {
-        fMeasureFPS_Time = SkTime::GetMSecs() - fMeasureFPS_Time;
-        this->updateTitle();
-        this->postInvalDelay();
+    if (fMeasureFPS && fMeasureFPS_StartTime) {
+        fMeasureFPS_Time += SkTime::GetMSecs() - fMeasureFPS_StartTime;
     }
 
     //    if ((fScrollTestX | fScrollTestY) != 0)
@@ -1471,9 +1478,8 @@
     this->installDrawFilter(canvas);
 
     if (fMeasureFPS) {
-        fMeasureFPS_Time = 0;   // 0 means the child is not aware of repeat-draw
         if (SampleView::SetRepeatDraw(child, FPS_REPEAT_COUNT)) {
-            fMeasureFPS_Time = SkTime::GetMSecs();
+            fMeasureFPS_StartTime = SkTime::GetMSecs();
         }
     } else {
         (void)SampleView::SetRepeatDraw(child, 1);
@@ -1778,6 +1784,13 @@
     }
 
     switch (uni) {
+        case 'b':
+            {
+            postEventToSink(SkNEW_ARGS(SkEvent, ("PictFileView::toggleBBox")), curr_view(this));
+            this->updateTitle();
+            this->inval(NULL);
+            break;
+            }
         case 'B':
 //            gIgnoreFastBlurRect = !gIgnoreFastBlurRect;
             this->inval(NULL);
diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h
index 85392e0..2308a12 100644
--- a/samplecode/SampleApp.h
+++ b/samplecode/SampleApp.h
@@ -168,6 +168,7 @@
     bool fRequestGrabImage;
     bool fMeasureFPS;
     SkMSec fMeasureFPS_Time;
+    SkMSec fMeasureFPS_StartTime;
     bool fMagnify;
     SkISize fTileCount;
 
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index 22c81d1..b53ba83 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -13,6 +13,7 @@
 #include "SkGradientShader.h"
 #include "SkGraphics.h"
 #include "SkImageDecoder.h"
+#include "SkOSFile.h"
 #include "SkPath.h"
 #include "SkPicture.h"
 #include "SkRandom.h"
@@ -31,8 +32,10 @@
 class PictFileView : public SampleView {
     SkString    fFilename;
     SkPicture*  fPicture;
+    SkPicture*  fBBoxPicture;
+    bool        fUseBBox;
 
-    static SkPicture* LoadPicture(const char path[]) {
+    static SkPicture* LoadPicture(const char path[], bool useBBox) {
         SkPicture* pic = NULL;
 
         SkBitmap bm;
@@ -60,16 +63,30 @@
                 p2.serialize(&writer);
             }
         }
-        return pic;
+
+        if (useBBox) {
+            SkPicture* bboxPicture = SkNEW(SkPicture);
+            pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
+                    SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
+            bboxPicture->endRecording();
+            SkDELETE(pic);
+            return bboxPicture;
+
+        } else {
+            return pic;
+        }
     }
 
 public:
     PictFileView(const char name[] = NULL) : fFilename(name) {
         fPicture = NULL;
+        fBBoxPicture = NULL;
+        fUseBBox = false;
     }
 
     virtual ~PictFileView() {
         SkSafeUnref(fPicture);
+        SkSafeUnref(fBBoxPicture);
     }
 
 protected:
@@ -77,19 +94,33 @@
     virtual bool onQuery(SkEvent* evt) {
         if (SampleCode::TitleQ(*evt)) {
             SkString name("P:");
-            name.append(fFilename);
+            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
+            name.append(basename ? basename+1: fFilename.c_str());
+            if (fUseBBox) {
+                name.append(" <bbox>");
+            }
             SampleCode::TitleR(evt, name.c_str());
             return true;
         }
         return this->INHERITED::onQuery(evt);
     }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
-        if (!fPicture) {
-            fPicture = LoadPicture(fFilename.c_str());
+    virtual bool onEvent(const SkEvent& evt) {
+        if (evt.isType("PictFileView::toggleBBox")) {
+            fUseBBox = !fUseBBox;
+            return true;
         }
-        if (fPicture) {
-            canvas->drawPicture(*fPicture);
+        return this->INHERITED::onEvent(evt);
+    }
+
+    virtual void onDrawContent(SkCanvas* canvas) {
+        SkPicture** picture = fUseBBox ? &fBBoxPicture : &fPicture;
+
+        if (!*picture) {
+            *picture = LoadPicture(fFilename.c_str(), fUseBBox);
+        }
+        if (*picture) {
+            canvas->drawPicture(**picture);
         }
     }