diff --git a/samplecode/ClockFaceView.cpp b/samplecode/ClockFaceView.cpp
index 9a1f8f9..8362c35 100644
--- a/samplecode/ClockFaceView.cpp
+++ b/samplecode/ClockFaceView.cpp
@@ -104,7 +104,7 @@
 SkFlattenable* Dot2DPathEffect::CreateProc(SkReadBuffer& buffer) {
     SkMatrix matrix;
     buffer.readMatrix(&matrix);
-    return new Dot2DPathEffect(buffer.readScalar(), matrix, NULL);
+    return new Dot2DPathEffect(buffer.readScalar(), matrix, nullptr);
 }
 
 class InverseFillPE : public SkPathEffect {
@@ -140,7 +140,7 @@
 }
 
 static void r7(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p, SkScalar interp) {
-    p.setPathEffect(makepe(SkScalarToFloat(interp), NULL))->unref();
+    p.setPathEffect(makepe(SkScalarToFloat(interp), nullptr))->unref();
     rastBuilder->addLayer(p);
 #if 0
     p.setPathEffect(new InverseFillPE())->unref();
@@ -205,7 +205,7 @@
         SkStrokeRec rec(SkStrokeRec::kFill_InitStyle);
         SkPath path, dstPath;
         orig.getTextPath("9", 1, 0, 0, &path);
-        pe->filterPath(&dstPath, path, &rec, NULL);
+        pe->filterPath(&dstPath, path, &rec, nullptr);
 
         SkPaint p;
         p.setAntiAlias(true);
@@ -245,7 +245,7 @@
                 fInterp = 0;
                 fDx = -fDx;
             }
-            this->inval(NULL);
+            this->inval(nullptr);
         }
     }
 
diff --git a/samplecode/OverView.cpp b/samplecode/OverView.cpp
index 9e229ff..d763345 100644
--- a/samplecode/OverView.cpp
+++ b/samplecode/OverView.cpp
@@ -60,7 +60,7 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             fMatchStr.appendUnichar(uni);
-            this->inval(NULL);
+            this->inval(nullptr);
             return true;
         }
         return this->INHERITED::onQuery(evt);
@@ -86,7 +86,7 @@
                 this->next(&loc);
             }
         }
-        return NULL;
+        return nullptr;
     }
 
 private:
diff --git a/samplecode/Sample2PtRadial.cpp b/samplecode/Sample2PtRadial.cpp
index 764c2b1..07efd0a 100644
--- a/samplecode/Sample2PtRadial.cpp
+++ b/samplecode/Sample2PtRadial.cpp
@@ -34,7 +34,7 @@
         SkPoint c1 = { 100, 100 };
         SkScalar r1 = 100;
         SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, colors,
-                                                             NULL, 2,
+                                                             nullptr, 2,
                                                              SkShader::kClamp_TileMode);
 
         SkPaint paint;
diff --git a/samplecode/SampleAARectModes.cpp b/samplecode/SampleAARectModes.cpp
index f9972ae..ae28925 100644
--- a/samplecode/SampleAARectModes.cpp
+++ b/samplecode/SampleAARectModes.cpp
@@ -112,7 +112,7 @@
                 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
 
                 canvas->drawRect(bounds, fBGPaint);
-                canvas->saveLayer(&bounds, NULL);
+                canvas->saveLayer(&bounds, nullptr);
                 SkScalar dy = drawCell(canvas, mode,
                                        gAlphaValue[alpha & 1],
                                        gAlphaValue[alpha & 2]);
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index 667bcc3..628504d 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -84,7 +84,7 @@
                                              SkBlurMaskFilter::kNone_BlurFlag))->unref();
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
-    p.setMaskFilter(NULL);
+    p.setMaskFilter(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -135,7 +135,7 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
 
-    p.setXfermode(NULL);
+    p.setXfermode(nullptr);
     rastBuilder->addLayer(p);
 }
 
@@ -199,8 +199,8 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p);
 
-    p.setPathEffect(NULL);
-    p.setXfermode(NULL);
+    p.setPathEffect(nullptr);
+    p.setXfermode(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -216,8 +216,8 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p);
 
-    p.setPathEffect(NULL);
-    p.setXfermode(NULL);
+    p.setPathEffect(nullptr);
+    p.setXfermode(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -303,7 +303,7 @@
         {
             SkPictureRecorder recorder;
             {
-                SkCanvas* record = recorder.beginRecording(320, 480, NULL, 0);
+                SkCanvas* record = recorder.beginRecording(320, 480, nullptr, 0);
                 this->drawPicture(record, 120);
             }
             SkAutoTUnref<SkPicture> picture(recorder.endRecording());
@@ -359,7 +359,7 @@
         // shaders
         SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } };
         SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
-        SkScalar* linearPos = NULL;
+        SkScalar* linearPos = nullptr;
         int linearCount = 2;
         SkShader::TileMode linearMode = SkShader::kMirror_TileMode;
         SkShader* linear = SkGradientShader::CreateLinear(linearPoints,
@@ -409,8 +409,8 @@
         paint.setXfermode(xfermode)->unref();
         paint.setColorFilter(lightingFilter)->unref();
         canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green
-        paint.setXfermode(NULL);
-        paint.setColorFilter(NULL);
+        paint.setXfermode(nullptr);
+        paint.setColorFilter(nullptr);
 
         // rectangle
         paint.setStyle(SkPaint::kFill_Style);
@@ -419,7 +419,7 @@
         paint.setShader(linear)->unref();
         paint.setPathEffect(pathEffectTest())->unref();
         canvas->drawRect(rect, paint);
-        paint.setPathEffect(NULL);
+        paint.setPathEffect(nullptr);
 
         // circle w/ emboss & transparent (exercises 3dshader)
         canvas->translate(SkIntToScalar(50), 0);
@@ -436,10 +436,10 @@
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(5));
         paint.setShader(radial)->unref();
-        paint.setMaskFilter(NULL);
+        paint.setMaskFilter(nullptr);
         canvas->drawPath(path, paint);
 
-        paint.setShader(NULL);
+        paint.setShader(nullptr);
         // bitmap, sprite
         canvas->translate(SkIntToScalar(50), 0);
         paint.setStyle(SkPaint::kFill_Style);
@@ -452,7 +452,7 @@
         canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
         paint.setShader(shaderTest())->unref(); // test compose shader
         canvas->drawRect(rect2, paint);
-        paint.setShader(NULL);
+        paint.setShader(nullptr);
 
         canvas->restore();
         // text
@@ -482,7 +482,7 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
         fClickPt.set(x, y);
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
@@ -508,11 +508,11 @@
     SkShader* shaderTest() {
         SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } };
         SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
-        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL,
+        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, nullptr,
             2, SkShader::kClamp_TileMode);
         pts[1].set(0, SkIntToScalar(100));
         SkColor colors2[] = {SK_ColorBLACK,  SkColorSetARGB(0x80, 0, 0, 0)};
-        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL,
+        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, nullptr,
             2, SkShader::kClamp_TileMode);
         SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
         SkShader* result = new SkComposeShader(shaderA, shaderB, mode);
@@ -550,7 +550,7 @@
         for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
             apply_shader(&paint, (int)i);
 
-          //  paint.setMaskFilter(NULL);
+          //  paint.setMaskFilter(nullptr);
           //  paint.setColor(SK_ColorBLACK);
 
 #if 01
diff --git a/samplecode/SampleAnimator.cpp b/samplecode/SampleAnimator.cpp
index a7cc885..8b7af68 100644
--- a/samplecode/SampleAnimator.cpp
+++ b/samplecode/SampleAnimator.cpp
@@ -40,7 +40,7 @@
     typedef SkView INHERITED;
 };
 
-SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {}
+SkAnimatorView::SkAnimatorView() : fAnimator(nullptr) {}
 
 SkAnimatorView::~SkAnimatorView() {
     delete fAnimator;
@@ -52,7 +52,7 @@
 
 bool SkAnimatorView::decodeFile(const char path[]) {
     SkAutoTDelete<SkStream> is(SkStream::NewFromFile(path));
-    return is.get() != NULL && this->decodeStream(is);
+    return is.get() != nullptr && this->decodeStream(is);
 }
 
 bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
@@ -62,7 +62,7 @@
 
 static const SkDOMNode* find_nodeID(const SkDOM& dom,
                         const SkDOMNode* node, const char name[]) {
-    if (NULL == node) {
+    if (nullptr == node) {
         node = dom.getRootNode();
     }
     do {
@@ -77,8 +77,8 @@
                 return found;
             }
         }
-    } while ((node = dom.getNextSibling(node)) != NULL);
-    return NULL;
+    } while ((node = dom.getNextSibling(node)) != nullptr);
+    return nullptr;
 }
 
 bool SkAnimatorView::decodeStream(SkStream* stream) {
@@ -88,7 +88,7 @@
 #if 0
     if (!fAnimator->decodeStream(stream)) {
         delete fAnimator;
-        fAnimator = NULL;
+        fAnimator = nullptr;
         return false;
     }
 #else
@@ -97,18 +97,18 @@
     stream->read(text, len);
     SkDOM dom;
     const SkDOM::Node* root = dom.build(text, len);
-    if (NULL == root) {
+    if (nullptr == root) {
         return false;
     }
     if (!fAnimator->decodeDOM(dom, root)) {
         delete fAnimator;
-        fAnimator = NULL;
+        fAnimator = nullptr;
         return false;
     }
     for (int i = 0; i <= 10; i++) {
         SkString name("glyph");
         name.appendS32(i);
-        const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
+        const SkDOM::Node* node = find_nodeID(dom, nullptr, name.c_str());
         SkASSERT(node);
         SkRect r;
         dom.findScalar(node, "left", &r.fLeft);
@@ -141,7 +141,7 @@
         fAnimator->draw(canvas, 0);
         canvas->restore();
 
-        this->inval(NULL);
+        this->inval(nullptr);
 #endif
     }
 }
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index d2f10b3..44daeb6 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -111,7 +111,7 @@
 
 static const char* skip_until(const char* str, const char* skip) {
     if (!str) {
-        return NULL;
+        return nullptr;
     }
     return strstr(str, skip);
 }
@@ -119,7 +119,7 @@
 static const char* skip_past(const char* str, const char* skip) {
     const char* found = skip_until(str, skip);
     if (!found) {
-        return NULL;
+        return nullptr;
     }
     return found + strlen(skip);
 }
@@ -162,9 +162,9 @@
 
     DefaultDeviceManager() {
 #if SK_SUPPORT_GPU
-        fCurContext = NULL;
-        fCurIntf = NULL;
-        fCurRenderTarget = NULL;
+        fCurContext = nullptr;
+        fCurIntf = nullptr;
+        fCurRenderTarget = nullptr;
         fMSAASampleCount = 0;
 #endif
         fBackend = kNone_BackEndType;
@@ -209,7 +209,7 @@
         }
         fMSAASampleCount = msaaSampleCount;
 
-        SkASSERT(NULL == fCurIntf);
+        SkASSERT(nullptr == fCurIntf);
         SkAutoTUnref<const GrGLInterface> glInterface;
         switch (win->getDeviceType()) {
             case kRaster_DeviceType:    // fallthrough
@@ -232,15 +232,15 @@
         // when the driver doesn't support NVPR.
         fCurIntf = GrGLInterfaceRemoveNVPR(glInterface.get());
 
-        SkASSERT(NULL == fCurContext);
+        SkASSERT(nullptr == fCurContext);
         fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
 
-        if (NULL == fCurContext || NULL == fCurIntf) {
+        if (nullptr == fCurContext || nullptr == fCurIntf) {
             // We need some context and interface to see results
             SkSafeUnref(fCurContext);
             SkSafeUnref(fCurIntf);
-            fCurContext = NULL;
-            fCurIntf = NULL;
+            fCurContext = nullptr;
+            fCurIntf = nullptr;
             SkDebugf("Failed to setup 3D");
 
             win->detach();
@@ -256,14 +256,14 @@
             // in case we have outstanding refs to this guy (lua?)
             fCurContext->abandonContext();
             fCurContext->unref();
-            fCurContext = NULL;
+            fCurContext = nullptr;
         }
 
         SkSafeUnref(fCurIntf);
-        fCurIntf = NULL;
+        fCurIntf = nullptr;
 
         SkSafeUnref(fCurRenderTarget);
-        fCurRenderTarget = NULL;
+        fCurRenderTarget = nullptr;
 #endif
         win->detach();
         fBackend = kNone_BackEndType;
@@ -276,7 +276,7 @@
             return SkSurface::NewRenderTargetDirect(fCurRenderTarget, &props);
         }
 #endif
-        return NULL;
+        return nullptr;
     }
 
     void publishCanvas(SampleWindow::DeviceType dType,
@@ -318,7 +318,7 @@
 #if SK_SUPPORT_GPU
         return fCurContext;
 #else
-        return NULL;
+        return nullptr;
 #endif
     }
 
@@ -326,7 +326,7 @@
 #if SK_SUPPORT_GPU
         return fCurRenderTarget;
 #else
-        return NULL;
+        return nullptr;
 #endif
     }
 
@@ -371,7 +371,7 @@
 }
 
 SkView* SkGMSampleViewFactory::operator() () const {
-    skiagm::GM* gm = fFunc(NULL);
+    skiagm::GM* gm = fFunc(nullptr);
     gm->setMode(skiagm::GM::kSample_Mode);
     return new GMSampleView(gm);
 }
@@ -442,7 +442,7 @@
     const char* label;
 };
 static HintingState gHintingStates[] = {
-    {SkPaint::kNo_Hinting, "Mixed", NULL },
+    {SkPaint::kNo_Hinting, "Mixed", nullptr },
     {SkPaint::kNo_Hinting, "None", "H0 " },
     {SkPaint::kSlight_Hinting, "Slight", "Hs " },
     {SkPaint::kNormal_Hinting, "Normal", "Hn " },
@@ -455,7 +455,7 @@
     const char*     fLabel;
 };
 static FilterQualityState gFilterQualityStates[] = {
-    { kNone_SkFilterQuality,   "Mixed",    NULL    },
+    { kNone_SkFilterQuality,   "Mixed",    nullptr    },
     { kNone_SkFilterQuality,   "None",     "F0 "   },
     { kLow_SkFilterQuality,    "Low",      "F1 "   },
     { kMedium_SkFilterQuality, "Medium",   "F2 "   },
@@ -643,14 +643,14 @@
     // Arbitrarily decided
     if (fFatBitsScale == kMaxFatBitsScale) return false;
     fFatBitsScale++;
-    this->inval(NULL);
+    this->inval(nullptr);
     return true;
 }
 
 bool SampleWindow::zoomOut() {
     if (fFatBitsScale == 1) return false;
     fFatBitsScale--;
-    this->inval(NULL);
+    this->inval(nullptr);
     return true;
 }
 
@@ -658,7 +658,7 @@
     fMouseX = x;
     fMouseY = y;
     if (fShowZoomer) {
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 }
 
@@ -704,7 +704,7 @@
 
 SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager)
     : INHERITED(hwnd)
-    , fDevManager(NULL) {
+    , fDevManager(nullptr) {
 
     SkCommandLineFlags::Parse(argc, argv);
 
@@ -745,7 +745,7 @@
     if (FLAGS_sort) {
         // Sort samples, so foo.skp and foo.pdf are consecutive and we can quickly spot where
         // skp -> pdf -> png fails.
-        SkTQSort(fSamples.begin(), fSamples.end() ? fSamples.end() - 1 : NULL, compareSampleTitle);
+        SkTQSort(fSamples.begin(), fSamples.end() ? fSamples.end() - 1 : nullptr, compareSampleTitle);
     }
 
     if (!FLAGS_slide.isEmpty()) {
@@ -809,7 +809,7 @@
 
     fMouseX = fMouseY = 0;
     fFatBitsScale = 8;
-    fTypeface = SkTypeface::CreateFromTypeface(NULL, SkTypeface::kBold);
+    fTypeface = SkTypeface::CreateFromTypeface(nullptr, SkTypeface::kBold);
     fShowZoomer = false;
 
     fZoomLevel = 0;
@@ -830,7 +830,7 @@
 #if SK_ANGLE
                                 "ANGLE",
 #endif
-                                NULL);
+                                nullptr);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'd');
     itemID = fAppMenu->appendTriState("AA", "AA", sinkID, fAAState);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'b');
@@ -842,7 +842,7 @@
                                   gFilterQualityStates[2].fName,
                                   gFilterQualityStates[3].fName,
                                   gFilterQualityStates[4].fName,
-                                  NULL);
+                                  nullptr);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'n');
     itemID = fAppMenu->appendTriState("Subpixel", "Subpixel", sinkID, fSubpixelState);
     fAppMenu->assignKeyEquivalentToItem(itemID, 's');
@@ -852,7 +852,7 @@
                                   gHintingStates[2].name,
                                   gHintingStates[3].name,
                                   gHintingStates[4].name,
-                                  NULL);
+                                  nullptr);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'h');
 
     fUsePipeMenuItemID = fAppMenu->appendTriState("Pipe", "Pipe" , sinkID,
@@ -866,7 +866,7 @@
                                  gTilingInfo[kRel_4x4_Tiling].label,
                                  gTilingInfo[kRel_1x16_Tiling].label,
                                  gTilingInfo[kRel_16x1_Tiling].label,
-                                 NULL);
+                                 nullptr);
     fAppMenu->assignKeyEquivalentToItem(itemID, 't');
 
     itemID = fAppMenu->appendSwitch("Slide Show", "Slide Show" , sinkID, false);
@@ -894,7 +894,7 @@
 
     this->loadView((*fSamples[fCurrIndex])());
 
-    if (NULL == devManager) {
+    if (nullptr == devManager) {
         fDevManager = new DefaultDeviceManager();
     } else {
         devManager->ref();
@@ -999,7 +999,7 @@
                 tileCanvas->translate(-x, -y);
                 tileCanvas->clear(0);
                 this->INHERITED::draw(tileCanvas);
-                surface->draw(canvas, x, y, NULL);
+                surface->draw(canvas, x, y, nullptr);
             }
         }
 
@@ -1028,7 +1028,7 @@
     }
 
     if (this->sendAnimatePulse()) {
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
     // do this last
@@ -1172,7 +1172,7 @@
             show_lcd_grid(canvas, bitmap, src, dest, show_lcd_circle);
             break;
         default:
-            canvas->drawBitmapRect(bitmap, src, dest, NULL);
+            canvas->drawBitmapRect(bitmap, src, dest, nullptr);
             break;
     }
 
@@ -1201,7 +1201,7 @@
     // Identify the pixel and its color on screen
     paint.setTypeface(fTypeface);
     paint.setAntiAlias(true);
-    SkScalar lineHeight = paint.getFontMetrics(NULL);
+    SkScalar lineHeight = paint.getFontMetrics(nullptr);
     SkString string;
     string.appendf("(%i, %i)", fMouseX, fMouseY);
     SkScalar left = dest.fLeft + SkIntToScalar(3);
@@ -1242,7 +1242,7 @@
 {
 #if SK_SUPPORT_PDF
     fSaveToPdf = true;
-    this->inval(NULL);
+    this->inval(nullptr);
 #endif  // SK_SUPPORT_PDF
 }
 
@@ -1259,7 +1259,7 @@
         fPDFDocument.reset(SkDocument::CreatePDF(name.c_str()));
         canvas = fPDFDocument->beginPage(this->width(), this->height());
     } else if (kPicture_DeviceType == fDeviceType) {
-        canvas = fRecorder.beginRecording(9999, 9999, NULL, 0);
+        canvas = fRecorder.beginRecording(9999, 9999, nullptr, 0);
     } else {
         canvas = this->INHERITED::beforeChildren(canvas);
     }
@@ -1284,15 +1284,15 @@
 }
 #include "SkMultiPictureDraw.h"
 void SampleWindow::afterChildren(SkCanvas* orig) {
-    fFlagsFilterCanvas.reset(NULL);
+    fFlagsFilterCanvas.reset(nullptr);
 
     if (fSaveToPdf) {
         fSaveToPdf = false;
         fPDFDocument->endPage();
-        fPDFDocument.reset(NULL);
+        fPDFDocument.reset(nullptr);
         // We took over the draw calls in order to create the PDF, so we need
         // to redraw.
-        this->inval(NULL);
+        this->inval(nullptr);
         return;
     }
 
@@ -1340,7 +1340,7 @@
                             c->translate(SkIntToScalar(-x * n.width()),
                                          SkIntToScalar(-y * n.height()));
                             c->concat(orig->getTotalMatrix());
-                            md.add(c, picture, NULL, NULL);
+                            md.add(c, picture, nullptr, nullptr);
                             index++;
                         }
                     }
@@ -1359,7 +1359,7 @@
             SkAutoDataUnref data(ostream.copyToData());
             SkMemoryStream istream(data->data(), data->size());
             SkAutoTUnref<SkPicture> pict(SkPicture::CreateFromStream(&istream));
-            if (pict.get() != NULL) {
+            if (pict.get() != nullptr) {
                 orig->drawPicture(pict.get());
             }
         } else {
@@ -1413,7 +1413,7 @@
         (void)SampleView::SetRepeatDraw(child, 1);
     }
     if (fPerspAnim || fRotate) {
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 }
 
@@ -1464,7 +1464,7 @@
     this->setLocalMatrix(m);
 
     this->updateTitle();
-    this->inval(NULL);
+    this->inval(nullptr);
 }
 bool SampleWindow::previousSample() {
     fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count();
@@ -1528,7 +1528,7 @@
         return true;
     }
     if (isInvalEvent(evt)) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
     int selected = -1;
@@ -1543,10 +1543,10 @@
 #endif
         (void)SampleView::SetUsePipe(curr_view(this), fPipeState);
         this->updateTitle();
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
-    if (SkOSMenu::FindSwitchState(evt, "Slide Show", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Slide Show", nullptr)) {
         this->toggleSlideshow();
         return true;
     }
@@ -1559,7 +1559,7 @@
         SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
         SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify))
     {
-        this->inval(NULL);
+        this->inval(nullptr);
         this->updateTitle();
         return true;
     }
@@ -1567,16 +1567,16 @@
         if (SampleView::IsSampleView(curr_view(this))) {
             ((SampleView*)curr_view(this))->onTileSizeChanged(this->tileSize());
         }
-        this->inval(NULL);
+        this->inval(nullptr);
         this->updateTitle();
         return true;
     }
-    if (SkOSMenu::FindSwitchState(evt, "Flip X", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Flip X", nullptr)) {
         fFlipAxis ^= kFlipAxis_X;
         this->updateMatrix();
         return true;
     }
-    if (SkOSMenu::FindSwitchState(evt, "Flip Y", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Flip Y", nullptr)) {
         fFlipAxis ^= kFlipAxis_Y;
         this->updateMatrix();
         return true;
@@ -1607,7 +1607,7 @@
         return curr_view(this)->doQuery(&evt);
     }
     if (query->isType("ignore-window-bitmap")) {
-        query->setFast32(this->getGrContext() != NULL);
+        query->setFast32(this->getGrContext() != nullptr);
         return true;
     }
     return this->INHERITED::onQuery(query);
@@ -1652,7 +1652,7 @@
             fScrollTestX += dx;
             fScrollTestY += dy;
         }
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
@@ -1660,13 +1660,13 @@
         case 27:    // ESC
             gAnimTimer.stop();
             if (this->sendAnimatePulse()) {
-                this->inval(NULL);
+                this->inval(nullptr);
             }
             break;
         case ' ':
             gAnimTimer.togglePauseResume();
             if (this->sendAnimatePulse()) {
-                this->inval(NULL);
+                this->inval(nullptr);
             }
             break;
         case 'B':
@@ -1674,7 +1674,7 @@
             // Cannot call updateTitle() synchronously, because the toggleBBox event is still in
             // the queue.
             post_event_to_sink(new SkEvent(gUpdateWindowTitleEvtName), this);
-            this->inval(NULL);
+            this->inval(nullptr);
             break;
         case 'D':
             toggleDistanceFieldFonts();
@@ -1685,17 +1685,17 @@
             break;
         case 'F':
             FLAGS_portableFonts ^= true;
-            this->inval(NULL);
+            this->inval(nullptr);
             break;
         case 'g':
             fRequestGrabImage = true;
-            this->inval(NULL);
+            this->inval(nullptr);
             break;
         case 'G':
             gShowGMBounds = !gShowGMBounds;
             post_event_to_sink(GMSampleView::NewShowSizeEvt(gShowGMBounds),
                             curr_view(this));
-            this->inval(NULL);
+            this->inval(nullptr);
             break;
         case 'i':
             this->zoomIn();
@@ -1705,17 +1705,17 @@
             break;
         case 'r':
             fRotate = !fRotate;
-            this->inval(NULL);
+            this->inval(nullptr);
             this->updateTitle();
             return true;
         case 'k':
             fPerspAnim = !fPerspAnim;
-            this->inval(NULL);
+            this->inval(nullptr);
             this->updateTitle();
             return true;
         case 'K':
             fSaveToSKP = true;
-            this->inval(NULL);
+            this->inval(nullptr);
             return true;
 #if SK_SUPPORT_GPU
         case 'p':
@@ -1723,7 +1723,7 @@
                 GrContext* grContext = this->getGrContext();
                 if (grContext) {
                     size_t cacheBytes;
-                    grContext->getResourceCacheUsage(NULL, &cacheBytes);
+                    grContext->getResourceCacheUsage(nullptr, &cacheBytes);
                     grContext->freeGpuResources();
                     SkDebugf("Purged %d bytes from the GPU resource cache.\n", cacheBytes);
                 }
@@ -1753,7 +1753,7 @@
     fDevManager->setUpBackend(this, fMSAASampleCount);
 
     this->updateTitle();
-    this->inval(NULL);
+    this->inval(nullptr);
 }
 
 void SampleWindow::toggleSlideshow() {
@@ -1765,13 +1765,13 @@
 void SampleWindow::toggleRendering() {
     this->setDeviceType(cycle_devicetype(fDeviceType));
     this->updateTitle();
-    this->inval(NULL);
+    this->inval(nullptr);
 }
 
 void SampleWindow::toggleFPS() {
     fMeasureFPS = !fMeasureFPS;
     this->updateTitle();
-    this->inval(NULL);
+    this->inval(nullptr);
 }
 
 void SampleWindow::toggleDistanceFieldFonts() {
@@ -1780,7 +1780,7 @@
     this->setSurfaceProps(SkSurfaceProps(flags, props.pixelGeometry()));
 
     this->updateTitle();
-    this->inval(NULL);
+    this->inval(nullptr);
 }
 
 #include "SkDumpCanvas.h"
@@ -1847,7 +1847,7 @@
     }
     else if (fMagnify) {
         //it's only necessary to update the drawing if there's a click
-        this->inval(NULL);
+        this->inval(nullptr);
         return false; //prevent dragging while magnify is enabled
     } else {
         // capture control+option, and trigger debugger
@@ -1951,7 +1951,7 @@
     } else if (SkOSMenu::kOffState == state) {
         return falseStr;
     }
-    return NULL;
+    return nullptr;
 }
 
 bool SampleWindow::getRawTitle(SkString* title) {
@@ -1989,8 +1989,8 @@
     title.prepend(trystate_str(fAAState, "AA ", "aa "));
     title.prepend(gFilterQualityStates[fFilterQualityIndex].fLabel);
     title.prepend(trystate_str(fSubpixelState, "S ", "s "));
-    title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL);
-    title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
+    title.prepend(fFlipAxis & kFlipAxis_X ? "X " : nullptr);
+    title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : nullptr);
     title.prepend(gHintingStates[fHintingState].label);
 
     if (fZoomLevel) {
@@ -2141,7 +2141,7 @@
 };
 
 SimplePC::SimplePC(SkCanvas* target) : fReader(target) {
-    fBlock = NULL;
+    fBlock = nullptr;
     fBlockSize = fBytesWritten = 0;
     fStatus = SkGPipeReader::kDone_Status;
     fTotalWritten = 0;
@@ -2157,7 +2157,7 @@
 #ifdef  PIPE_FILE
         //File is open in append mode
         FILE* f = fopen(FILE_PATH, "ab");
-        SkASSERT(f != NULL);
+        SkASSERT(f != nullptr);
         fwrite((const char*)fBlock + fBytesWritten, 1, bytes, f);
         fclose(f);
 #endif
@@ -2341,7 +2341,7 @@
     if (false) { // avoid bit rot, suppress warning
         test();
     }
-    return new SampleWindow(hwnd, argc, argv, NULL);
+    return new SampleWindow(hwnd, argc, argv, nullptr);
 }
 
 // FIXME: this should be in a header
diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h
index 1f8c333..d872495 100644
--- a/samplecode/SampleApp.h
+++ b/samplecode/SampleApp.h
@@ -87,10 +87,10 @@
         // at least once before first draw (after init)
         virtual void windowSizeChanged(SampleWindow* win) = 0;
 
-        // return the GrContext backing gpu devices (NULL if not built with GPU support)
+        // return the GrContext backing gpu devices (nullptr if not built with GPU support)
         virtual GrContext* getGrContext() = 0;
 
-        // return the GrRenderTarget backing gpu devices (NULL if not built with GPU support)
+        // return the GrRenderTarget backing gpu devices (nullptr if not built with GPU support)
         virtual GrRenderTarget* getGrRenderTarget() = 0;
     private:
         typedef SkRefCnt INHERITED;
@@ -100,11 +100,11 @@
     virtual ~SampleWindow();
 
     SkSurface* createSurface() override {
-        SkSurface* surface = NULL;
+        SkSurface* surface = nullptr;
         if (fDevManager) {
             surface = fDevManager->createSurface(fDeviceType, this);
         }
-        if (NULL == surface) {
+        if (nullptr == surface) {
             surface = this->INHERITED::createSurface();
         }
         return surface;
diff --git a/samplecode/SampleArc.cpp b/samplecode/SampleArc.cpp
index 90fbb78..834ba90 100644
--- a/samplecode/SampleArc.cpp
+++ b/samplecode/SampleArc.cpp
@@ -204,7 +204,7 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
      //   fSweep += SK_Scalar1;
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp
index e11bf7e..a7d5cbe 100644
--- a/samplecode/SampleAtlas.cpp
+++ b/samplecode/SampleAtlas.cpp
@@ -186,7 +186,7 @@
         paint.setFilterQuality(kLow_SkFilterQuality);
 
         const SkRect cull = this->getBounds();
-        const SkColor* colorsPtr = fUseColors ? colors : NULL;
+        const SkColor* colorsPtr = fUseColors ? colors : nullptr;
         fProc(canvas, fAtlas, xform, fTex, colorsPtr, N, &cull, &paint);
     }
     
@@ -223,7 +223,7 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case 'C': fDrawable->toggleUseColors(); this->inval(NULL); return true;
+                case 'C': fDrawable->toggleUseColors(); this->inval(nullptr); return true;
                 default: break;
             }
         }
@@ -232,7 +232,7 @@
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawDrawable(fDrawable);
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 #if 0
diff --git a/samplecode/SampleBigGradient.cpp b/samplecode/SampleBigGradient.cpp
index c2e6225..0fa7969 100644
--- a/samplecode/SampleBigGradient.cpp
+++ b/samplecode/SampleBigGradient.cpp
@@ -13,7 +13,7 @@
 static SkShader* make_grad(SkScalar w, SkScalar h) {
     SkColor colors[] = { 0xFF000000, 0xFF333333 };
     SkPoint pts[] = { { 0, 0 }, { w, h } };
-    return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+    return SkGradientShader::CreateLinear(pts, colors, nullptr, 2,
                                           SkShader::kClamp_TileMode);
 }
 
diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp
index b39db4c..d7eed02 100644
--- a/samplecode/SampleBitmapRect.cpp
+++ b/samplecode/SampleBitmapRect.cpp
@@ -37,7 +37,7 @@
     paint.setAntiAlias(true);
     const SkPoint pts[] = { { 0, 0 }, { SCALAR_SIZE, SCALAR_SIZE } };
     const SkColor colors[] = { SK_ColorWHITE, SK_ColorBLUE };
-    paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+    paint.setShader(SkGradientShader::CreateLinear(pts, colors, nullptr, 2,
                                                    SkShader::kClamp_TileMode))->unref();
     canvas.drawCircle(SCALAR_SIZE/2, SCALAR_SIZE/2, SCALAR_SIZE/2, paint);
 }
diff --git a/samplecode/SampleBlur.cpp b/samplecode/SampleBlur.cpp
index 7607dfc..bd5ff47 100644
--- a/samplecode/SampleBlur.cpp
+++ b/samplecode/SampleBlur.cpp
@@ -25,7 +25,7 @@
 
     bm.allocPixels(SkImageInfo::Make(256, 256, kIndex_8_SkColorType,
                                      kPremul_SkAlphaType),
-                   NULL, ctable);
+                   nullptr, ctable);
     ctable->unref();
 
     bm.lockPixels();
@@ -104,7 +104,7 @@
                                       flags);
                     paint.setMaskFilter(mf)->unref();
                 } else {
-                    paint.setMaskFilter(NULL);
+                    paint.setMaskFilter(nullptr);
                 }
                 canvas->drawCircle(200 + gRecs[i].fCx*100.f,
                                    200 + gRecs[i].fCy*100.f, 50, paint);
@@ -120,7 +120,7 @@
                 paint.setColor(SK_ColorBLACK);
                 canvas->drawText("Hamburgefons Style", 18, x, y, paint);
                 canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
-                paint.setMaskFilter(NULL);
+                paint.setMaskFilter(nullptr);
                 paint.setColor(SK_ColorWHITE);
                 x -= SkIntToScalar(2);
                 y -= SkIntToScalar(2);
diff --git a/samplecode/SampleChart.cpp b/samplecode/SampleChart.cpp
index 8d158f1..0c8949c 100644
--- a/samplecode/SampleChart.cpp
+++ b/samplecode/SampleChart.cpp
@@ -24,7 +24,7 @@
 
 // Generates a path to stroke along the top of each plot and a fill path for the area below each
 // plot. The fill path is bounded below by the bottomData plot points or a horizontal line at
-// yBase if bottomData == NULL.
+// yBase if bottomData == nullptr.
 // The plots are animated by rotating the data points by leftShift.
 static void gen_paths(const SkTDArray<SkScalar>& topData,
                       const SkTDArray<SkScalar>* bottomData,
@@ -35,7 +35,7 @@
     plot->rewind();
     fill->rewind();
     plot->incReserve(topData.count());
-    if (NULL == bottomData) {
+    if (nullptr == bottomData) {
         fill->incReserve(topData.count() + 2);
     } else {
         fill->incReserve(2 * topData.count());
@@ -142,7 +142,7 @@
         fillPaint.setAntiAlias(true);
         fillPaint.setStyle(SkPaint::kFill_Style);
 
-        SkTDArray<SkScalar>* prevData = NULL;
+        SkTDArray<SkScalar>* prevData = nullptr;
         for (int i = 0; i < kNumGraphs; ++i) {
             gen_paths(fData[i],
                       prevData,
@@ -164,7 +164,7 @@
         }
 
         fShift += kShiftPerFrame;
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleClamp.cpp b/samplecode/SampleClamp.cpp
index 2368ab2..e319a56 100644
--- a/samplecode/SampleClamp.cpp
+++ b/samplecode/SampleClamp.cpp
@@ -16,7 +16,7 @@
 static SkShader* make_linear() {
     SkPoint pts[] = { 0, 0, SK_Scalar1/500, SK_Scalar1/500 };
     SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
-    return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+    return SkGradientShader::CreateLinear(pts, colors, nullptr, 2,
                                           SkShader::kClamp_TileMode);
 }
 
diff --git a/samplecode/SampleClipDrawMatch.cpp b/samplecode/SampleClipDrawMatch.cpp
index c79c872..502f349 100644
--- a/samplecode/SampleClipDrawMatch.cpp
+++ b/samplecode/SampleClipDrawMatch.cpp
@@ -141,17 +141,17 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case '1': fGeom = kRect_Geometry; this->inval(NULL); return true;
-                case '2': fGeom = kRRect_Geometry; this->inval(NULL); return true;
-                case '3': fGeom = kCircle_Geometry; this->inval(NULL); return true;
-                case '4': fGeom = kConvexPath_Geometry; this->inval(NULL); return true;
-                case '5': fGeom = kConcavePath_Geometry; this->inval(NULL); return true;
-                case '6': fGeom = kRectAndRect_Geometry; this->inval(NULL); return true;
-                case '7': fGeom = kRectAndRRect_Geometry; this->inval(NULL); return true;
-                case '8': fGeom = kRectAndConvex_Geometry; this->inval(NULL); return true;
-                case '9': fGeom = kRectAndConcave_Geometry; this->inval(NULL); return true;
-                case 'f': fSign = -fSign; this->inval(NULL); return true;
-                case 't': fClipFirst = !fClipFirst; this->inval(NULL); return true;
+                case '1': fGeom = kRect_Geometry; this->inval(nullptr); return true;
+                case '2': fGeom = kRRect_Geometry; this->inval(nullptr); return true;
+                case '3': fGeom = kCircle_Geometry; this->inval(nullptr); return true;
+                case '4': fGeom = kConvexPath_Geometry; this->inval(nullptr); return true;
+                case '5': fGeom = kConcavePath_Geometry; this->inval(nullptr); return true;
+                case '6': fGeom = kRectAndRect_Geometry; this->inval(nullptr); return true;
+                case '7': fGeom = kRectAndRRect_Geometry; this->inval(nullptr); return true;
+                case '8': fGeom = kRectAndConvex_Geometry; this->inval(nullptr); return true;
+                case '9': fGeom = kRectAndConcave_Geometry; this->inval(nullptr); return true;
+                case 'f': fSign = -fSign; this->inval(nullptr); return true;
+                case 't': fClipFirst = !fClipFirst; this->inval(nullptr); return true;
                 default: break;
             }
         }
@@ -240,7 +240,7 @@
         this->drawGeometry(canvas, offset, false);
         canvas->restoreToCount(saveCount);
 
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleClock.cpp b/samplecode/SampleClock.cpp
index 9b1e3e0..ae7462d 100644
--- a/samplecode/SampleClock.cpp
+++ b/samplecode/SampleClock.cpp
@@ -216,7 +216,7 @@
 
         canvas->restore();
 
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleConcavePaths.cpp b/samplecode/SampleConcavePaths.cpp
index 2fc0107..fb5447e 100644
--- a/samplecode/SampleConcavePaths.cpp
+++ b/samplecode/SampleConcavePaths.cpp
@@ -139,7 +139,7 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleCull.cpp b/samplecode/SampleCull.cpp
index afc4184..011b22f 100644
--- a/samplecode/SampleCull.cpp
+++ b/samplecode/SampleCull.cpp
@@ -161,7 +161,7 @@
         paint.setStrokeWidth(SkIntToScalar(2));
 //        paint.setPathEffect(new SkCornerPathEffect(SkIntToScalar(30)))->unref();
         canvas->drawPath(fPath, paint);
-//        paint.setPathEffect(NULL);
+//        paint.setPathEffect(nullptr);
 #endif
 
         SkPath  tmp;
@@ -179,7 +179,7 @@
         paint.setStrokeJoin(SkPaint::kRound_Join);
         canvas->drawPath(tmp, paint);
 
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleDash.cpp b/samplecode/SampleDash.cpp
index e4fa79d..a01c079 100644
--- a/samplecode/SampleDash.cpp
+++ b/samplecode/SampleDash.cpp
@@ -73,7 +73,7 @@
             SkDashPathEffect dash(interval, len, 0);
             paint.setPathEffect(&dash);
             canvas->drawLine(x0, y0, x1, y0, paint);
-            paint.setPathEffect(NULL);
+            paint.setPathEffect(nullptr);
 
             y0 += paint.getStrokeWidth() * 3;
         }
diff --git a/samplecode/SampleDither.cpp b/samplecode/SampleDither.cpp
index c0ce299..8c14fb5 100644
--- a/samplecode/SampleDither.cpp
+++ b/samplecode/SampleDither.cpp
@@ -35,7 +35,7 @@
     //    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorCYAN };
     SkColor colors[] = { 0x4c737373, 0x4c737373, 0xffffd300 };
     SkShader* s = SkGradientShader::CreateSweep(r.centerX(), r.centerY(),
-                                                colors, NULL, SK_ARRAY_COUNT(colors));
+                                                colors, nullptr, SK_ARRAY_COUNT(colors));
     p.setShader(s)->unref();
 
     SkAutoCanvasRestore acr(c, true);
@@ -165,7 +165,7 @@
         draw_sweep(canvas, fBM.width()>>2, fBM.height()>>2, fAngle);
 
         fAngle += SK_Scalar1/2;
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleDitherBitmap.cpp b/samplecode/SampleDitherBitmap.cpp
index 9af5ce5..df72dd4 100644
--- a/samplecode/SampleDitherBitmap.cpp
+++ b/samplecode/SampleDitherBitmap.cpp
@@ -17,7 +17,7 @@
     canvas->drawRect(r, p);
 
     SkPaint frame(p);
-    frame.setShader(NULL);
+    frame.setShader(nullptr);
     frame.setStyle(SkPaint::kStroke_Style);
     canvas->drawRect(r, frame);
 }
@@ -26,7 +26,7 @@
     SkRect r = { 0, 0, SkIntToScalar(256), SkIntToScalar(32) };
     SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
     SkColor colors[] = { 0xFF000000, 0xFFFF0000 };
-    SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+    SkShader* s = SkGradientShader::CreateLinear(pts, colors, nullptr, 2,
                                                  SkShader::kClamp_TileMode);
 
     SkPaint p;
@@ -62,7 +62,7 @@
 
     SkBitmap bm;
     bm.allocPixels(SkImageInfo::Make(256, 32, kIndex_8_SkColorType, kPremul_SkAlphaType),
-                   NULL, ctable);
+                   nullptr, ctable);
     ctable->unref();
 
     bm.lockPixels();
diff --git a/samplecode/SampleDraw.cpp b/samplecode/SampleDraw.cpp
index 616650f..5e239c6 100644
--- a/samplecode/SampleDraw.cpp
+++ b/samplecode/SampleDraw.cpp
@@ -22,7 +22,7 @@
 
     c.clipRect(rect);
 
-    c.saveLayer(NULL, NULL);
+    c.saveLayer(nullptr, nullptr);
     rect = SkRect::MakeXYWH(50, 10, 40, 80);
     c.clipRect(rect, SkRegion::kUnion_Op);
 
@@ -262,7 +262,7 @@
     SkTDArray<Draw*> fList;
 
 public:
-    DrawView() : fDraw(NULL) {
+    DrawView() : fDraw(nullptr) {
         fFactory = new RectFactory;
     }
 
@@ -289,7 +289,7 @@
                 return *iter;
             }
         }
-        return NULL;
+        return nullptr;
     }
 
 protected:
@@ -344,7 +344,7 @@
                 } else {
                     fDraw->unref();
                 }
-                fDraw = NULL;
+                fDraw = nullptr;
             }
             return true;
         }
@@ -365,7 +365,7 @@
                 }
             }
         }
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index 01a63ad..b58d557 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -40,7 +40,7 @@
 static void paint_proc3(SkPaint* paint) {
     SkColor colors[] = { SK_ColorRED, COLOR, SK_ColorBLUE };
     SkPoint pts[] = { { 3, 0 }, { 7, 5 } };
-    paint->setShader(SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors),
+    paint->setShader(SkGradientShader::CreateLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
                                         SkShader::kMirror_TileMode))->unref();
 }
 
diff --git a/samplecode/SampleEncode.cpp b/samplecode/SampleEncode.cpp
index 185208b..9ca7d8a 100644
--- a/samplecode/SampleEncode.cpp
+++ b/samplecode/SampleEncode.cpp
@@ -65,7 +65,7 @@
                 }
             }
             SkColorTable* ctable = new SkColorTable(colors, 256);
-            bm->allocPixels(info, NULL, ctable);
+            bm->allocPixels(info, nullptr, ctable);
             ctable->unref();
             for (int y = 0; y < height; y++) {
                 for (int x = 0; x < width; x++) {
@@ -122,13 +122,13 @@
             for (size_t j = 0; j < SK_ARRAY_COUNT(gTypes); j++) {
                 SkAutoTDelete<SkImageEncoder> codec(
                     SkImageEncoder::Create(gTypes[j]));
-                if (NULL == codec.get()) {
+                if (nullptr == codec.get()) {
                     SkDebugf("[%s:%d] failed to encode %s%s\n",
                              __FILE__, __LINE__,gConfigLabels[i], gExt[j]);
                     continue;
                 }
                 SkAutoDataUnref data(codec->encodeData(fBitmaps[i], 100));
-                if (NULL == data.get()) {
+                if (nullptr == data.get()) {
                     SkDebugf("[%s:%d] failed to encode %s%s\n",
                              __FILE__, __LINE__,gConfigLabels[i], gExt[j]);
                     continue;
@@ -186,7 +186,7 @@
                 yy += SkIntToScalar(fBitmaps[i].height() + 10);
 
                 SkBitmap bm;
-                SkData* encoded = NULL;
+                SkData* encoded = nullptr;
                 if (SkImageEncoder::kJPEG_Type == gTypes[j]) {
                     encoded = fEncodedJPEGs[i].get();
                 } else if (SkImageEncoder::kPNG_Type == gTypes[j]) {
@@ -219,7 +219,7 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp
index a756591..0a47259 100644
--- a/samplecode/SampleFatBits.cpp
+++ b/samplecode/SampleFatBits.cpp
@@ -163,7 +163,7 @@
         SkCanvas* canvas = fMaxSurface->getCanvas();
         canvas->save();
         canvas->concat(fMatrix);
-        fMinSurface->draw(canvas, 0, 0, NULL);
+        fMinSurface->draw(canvas, 0, 0, nullptr);
         canvas->restore();
 
         SkPaint paint;
@@ -184,7 +184,7 @@
 
     paint.setShader(fShader);
     canvas->drawRect(fBounds, paint);
-    paint.setShader(NULL);
+    paint.setShader(nullptr);
 }
 
 void FatBits::drawFG(SkCanvas* canvas) {
@@ -288,7 +288,7 @@
     fMatrix.mapPoints(pts, 2);
     this->drawLineSkeleton(max, pts);
 
-    fMaxSurface->draw(canvas, 0, 0, NULL);
+    fMaxSurface->draw(canvas, 0, 0, nullptr);
 }
 
 void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
@@ -318,7 +318,7 @@
     r.set(pts, 2);
     this->drawRectSkeleton(max, r);
 
-    fMaxSurface->draw(canvas, 0, 0, NULL);
+    fMaxSurface->draw(canvas, 0, 0, nullptr);
 }
 
 void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
@@ -360,7 +360,7 @@
     fMatrix.mapPoints(pts, 3);
     this->drawTriangleSkeleton(max, pts);
 
-    fMaxSurface->draw(canvas, 0, 0, NULL);
+    fMaxSurface->draw(canvas, 0, 0, nullptr);
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -395,7 +395,7 @@
 
     void setStyle(FatBits::Style s) {
         fFB.setStyle(s);
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 protected:
@@ -409,19 +409,19 @@
             switch (uni) {
                 case 'c':
                     fFB.setUseClip(!fFB.getUseClip());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 'r':
                     fIsRect = !fIsRect;
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 'o':
                     fFB.toggleRectAsOval();
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 'x':
                     fFB.setGrid(!fFB.getGrid());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 's':
                     if (FatBits::kStroke_Style == fFB.getStyle()) {
@@ -432,19 +432,19 @@
                     return true;
                 case 'a':
                     fFB.setAA(!fFB.getAA());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 'w':
                     fFB.setShowSkeleton(!fFB.getShowSkeleton());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 'g':
                     fFB.setUseGPU(!fFB.getUseGPU());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
                 case 't':
                     fFB.setTriangle(!fFB.getTriangle());
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     return true;
             }
         }
@@ -504,7 +504,7 @@
             fPts[1].offset(dx, dy);
             fPts[2].offset(dx, dy);
         }
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleFilter.cpp b/samplecode/SampleFilter.cpp
index 3713a72..acf358a 100644
--- a/samplecode/SampleFilter.cpp
+++ b/samplecode/SampleFilter.cpp
@@ -30,7 +30,7 @@
     SkColorTable* ctable = new SkColorTable(colors, 4);
     bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType,
                                       kOpaque_SkAlphaType),
-                    NULL, ctable);
+                    nullptr, ctable);
     ctable->unref();
 
     *bm->getAddr8(0, 0) = 0;
diff --git a/samplecode/SampleFilter2.cpp b/samplecode/SampleFilter2.cpp
index 3541e15..3663f11 100644
--- a/samplecode/SampleFilter2.cpp
+++ b/samplecode/SampleFilter2.cpp
@@ -36,11 +36,11 @@
 
         for (int i = 0; i < fBitmapCount/2; i++) {
             SkImageDecoder::DecodeFile(gNames[i], &fBitmaps[i], kN32_SkColorType,
-                                       SkImageDecoder::kDecodePixels_Mode, NULL);
+                                       SkImageDecoder::kDecodePixels_Mode, nullptr);
         }
         for (int i = fBitmapCount/2; i < fBitmapCount; i++) {
             SkImageDecoder::DecodeFile(gNames[i-fBitmapCount/2], &fBitmaps[i], kRGB_565_SkColorType,
-                                       SkImageDecoder::kDecodePixels_Mode, NULL);
+                                       SkImageDecoder::kDecodePixels_Mode, nullptr);
         }
         fCurrIndex = 0;
 
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index bae7c21..ca4b8e2 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -39,7 +39,7 @@
 //#define SK_ADD_RANDOM_BIT_FLIPS
 //#define SK_FUZZER_IS_VERBOSE
 
-static const uint32_t kSeed = (uint32_t)(time(NULL));
+static const uint32_t kSeed = (uint32_t)(time(nullptr));
 static SkRandom gRand(kSeed);
 static bool return_large = false;
 static bool return_undef = false;
@@ -245,7 +245,7 @@
 
     canvas->save();
     canvas->scale(0.5f, 0.5f);
-    canvas->drawBitmap(make_bitmap(), 0, 0, NULL);
+    canvas->drawBitmap(make_bitmap(), 0, 0, nullptr);
     canvas->restore();
 
     paint.setAntiAlias(true);
@@ -260,7 +260,7 @@
 static SkImageFilter* make_image_filter(bool canBeNull = true) {
     SkImageFilter* filter = 0;
 
-    // Add a 1 in 3 chance to get a NULL input
+    // Add a 1 in 3 chance to get a nullptr input
     if (canBeNull && (R(3) == 1)) { return filter; }
 
     enum { ALPHA_THRESHOLD, MERGE, COLOR, LUT3D, BLUR, MAGNIFIER,
@@ -380,7 +380,7 @@
     case DROP_SHADOW:
         filter = SkDropShadowImageFilter::Create(make_scalar(), make_scalar(), make_scalar(true),
                     make_scalar(true), make_color(), make_shadow_mode(), make_image_filter(),
-                    NULL);
+                    nullptr);
         break;
     case MORPHOLOGY:
         if (R(2) == 1) {
diff --git a/samplecode/SampleFilterQuality.cpp b/samplecode/SampleFilterQuality.cpp
index 12a04a6..8bc2b07 100644
--- a/samplecode/SampleFilterQuality.cpp
+++ b/samplecode/SampleFilterQuality.cpp
@@ -59,7 +59,7 @@
     canvas->scale(S, S);
     canvas->translate(-SkScalarHalf(orig->width()) * (S - D) / S,
                       -SkScalarHalf(orig->height()) * (S - D) / S);
-    canvas->drawImage(orig, 0, 0, NULL);
+    canvas->drawImage(orig, 0, 0, nullptr);
     
     if (S > 3) {
         SkPaint paint;
@@ -165,11 +165,11 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case '1': fAngle.inc(-ANGLE_DELTA); this->inval(NULL); return true;
-                case '2': fAngle.inc( ANGLE_DELTA); this->inval(NULL); return true;
-                case '3': fScale.inc(-SCALE_DELTA); this->inval(NULL); return true;
-                case '4': fScale.inc( SCALE_DELTA); this->inval(NULL); return true;
-                case '5': fShowFatBits = !fShowFatBits; this->inval(NULL); return true;
+                case '1': fAngle.inc(-ANGLE_DELTA); this->inval(nullptr); return true;
+                case '2': fAngle.inc( ANGLE_DELTA); this->inval(nullptr); return true;
+                case '3': fScale.inc(-SCALE_DELTA); this->inval(nullptr); return true;
+                case '4': fScale.inc( SCALE_DELTA); this->inval(nullptr); return true;
+                case '5': fShowFatBits = !fShowFatBits; this->inval(nullptr); return true;
                 default: break;
             }
         }
@@ -283,7 +283,7 @@
     }
 
     virtual bool handleKey(SkKey key) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleFontCache.cpp b/samplecode/SampleFontCache.cpp
index 77f66b0..5391d24 100644
--- a/samplecode/SampleFontCache.cpp
+++ b/samplecode/SampleFontCache.cpp
@@ -63,7 +63,7 @@
     while (!gDone) {
         call_measure();
     }
-    return NULL;
+    return nullptr;
 }
 
 static void* draw_proc(void* context) {
@@ -73,7 +73,7 @@
     while (!gDone) {
         call_draw(&canvas);
     }
-    return NULL;
+    return nullptr;
 }
 
 class FontCacheView : public SampleView {
@@ -89,13 +89,13 @@
         for (int i = 0; i < N; i++) {
             int status;
 
-            status = pthread_create(&fMThreads[i], NULL,  measure_proc, NULL);
+            status = pthread_create(&fMThreads[i], nullptr,  measure_proc, nullptr);
             SkASSERT(0 == status);
 
             fBitmaps[i].allocPixels(SkImageInfo::Make(320, 240,
                                                       kRGB_565_SkColorType,
                                                       kOpaque_SkAlphaType));
-            status = pthread_create(&fDThreads[i], NULL,  draw_proc, &fBitmaps[i]);
+            status = pthread_create(&fDThreads[i], nullptr,  draw_proc, &fBitmaps[i]);
             SkASSERT(0 == status);
         }
         this->setBGColor(0xFFDDDDDD);
@@ -129,7 +129,7 @@
             canvas->drawBitmap(fBitmaps[i], x, y);
             x += SkIntToScalar(fBitmaps[i].width());
         }
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleFontScalerTest.cpp b/samplecode/SampleFontScalerTest.cpp
index bbfd5a5..0105a47 100644
--- a/samplecode/SampleFontScalerTest.cpp
+++ b/samplecode/SampleFontScalerTest.cpp
@@ -25,8 +25,8 @@
     const char* fName;
     SkTypeface::Style   fStyle;
 } gFaces[] = {
-    { NULL, SkTypeface::kNormal },
-    { NULL, SkTypeface::kBold },
+    { nullptr, SkTypeface::kNormal },
+    { nullptr, SkTypeface::kBold },
     { "serif", SkTypeface::kNormal },
     { "serif", SkTypeface::kBold },
     { "serif", SkTypeface::kItalic },
@@ -121,7 +121,7 @@
                 for (int ps = 6; ps <= 22; ps++) {
                     paint.setTextSize(SkIntToScalar(ps));
                     canvas->drawText(text, textLen, x, y, paint);
-                    y += paint.getFontMetrics(NULL);
+                    y += paint.getFontMetrics(nullptr);
                     index += 1;
                 }
             }
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index e690df1..d1a696f 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -383,7 +383,7 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         do_fuzz(canvas);
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleGradients.cpp b/samplecode/SampleGradients.cpp
index 12d24d2..2d6f7d4 100644
--- a/samplecode/SampleGradients.cpp
+++ b/samplecode/SampleGradients.cpp
@@ -13,7 +13,7 @@
 static SkShader* setgrad(const SkRect& r, SkColor c0, SkColor c1) {
     SkColor colors[] = { c0, c1 };
     SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
-    return SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
+    return SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 }
 
 static void test_alphagradients(SkCanvas* canvas) {
@@ -56,10 +56,10 @@
 };
 
 static const GradData gGradData[] = {
-    { 2, gColors, NULL },
+    { 2, gColors, nullptr },
     { 2, gColors, gPos0 },
     { 2, gColors, gPos1 },
-    { 5, gColors, NULL },
+    { 5, gColors, nullptr },
     { 5, gColors, gPos2 }
 };
 
@@ -164,7 +164,7 @@
         if (false) { // avoid bit rot, suppress warning
             test_alphagradients(canvas);
         }
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleHT.cpp b/samplecode/SampleHT.cpp
index 7b45250..099adcc 100644
--- a/samplecode/SampleHT.cpp
+++ b/samplecode/SampleHT.cpp
@@ -54,7 +54,7 @@
         fR = SkRect::MakeXYWH(rand.nextRangeF(0, 640), rand.nextRangeF(0, 480),
                               rand.nextRangeF(20, 200), rand.nextRangeF(20, 200));
         fColor = rand_opaque_color(rand.nextU());
-        fInterp = NULL;
+        fInterp = nullptr;
         fTime = 0;
     }
     
@@ -102,7 +102,7 @@
             switch (res) {
                 case SkInterpolator::kFreezeEnd_Result:
                     delete fInterp;
-                    fInterp = NULL;
+                    fInterp = nullptr;
                     break;
                 default:
                     break;
@@ -172,8 +172,8 @@
                 break;
             }
         }
-        this->inval(NULL);
-        return NULL;
+        this->inval(nullptr);
+        return nullptr;
     }
 
 private:
diff --git a/samplecode/SampleHairModes.cpp b/samplecode/SampleHairModes.cpp
index 8788577..ae41aa9 100644
--- a/samplecode/SampleHairModes.cpp
+++ b/samplecode/SampleHairModes.cpp
@@ -110,7 +110,7 @@
                 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
 
                 canvas->drawRect(bounds, fBGPaint);
-                canvas->saveLayer(&bounds, NULL);
+                canvas->saveLayer(&bounds, nullptr);
                 SkScalar dy = drawCell(canvas, mode,
                                        gAlphaValue[alpha & 1],
                                        gAlphaValue[alpha & 2]);
diff --git a/samplecode/SampleHairline.cpp b/samplecode/SampleHairline.cpp
index bb2e2f1..a8985c8 100644
--- a/samplecode/SampleHairline.cpp
+++ b/samplecode/SampleHairline.cpp
@@ -197,8 +197,8 @@
 
     void show_bitmaps(SkCanvas* canvas, const SkBitmap& b0, const SkBitmap& b1,
                       const SkIRect& inset) {
-        canvas->drawBitmap(b0, 0, 0, NULL);
-        canvas->drawBitmap(b1, SkIntToScalar(b0.width()), 0, NULL);
+        canvas->drawBitmap(b0, 0, 0, nullptr);
+        canvas->drawBitmap(b1, SkIntToScalar(b0.width()), 0, nullptr);
     }
 
     void onDrawContent(SkCanvas* canvas) override {
@@ -219,7 +219,7 @@
 
         bm2.eraseColor(SK_ColorTRANSPARENT);
         gProcs[fProcIndex].fProc(&c2, paint, bm);
-        canvas->drawBitmap(bm2, SkIntToScalar(10), SkIntToScalar(10), NULL);
+        canvas->drawBitmap(bm2, SkIntToScalar(10), SkIntToScalar(10), nullptr);
     }
 
     bool onAnimate(const SkAnimTimer&) override {
@@ -233,7 +233,7 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fDoAA = !fDoAA;
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleIdentityScale.cpp b/samplecode/SampleIdentityScale.cpp
index 7a329de..5a4e39d 100644
--- a/samplecode/SampleIdentityScale.cpp
+++ b/samplecode/SampleIdentityScale.cpp
@@ -25,7 +25,7 @@
 public:
     IdentityScaleView(const char imageFilename[]) {
       SkString resourcePath = GetResourcePath(imageFilename);
-      SkImageDecoder* codec = NULL;
+      SkImageDecoder* codec = nullptr;
       SkFILEStream stream(resourcePath.c_str());
       if (stream.isValid()) {
           codec = SkImageDecoder::Factory(&stream);
@@ -80,7 +80,7 @@
         canvas->drawBitmap( fBM, 100, 100, &paint );
         canvas->restore();
         canvas->drawText( text, strlen(text), 100, 400, paint );
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp
index f5b8822..5fce85c 100644
--- a/samplecode/SampleLayerMask.cpp
+++ b/samplecode/SampleLayerMask.cpp
@@ -58,7 +58,7 @@
     virtual void onDrawContent(SkCanvas* canvas) {
         SkRect  r;
         r.set(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(120), SkIntToScalar(120));
-        canvas->saveLayer(&r, NULL);
+        canvas->saveLayer(&r, nullptr);
         canvas->drawColor(SK_ColorRED);
         drawMask(canvas, r);
         canvas->restore();
diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp
index 0c34638..52bf5b3 100644
--- a/samplecode/SampleLayers.cpp
+++ b/samplecode/SampleLayers.cpp
@@ -30,7 +30,7 @@
 static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
     SkColor colors[] = { 0, SK_ColorWHITE };
     SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
-    SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode,
+    SkShader* s = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode,
                                                  0, &localMatrix);
 
     paint->setShader(s)->unref();
@@ -70,11 +70,11 @@
     canvas->clipRect(r);
 
     r.fBottom = SkIntToScalar(20);
-    canvas->saveLayer(&r, NULL);
+    canvas->saveLayer(&r, nullptr);
 
     r.fTop = SkIntToScalar(80);
     r.fBottom = SkIntToScalar(100);
-    canvas->saveLayer(&r, NULL);
+    canvas->saveLayer(&r, nullptr);
 
     // now draw the "content"
 
@@ -215,7 +215,7 @@
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(NULL);
+        this->inval(nullptr);
 
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
@@ -225,7 +225,7 @@
     }
 
     virtual bool handleKey(SkKey) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleLighting.cpp b/samplecode/SampleLighting.cpp
index 4838cf8..566ed7f 100755
--- a/samplecode/SampleLighting.cpp
+++ b/samplecode/SampleLighting.cpp
@@ -88,11 +88,11 @@
         canvas->drawRect(r, paint);
 
         // so we're constantly updating
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleLines.cpp b/samplecode/SampleLines.cpp
index 0166bc0..4570635 100644
--- a/samplecode/SampleLines.cpp
+++ b/samplecode/SampleLines.cpp
@@ -65,7 +65,7 @@
     void onDrawContent(SkCanvas* canvas) override {
         SkBitmap bm;
         SkImageDecoder::DecodeFile("/kill.gif", &bm);
-        canvas->drawBitmap(bm, 0, 0, NULL);
+        canvas->drawBitmap(bm, 0, 0, nullptr);
 
         this->drawRings(canvas);
         return;
@@ -98,8 +98,8 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         fAlpha = SkScalarRoundToInt(y);
-        this->inval(NULL);
-        return NULL;
+        this->inval(nullptr);
+        return nullptr;
     }
 private:
 
diff --git a/samplecode/SampleLua.cpp b/samplecode/SampleLua.cpp
index 5fc9ab0..96b15b9 100644
--- a/samplecode/SampleLua.cpp
+++ b/samplecode/SampleLua.cpp
@@ -39,7 +39,7 @@
 
 class LuaView : public SampleView {
 public:
-    LuaView() : fLua(NULL) {}
+    LuaView() : fLua(nullptr) {}
 
     virtual ~LuaView() { delete fLua; }
 
@@ -56,7 +56,7 @@
     }
 
     lua_State* ensureLua() {
-        if (NULL == fLua) {
+        if (nullptr == fLua) {
             fLua = new SkLua;
 
             SkString str = GetResourcePath(LUA_FILENAME);
@@ -90,7 +90,7 @@
                     SkDebugf("lua err: %s\n", lua_tostring(L, -1));
                 } else {
                     if (lua_isboolean(L, -1) && lua_toboolean(L, -1)) {
-                        this->inval(NULL);
+                        this->inval(nullptr);
                         return true;
                     }
                 }
@@ -117,7 +117,7 @@
                 SkDebugf("lua err: %s\n", lua_tostring(L, -1));
             } else {
                 if (lua_isboolean(L, -1) && lua_toboolean(L, -1)) {
-                    this->inval(NULL);
+                    this->inval(nullptr);
                 }
             }
         }
@@ -135,7 +135,7 @@
                 SkDebugf("lua err: %s\n", lua_tostring(L, -1));
             } else {
                 if (lua_isboolean(L, -1) && lua_toboolean(L, -1)) {
-                    this->inval(NULL);
+                    this->inval(nullptr);
                     Click* c = new Click(this);
                     c->setType(gLuaClickHandlerName);
                     return c;
@@ -150,7 +150,7 @@
             return this->INHERITED::onClick(click);
         }
 
-        const char* state = NULL;
+        const char* state = nullptr;
         switch (click->fState) {
             case Click::kMoved_State:
                 state = "moved";
@@ -162,7 +162,7 @@
                 break;
         }
         if (state) {
-            this->inval(NULL);
+            this->inval(nullptr);
             lua_State* L = fLua->get();
             lua_getglobal(L, gClickName);
             fLua->pushScalar(click->fCurr.x());
diff --git a/samplecode/SampleManyRects.cpp b/samplecode/SampleManyRects.cpp
index 9c9e985..0290af2 100644
--- a/samplecode/SampleManyRects.cpp
+++ b/samplecode/SampleManyRects.cpp
@@ -65,7 +65,7 @@
             canvas->drawRect(rect, paint);
             canvas->restore();
         }
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleMeasure.cpp b/samplecode/SampleMeasure.cpp
index 86f9b52..20335f2 100644
--- a/samplecode/SampleMeasure.cpp
+++ b/samplecode/SampleMeasure.cpp
@@ -35,7 +35,7 @@
 };
 
 static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
-    SkScalar    dy = paint.getFontMetrics(NULL);
+    SkScalar    dy = paint.getFontMetrics(nullptr);
 
     size_t      len = strlen(text);
     SkAutoTMalloc<SkScalar> autoWidths(len);
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp
index 9ada9ef..dc3e9df 100644
--- a/samplecode/SamplePatch.cpp
+++ b/samplecode/SamplePatch.cpp
@@ -42,7 +42,7 @@
     SkPoint pts[] = { { 0, 0, },
                       { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
     SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
-    return SkGradientShader::CreateLinear(pts, colors, NULL,
+    return SkGradientShader::CreateLinear(pts, colors, nullptr,
                     SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode);
 }
 
@@ -74,7 +74,7 @@
     samples[0] = cubic[0];
     for (int i = 1; i < segs; i++) {
         t += dt;
-        SkEvalCubicAt(cubic, t, &samples[i], NULL, NULL);
+        SkEvalCubicAt(cubic, t, &samples[i], nullptr, nullptr);
     }
 }
 
@@ -199,9 +199,9 @@
         }
         t += dt;
         canvas->drawVertices(SkCanvas::kTriangleStrip_VertexMode, stripCount,
-                             strip, doTextures ? tex : NULL,
-                             doColors ? colors : NULL, NULL,
-                             NULL, 0, paint);
+                             strip, doTextures ? tex : nullptr,
+                             doColors ? colors : nullptr, nullptr,
+                             nullptr, 0, paint);
     }
 }
 
@@ -294,7 +294,7 @@
         patch.setPatch(fPts);
         drawpatches(canvas, paint, nu, nv, &patch);
 
-        paint.setShader(NULL);
+        paint.setShader(nullptr);
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(5));
         canvas->drawPoints(SkCanvas::kPoints_PointMode, SK_ARRAY_COUNT(fPts), fPts, paint);
@@ -347,7 +347,7 @@
 
     bool onClick(Click* click) override {
         fPts[((PtClick*)click)->fIndex].set(click->fCurr.fX - DX, click->fCurr.fY - DY);
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index c09ff20..c977ca0 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -57,9 +57,9 @@
     {
 #ifdef SK_BUILD_FOR_WIN
         // windows doesn't have strtof
-        float x = (float)strtod("9.94099e+07", NULL);
+        float x = (float)strtod("9.94099e+07", nullptr);
 #else
-        float x = strtof("9.94099e+07", NULL);
+        float x = strtof("9.94099e+07", nullptr);
 #endif
         int ix = (int)x;
         int fx = (int)(x * 65536);
@@ -211,7 +211,7 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fShowHairline = !fShowHairline;
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
@@ -269,7 +269,7 @@
 
     void toggle(bool& value) {
         value = !value;
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 protected:
@@ -323,7 +323,7 @@
         if (click->fMeta.findS32("index", &index)) {
             SkASSERT((unsigned)index < N);
             fPts[index] = click->fCurr;
-            this->inval(NULL);
+            this->inval(nullptr);
             return true;
         }
         return false;
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index 494debf..27f1f30 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -76,7 +76,7 @@
 
     bool onClick(Click* click) override {
         fCenter.set(click->fCurr.fX, click->fCurr.fY);
-        this->inval(NULL);
+        this->inval(nullptr);
         return false;
     }
 
diff --git a/samplecode/SamplePathFuzz.cpp b/samplecode/SamplePathFuzz.cpp
index 70a052f..317833d 100644
--- a/samplecode/SamplePathFuzz.cpp
+++ b/samplecode/SamplePathFuzz.cpp
@@ -685,7 +685,7 @@
             path_fuzz_stroker(&offscreen, fIndex += 100);
             canvas->drawBitmap(offscreen, 0, 0);
         }
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SamplePdfFileViewer.cpp b/samplecode/SamplePdfFileViewer.cpp
index 747f729..950d42b 100644
--- a/samplecode/SamplePdfFileViewer.cpp
+++ b/samplecode/SamplePdfFileViewer.cpp
@@ -38,8 +38,8 @@
 
     static SkPicture* LoadPdf(const char path[]) {
         SkAutoTDelete<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path));
-        if (NULL == renderer.get()) {
-            return NULL;
+        if (nullptr == renderer.get()) {
+            return nullptr;
         }
 
         SkPicture* pic = new SkPicture;
@@ -51,8 +51,8 @@
     }
 
 public:
-    PdfFileViewer(const char name[] = NULL) : fFilename(name) {
-        fPicture = NULL;
+    PdfFileViewer(const char name[] = nullptr) : fFilename(name) {
+        fPicture = nullptr;
     }
 
     virtual ~PdfFileViewer() {
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index dd315f8..4ba4f39 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -46,12 +46,12 @@
 
 class PictFileView : public SampleView {
 public:
-    PictFileView(const char name[] = NULL)
+    PictFileView(const char name[] = nullptr)
         : fFilename(name)
         , fBBox(kNo_BBoxType)
         , fTileSize(SkSize::Make(0, 0)) {
         for (int i = 0; i < kBBoxTypeCount; ++i) {
-            fPictures[i] = NULL;
+            fPictures[i] = nullptr;
         }
         fCount = 0;
     }
@@ -126,7 +126,7 @@
                 canvas->setDrawFilter(&filter);
             }
             canvas->drawPicture(*picture);
-            canvas->setDrawFilter(NULL);
+            canvas->setDrawFilter(nullptr);
         }
 
 #ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
@@ -159,8 +159,8 @@
             SkPictureRecorder recorder;
             SkCanvas* can = recorder.beginRecording(SkIntToScalar(bm.width()),
                                                     SkIntToScalar(bm.height()),
-                                                    NULL, 0);
-            can->drawBitmap(bm, 0, 0, NULL);
+                                                    nullptr, 0);
+            can->drawBitmap(bm, 0, 0, nullptr);
             pic.reset(recorder.endRecording());
         } else {
             SkFILEStream stream(path);
@@ -174,7 +174,7 @@
                 SkPictureRecorder recorder;
                 pic->playback(recorder.beginRecording(pic->cullRect().width(),
                                                       pic->cullRect().height(),
-                                                      NULL, 0));
+                                                      nullptr, 0));
                 SkAutoTUnref<SkPicture> p2(recorder.endRecording());
 
                 SkString path2(path);
@@ -184,8 +184,8 @@
             }
         }
 
-        if (NULL == pic) {
-            return NULL;
+        if (nullptr == pic) {
+            return nullptr;
         }
 
         SkAutoTDelete<SkBBHFactory> factory;
diff --git a/samplecode/SamplePicture.cpp b/samplecode/SamplePicture.cpp
index 638af05..eb2cd73 100644
--- a/samplecode/SamplePicture.cpp
+++ b/samplecode/SamplePicture.cpp
@@ -39,7 +39,7 @@
     SkBitmap bm;
     SkString pngFilename = GetResourcePath("mandrill_512.png");
     SkAutoDataUnref data(SkData::NewFromFileName(pngFilename.c_str()));
-    if (data.get() != NULL) {
+    if (data.get() != nullptr) {
         SkInstallDiscardablePixelRef(data, &bm);
     }
     return bm;
@@ -63,14 +63,14 @@
 
         SkPictureRecorder recorder;
 
-        recorder.beginRecording(100, 100, NULL, 0);
+        recorder.beginRecording(100, 100, nullptr, 0);
         fSubPicture = recorder.endRecording();
 
-        SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0);
+        SkCanvas* canvas = recorder.beginRecording(100, 100, nullptr, 0);
         SkPaint paint;
         paint.setAntiAlias(true);
 
-        canvas->drawBitmap(fBitmap, 0, 0, NULL);
+        canvas->drawBitmap(fBitmap, 0, 0, nullptr);
 
         drawCircle(canvas, 50, SK_ColorBLACK);
         canvas->drawPicture(fSubPicture);
@@ -108,7 +108,7 @@
 
         canvas->save();
         canvas->scale(0.5f, 0.5f);
-        canvas->drawBitmap(fBitmap, 0, 0, NULL);
+        canvas->drawBitmap(fBitmap, 0, 0, nullptr);
         canvas->restore();
 
         paint.setAntiAlias(true);
@@ -127,7 +127,7 @@
         this->drawSomething(canvas);
 
         SkPictureRecorder recorder;
-        this->drawSomething(recorder.beginRecording(100, 100, NULL, 0));
+        this->drawSomething(recorder.beginRecording(100, 100, nullptr, 0));
         SkAutoTUnref<SkPicture> pict(recorder.endRecording());
 
         canvas->save();
@@ -161,7 +161,7 @@
 
     bool onEvent(const SkEvent& evt) override {
         if (evt.isType(INVAL_ALL_TYPE)) {
-            this->inval(NULL);
+            this->inval(nullptr);
             return true;
         }
         return this->INHERITED::onEvent(evt);
diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp
index 91a6a0f..3b02980 100644
--- a/samplecode/SampleQuadStroker.cpp
+++ b/samplecode/SampleQuadStroker.cpp
@@ -196,7 +196,7 @@
                 default:
                     fText.appendUnichar(uni);
             }
-            this->inval(NULL);
+            this->inval(nullptr);
             return true;
         }
         return this->INHERITED::onQuery(evt);
@@ -226,7 +226,7 @@
         SkCanvas* canvas = fMaxSurface->getCanvas();
         canvas->save();
         canvas->concat(fMatrix);
-        fMinSurface->draw(canvas, 0, 0, NULL);
+        fMinSurface->draw(canvas, 0, 0, nullptr);
         canvas->restore();
 
         SkPaint paint;
@@ -320,7 +320,7 @@
         if (drawText) {
             fMinSurface->getCanvas()->drawPath(path, paint);
             this->copyMinToMax();
-            fMaxSurface->draw(canvas, 0, 0, NULL);
+            fMaxSurface->draw(canvas, 0, 0, nullptr);
         }
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
@@ -541,7 +541,7 @@
         draw_button(canvas, fRRectButton);
         draw_button(canvas, fCircleButton);
         draw_button(canvas, fTextButton);
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
     class MyClick : public Click {
@@ -608,7 +608,7 @@
         if (index < (int) SK_ARRAY_COUNT(fPts)) {
             fPts[index].offset(SkIntToScalar(click->fICurr.fX - click->fIPrev.fX),
                                SkIntToScalar(click->fICurr.fY - click->fIPrev.fY));
-            this->inval(NULL);
+            this->inval(nullptr);
         } else if (index == (int) SK_ARRAY_COUNT(fPts) + 1) {
             fWeight = MapScreenYtoValue(click->fICurr.fY, fWeightControl, 0, 5);
         }
diff --git a/samplecode/SampleRectanizer.cpp b/samplecode/SampleRectanizer.cpp
index 7bb712c..55e70a2 100644
--- a/samplecode/SampleRectanizer.cpp
+++ b/samplecode/SampleRectanizer.cpp
@@ -127,7 +127,7 @@
         str.printf("Press \'h\' to toggle rects");
         canvas->drawText(str.c_str(), str.size(), 50, kHeight + 150, blackBigFont);
 
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 8047844..eb3e134 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -43,12 +43,12 @@
     // use the rect
     c.clear(SK_ColorTRANSPARENT);
     c.drawRect(r, paint);
-    canvas->drawBitmap(bitmap, 0, 0, NULL);
+    canvas->drawBitmap(bitmap, 0, 0, nullptr);
 
     // use the path
     c.clear(SK_ColorTRANSPARENT);
     c.drawPath(path, paint);
-    canvas->drawBitmap(bitmap, SkIntToScalar(2*width), 0, NULL);
+    canvas->drawBitmap(bitmap, SkIntToScalar(2*width), 0, nullptr);
 }
 
 static void drawFadingText(SkCanvas* canvas,
@@ -65,7 +65,7 @@
     // antialiasing
     bounds.inset(-SkIntToScalar(2), -SkIntToScalar(2));
 
-    canvas->saveLayer(&bounds, NULL);
+    canvas->saveLayer(&bounds, nullptr);
     canvas->drawText(text, len, x, y, paint);
 
     const SkPoint pts[] = {
@@ -112,7 +112,7 @@
     canvas->drawText(str, len, x, y, paint);
 
     y += 20;
-    paint.setShader(NULL);
+    paint.setShader(nullptr);
     drawFadingText(canvas, str, len, x, y, paint);
 }
 
@@ -269,7 +269,7 @@
 
             {
                 char    buffer[1000];
-                SkDEBUGCODE(size_t  size = ) tmp.writeToMemory(NULL);
+                SkDEBUGCODE(size_t  size = ) tmp.writeToMemory(nullptr);
                 SkASSERT(size <= sizeof(buffer));
                 SkDEBUGCODE(size_t  size2 = ) tmp.writeToMemory(buffer);
                 SkASSERT(size == size2);
@@ -392,13 +392,13 @@
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) override {
         return fRect.contains(SkScalarRoundToInt(x),
-                              SkScalarRoundToInt(y)) ? new Click(this) : NULL;
+                              SkScalarRoundToInt(y)) ? new Click(this) : nullptr;
     }
 
     bool onClick(Click* click) override {
         fRect.offset(click->fICurr.fX - click->fIPrev.fX,
                      click->fICurr.fY - click->fIPrev.fY);
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleRepeatTile.cpp b/samplecode/SampleRepeatTile.cpp
index 61bc8cd..9287439 100644
--- a/samplecode/SampleRepeatTile.cpp
+++ b/samplecode/SampleRepeatTile.cpp
@@ -67,7 +67,7 @@
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(NULL);
+        this->inval(nullptr);
 
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
@@ -77,7 +77,7 @@
     }
 
     virtual bool handleKey(SkKey) {
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleShaderText.cpp b/samplecode/SampleShaderText.cpp
index cf7cf96..f13fd4e 100644
--- a/samplecode/SampleShaderText.cpp
+++ b/samplecode/SampleShaderText.cpp
@@ -50,8 +50,8 @@
 };
 
 static const GradData gGradData[] = {
-    { 2, gColors, NULL },
-    { 5, gColors, NULL },
+    { 2, gColors, nullptr },
+    { 5, gColors, nullptr },
 };
 
 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
@@ -182,7 +182,7 @@
             ++i;
             canvas->translate(SkIntToScalar((i / testsPerCol) * colWidth),
                               SkIntToScalar((i % testsPerCol) * rowHeight));
-            canvas->drawTextOnPath(text, textLen, path, NULL, paint);
+            canvas->drawTextOnPath(text, textLen, path, nullptr, paint);
             canvas->restore();
         }
         canvas->restore();
diff --git a/samplecode/SampleShaders.cpp b/samplecode/SampleShaders.cpp
index a9a8cf9..dd444ec 100644
--- a/samplecode/SampleShaders.cpp
+++ b/samplecode/SampleShaders.cpp
@@ -31,7 +31,7 @@
     pts[1].set(0, SkIntToScalar(bm.height()));
     colors[0] = SK_ColorBLACK;
     colors[1] = SkColorSetARGB(0, 0, 0, 0);
-    SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
+    SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 
     SkShader* shaderB = SkShader::CreateBitmapShader(bm,
                         SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
@@ -61,13 +61,13 @@
         pts[1].set(SkIntToScalar(100), 0);
         colors[0] = SK_ColorRED;
         colors[1] = SK_ColorBLUE;
-        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
+        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 
         pts[0].set(0, 0);
         pts[1].set(0, SkIntToScalar(100));
         colors[0] = SK_ColorBLACK;
         colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
-        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
+        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 
         SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
 
@@ -111,14 +111,14 @@
         h = 80;
         r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
 
-        paint.setShader(NULL);
+        paint.setShader(nullptr);
         canvas->drawRect(r, paint);
         paint.setShader(make_bitmapfade(fBitmap))->unref();
         canvas->drawRect(r, paint);
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 83e91bb..8b85336 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -93,7 +93,7 @@
 
 static void fill_pe(SkPaint* paint) {
     paint->setStyle(SkPaint::kFill_Style);
-    paint->setPathEffect(NULL);
+    paint->setPathEffect(nullptr);
 }
 
 static void discrete_pe(SkPaint* paint) {
@@ -171,10 +171,10 @@
 };
 
 static const GradData gGradData[] = {
-{ 2, gColors, NULL },
+{ 2, gColors, nullptr },
 { 2, gColors, gPos0 },
 { 2, gColors, gPos1 },
-{ 5, gColors, NULL },
+{ 5, gColors, nullptr },
 { 5, gColors, gPos2 }
 };
 
@@ -290,7 +290,7 @@
     paint.setStyle(SkPaint::kFill_Style);
 
     paint.setTextSize(50);
-    canvas->drawTextOnPath(text, len, path, NULL, paint);
+    canvas->drawTextOnPath(text, len, path, nullptr, paint);
 
     paint.setColor(SK_ColorRED);
     matrix.setScale(-SK_Scalar1, SK_Scalar1);
@@ -327,7 +327,7 @@
     SkPoint pts[] = { { 0, 0 },
                       { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
     SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
-    return SkGradientShader::CreateLinear(pts, colors, NULL,
+    return SkGradientShader::CreateLinear(pts, colors, nullptr,
                                           SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode);
 }
 
@@ -338,7 +338,7 @@
     SkPoint*                fVerts;
     SkPoint*                fTexs;
 
-    Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
+    Rec() : fCount(0), fVerts(nullptr), fTexs(nullptr) {}
     ~Rec() { delete[] fVerts; delete[] fTexs; }
 };
 
@@ -443,24 +443,24 @@
     for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
         canvas->save();
 
-        paint.setShader(NULL);
+        paint.setShader(nullptr);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             NULL, NULL, NULL, 0, paint);
+                             nullptr, nullptr, nullptr, 0, paint);
 
         canvas->translate(SkIntToScalar(210), 0);
 
         paint.setShader(fShader0);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             NULL, NULL, NULL, 0, paint);
+                             nullptr, nullptr, nullptr, 0, paint);
 
         canvas->translate(SkIntToScalar(210), 0);
 
         paint.setShader(fShader1);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             NULL, NULL, NULL, 0, paint);
+                             nullptr, nullptr, nullptr, 0, paint);
         canvas->restore();
 
         canvas->translate(0, SkIntToScalar(250));
@@ -475,7 +475,7 @@
                                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))))->unref();
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
-    p.setMaskFilter(NULL);
+    p.setMaskFilter(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -530,7 +530,7 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
 
-    p.setXfermode(NULL);
+    p.setXfermode(nullptr);
     rastBuilder->addLayer(p);
 }
 
@@ -585,8 +585,8 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p);
 
-    p.setPathEffect(NULL);
-    p.setXfermode(NULL);
+    p.setPathEffect(nullptr);
+    p.setXfermode(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -603,8 +603,8 @@
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rastBuilder->addLayer(p);
 
-    p.setPathEffect(NULL);
-    p.setXfermode(NULL);
+    p.setPathEffect(nullptr);
+    p.setXfermode(nullptr);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -713,8 +713,8 @@
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         this->init();
         fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc);
-        this->inval(NULL);
-        return NULL;
+        this->inval(nullptr);
+        return nullptr;
     }
 
 private:
diff --git a/samplecode/SampleStringArt.cpp b/samplecode/SampleStringArt.cpp
index 5bc667b..74f3bd8 100644
--- a/samplecode/SampleStringArt.cpp
+++ b/samplecode/SampleStringArt.cpp
@@ -59,8 +59,8 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         fAngle = x/width();
-        this->inval(NULL);
-        return NULL;
+        this->inval(nullptr);
+        return nullptr;
     }
 private:
 
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index 63809ce..9bcfcd9 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -210,7 +210,7 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) override {
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 private:
diff --git a/samplecode/SampleSubpixelTranslate.cpp b/samplecode/SampleSubpixelTranslate.cpp
index 0f7639e..7e067a6 100644
--- a/samplecode/SampleSubpixelTranslate.cpp
+++ b/samplecode/SampleSubpixelTranslate.cpp
@@ -27,7 +27,7 @@
       : fHorizontalVelocity(horizontalVelocity),
         fVerticalVelocity(verticalVelocity) {
       SkString resourcePath = GetResourcePath(imageFilename);
-      SkImageDecoder* codec = NULL;
+      SkImageDecoder* codec = nullptr;
       SkFILEStream stream(resourcePath.c_str());
       if (stream.isValid()) {
           codec = SkImageDecoder::Factory(&stream);
@@ -109,7 +109,7 @@
 
         fCurPos.fX += fHorizontalVelocity;
         fCurPos.fY += fVerticalVelocity;
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
index aae42c1..f5f8dbe 100644
--- a/samplecode/SampleText.cpp
+++ b/samplecode/SampleText.cpp
@@ -148,7 +148,7 @@
         {
             SkRect r;
             r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20));
-       //     canvas->saveLayer(&r, NULL, SkCanvas::kHasAlphaLayer_SaveFlag);
+       //     canvas->saveLayer(&r, nullptr, SkCanvas::kHasAlphaLayer_SaveFlag);
         }
 
         SkPaint paint;
@@ -188,7 +188,7 @@
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) override {
         fClickX = x;
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
index f344021..d8fd104 100644
--- a/samplecode/SampleTextAlpha.cpp
+++ b/samplecode/SampleTextAlpha.cpp
@@ -65,7 +65,7 @@
             paint.setTextSize(SkIntToScalar(ps));
             paint.setTextSize(SkIntToScalar(24));
             canvas->drawText(str, strlen(str), x, y, paint);
-            y += paint.getFontMetrics(NULL);
+            y += paint.getFontMetrics(nullptr);
         }
     }
 
@@ -81,7 +81,7 @@
             y = 255;
         }
         fByte = y;
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleTextOnPath.cpp b/samplecode/SampleTextOnPath.cpp
index 7ea4694..ea2ae81 100644
--- a/samplecode/SampleTextOnPath.cpp
+++ b/samplecode/SampleTextOnPath.cpp
@@ -71,7 +71,7 @@
     SkPathMeasure   meas(path, false);
     SkScalar pathLen = meas.getLength();
 
-    canvas->drawTextOnPath(text, len, path, NULL, paint);
+    canvas->drawTextOnPath(text, len, path, nullptr, paint);
 
     paint.setColor(SK_ColorRED);
     matrix.setScale(-SK_Scalar1, SK_Scalar1);
@@ -148,12 +148,12 @@
         textPathMatrix(canvas);
 
         if (REPEAT_COUNT > 1)
-            this->inval(NULL);
+            this->inval(nullptr);
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fHints += 1;
-        this->inval(NULL);
+        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleTextureDomain.cpp b/samplecode/SampleTextureDomain.cpp
index 7c770a9..6557533 100644
--- a/samplecode/SampleTextureDomain.cpp
+++ b/samplecode/SampleTextureDomain.cpp
@@ -85,11 +85,11 @@
         paint.setMaskFilter(mf)->unref();
         canvas->drawImageRect(image, srcRect, dstRect, &paint);
 
-        // Blur and a rotation + NULL src rect
+        // Blur and a rotation + nullptr src rect
         // This should not trigger the texture domain code
         // but it will test a code path in SkGpuDevice::drawBitmap
         // that handles blurs with rects transformed to non-
-        // orthogonal rects. It also tests the NULL src rect handling
+        // orthogonal rects. It also tests the nullptr src rect handling
         mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
                                       SkBlurMask::ConvertRadiusToSigma(5),
                                       SkBlurMaskFilter::kHighQuality_BlurFlag);
diff --git a/samplecode/SampleTiling.cpp b/samplecode/SampleTiling.cpp
index 5f995e2..ba79e5a 100644
--- a/samplecode/SampleTiling.cpp
+++ b/samplecode/SampleTiling.cpp
@@ -97,9 +97,9 @@
         SkScalar x = SkIntToScalar(10);
 
         SkPictureRecorder recorder;
-        SkCanvas* textCanvas = NULL;
-        if (NULL == fTextPicture) {
-            textCanvas = recorder.beginRecording(1000, 1000, NULL, 0);
+        SkCanvas* textCanvas = nullptr;
+        if (nullptr == fTextPicture) {
+            textCanvas = recorder.beginRecording(1000, 1000, nullptr, 0);
         }
 
         if (textCanvas) {
@@ -153,7 +153,7 @@
         }
 
         if (textCanvas) {
-            SkASSERT(NULL == fTextPicture);
+            SkASSERT(nullptr == fTextPicture);
             fTextPicture.reset(recorder.endRecording());
         }
 
diff --git a/samplecode/SampleTinyBitmap.cpp b/samplecode/SampleTinyBitmap.cpp
index 57ce2ff..8b1bdf0 100644
--- a/samplecode/SampleTinyBitmap.cpp
+++ b/samplecode/SampleTinyBitmap.cpp
@@ -24,7 +24,7 @@
     SkBitmap bm;
     bm.allocPixels(SkImageInfo::Make(1, 1, kIndex_8_SkColorType,
                                      kPremul_SkAlphaType),
-                   NULL, ctable);
+                   nullptr, ctable);
     ctable->unref();
 
     bm.lockPixels();
diff --git a/samplecode/SampleUnpremul.cpp b/samplecode/SampleUnpremul.cpp
index ee3ec82..6d5cf6c 100644
--- a/samplecode/SampleUnpremul.cpp
+++ b/samplecode/SampleUnpremul.cpp
@@ -88,7 +88,7 @@
                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(2)),
                                      0, 0));
         paint.setLooper(looper);
-        SkScalar height = paint.getFontMetrics(NULL);
+        SkScalar height = paint.getFontMetrics(nullptr);
         if (!fDecodeSucceeded) {
             SkString failure;
             if (fResPath.size() == 0) {
@@ -169,7 +169,7 @@
         }
         SkFILEStream stream(fCurrFile.c_str());
         SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(&stream));
-        if (NULL == decoder.get()) {
+        if (nullptr == decoder.get()) {
             fDecodeSucceeded = false;
             return;
         }
@@ -178,7 +178,7 @@
         }
         fDecodeSucceeded = decoder->decode(&stream, &fBitmap, kN32_SkColorType,
                 SkImageDecoder::kDecodePixels_Mode) != SkImageDecoder::kFailure;
-        this->inval(NULL);
+        this->inval(nullptr);
     }
 
     void togglePremul() {
diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp
index 138ab2e..2f2dc02 100644
--- a/samplecode/SampleVertices.cpp
+++ b/samplecode/SampleVertices.cpp
@@ -46,7 +46,7 @@
     SkPoint pts[] = { { 0, 0 },
                       { SkIntToScalar(size.fX), SkIntToScalar(size.fY) } };
     SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
-    return SkGradientShader::CreateLinear(pts, colors, NULL,
+    return SkGradientShader::CreateLinear(pts, colors, nullptr,
                     SK_ARRAY_COUNT(colors), SkShader::kMirror_TileMode);
 }
 
@@ -95,24 +95,24 @@
         for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
             canvas->save();
 
-            paint.setShader(NULL);
+            paint.setShader(nullptr);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 NULL, NULL, NULL, 0, paint);
+                                 nullptr, nullptr, nullptr, 0, paint);
 
             canvas->translate(SkIntToScalar(250), 0);
 
             paint.setShader(fShader0);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 NULL, NULL, NULL, 0, paint);
+                                 nullptr, nullptr, nullptr, 0, paint);
 
             canvas->translate(SkIntToScalar(250), 0);
 
             paint.setShader(fShader1);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 NULL, NULL, NULL, 0, paint);
+                                 nullptr, nullptr, nullptr, 0, paint);
             canvas->restore();
 
             canvas->translate(0, SkIntToScalar(250));
@@ -126,7 +126,7 @@
     bool onClick(Click* click) override {
     //    fCurrX = click->fICurr.fX;
     //    fCurrY = click->fICurr.fY;
-        this->inval(NULL);
+        this->inval(nullptr);
         return true;
     }
 
@@ -137,7 +137,7 @@
         SkPoint*                fVerts;
         SkPoint*                fTexs;
 
-        Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
+        Rec() : fCount(0), fVerts(nullptr), fTexs(nullptr) {}
         ~Rec() { delete[] fVerts; delete[] fTexs; }
     };
 
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index fff4bed..a17a06e 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -178,13 +178,13 @@
                 p.setShader(s);
                 canvas->drawRect(r, p);
 
-                canvas->saveLayer(&r, NULL);
+                canvas->saveLayer(&r, nullptr);
                 draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
                 canvas->restore();
 
                 r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
                 p.setStyle(SkPaint::kStroke_Style);
-                p.setShader(NULL);
+                p.setShader(nullptr);
                 canvas->drawRect(r, p);
 
                 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel),
