diff --git a/src/gpu/text/GrAtlasManager.cpp b/src/gpu/text/GrAtlasManager.cpp
index 03f7c4e..3ca75f1 100644
--- a/src/gpu/text/GrAtlasManager.cpp
+++ b/src/gpu/text/GrAtlasManager.cpp
@@ -139,10 +139,10 @@
 // TODO we can handle some of these cases if we really want to, but the long term solution is to
 // get the actual glyph image itself when we get the glyph metrics.
 GrDrawOpAtlas::ErrorCode GrAtlasManager::addGlyphToAtlas(const SkGlyph& skGlyph,
-                                                         int padding,
                                                          GrGlyph* grGlyph,
                                                          GrResourceProvider* resourceProvider,
-                                                         GrDeferredUploadTarget* uploadTarget) {
+                                                         GrDeferredUploadTarget* uploadTarget,
+                                                         bool bilerpPadding) {
     if (skGlyph.image() == nullptr) {
         return GrDrawOpAtlas::ErrorCode::kError;
     }
@@ -152,12 +152,8 @@
     GrMaskFormat expectedMaskFormat = this->resolveMaskFormat(glyphFormat);
     int bytesPerPixel = GrMaskFormatBytesPerPixel(expectedMaskFormat);
 
-    if (padding > 0) {
-        SkASSERT(skGlyph.maskFormat() != SkMask::kSDF_Format);
-    }
-
-    SkASSERT(padding == 0 || padding == 1);
     // Add 1 pixel padding around grGlyph if needed.
+    int padding = bilerpPadding ? 1 : 0;
     const int width = skGlyph.width() + 2*padding;
     const int height = skGlyph.height() + 2*padding;
     int rowBytes = width * bytesPerPixel;
diff --git a/src/gpu/text/GrAtlasManager.h b/src/gpu/text/GrAtlasManager.h
index 52bada5..19c79f6 100644
--- a/src/gpu/text/GrAtlasManager.h
+++ b/src/gpu/text/GrAtlasManager.h
@@ -46,11 +46,13 @@
 
     bool hasGlyph(GrMaskFormat, GrGlyph*);
 
+    // If bilerpPadding == true then addGlyphToAtlas adds a 1 pixel border to the glyph before
+    // inserting it into the atlas.
     GrDrawOpAtlas::ErrorCode addGlyphToAtlas(const SkGlyph& skGlyph,
-                                             int padding,
                                              GrGlyph* grGlyph,
                                              GrResourceProvider* resourceProvider,
-                                             GrDeferredUploadTarget* uploadTarget);
+                                             GrDeferredUploadTarget* uploadTarget,
+                                             bool bilerpPadding = false);
 
     // To ensure the GrDrawOpAtlas does not evict the Glyph Mask from its texture backing store,
     // the client must pass in the current op token along with the GrGlyph.
diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp
index 4768b7c..6cb646a 100644
--- a/src/gpu/text/GrTextBlob.cpp
+++ b/src/gpu/text/GrTextBlob.cpp
@@ -144,8 +144,8 @@
 
 std::tuple<bool, int> GrGlyphVector::regenerateAtlas(int begin, int end,
                                                      GrMaskFormat maskFormat,
-                                                     int padding,
-                                                     GrMeshDrawOp::Target* target) {
+                                                     GrMeshDrawOp::Target* target,
+                                                     bool bilerpPadding) {
     GrAtlasManager* atlasManager = target->atlasManager();
     GrDeferredUploadTarget* uploadTarget = target->deferredUploadTarget();
 
@@ -178,8 +178,8 @@
             if (!atlasManager->hasGlyph(maskFormat, grGlyph)) {
                 const SkGlyph& skGlyph = *metricsAndImages.glyph(grGlyph->fPackedID);
                 auto code = atlasManager->addGlyphToAtlas(
-                        skGlyph, padding, grGlyph,
-                        target->resourceProvider(), uploadTarget);
+                        skGlyph, grGlyph, target->resourceProvider(),
+                        uploadTarget, bilerpPadding);
                 if (code != GrDrawOpAtlas::ErrorCode::kSucceeded) {
                     success = code != GrDrawOpAtlas::ErrorCode::kError;
                     break;
@@ -363,7 +363,7 @@
 
 std::tuple<bool, int>
 GrDirectMaskSubRun::regenerateAtlas(int begin, int end, GrMeshDrawOp::Target* target) const {
-    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, 0, target);
+    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, target);
 }
 
 template <typename Rect>
@@ -567,7 +567,7 @@
 
 std::tuple<bool, int> GrTransformedMaskSubRun::regenerateAtlas(int begin, int end,
                                                                GrMeshDrawOp::Target* target) const {
-    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, 1, target);
+    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, target, true);
 }
 
 template<typename Quad, typename VertexData>
@@ -626,7 +626,6 @@
     }
 }
 
-
 void GrTransformedMaskSubRun::fillVertexData(void* vertexDst,
                                              int offset, int count,
                                              GrColor color,
@@ -840,7 +839,7 @@
 std::tuple<bool, int> GrSDFTSubRun::regenerateAtlas(
         int begin, int end, GrMeshDrawOp::Target *target) const {
 
-    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, 0, target);
+    return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, target);
 }
 
 size_t GrSDFTSubRun::vertexStride() const {
diff --git a/src/gpu/text/GrTextBlob.h b/src/gpu/text/GrTextBlob.h
index 4f2a966..4e6a3a5 100644
--- a/src/gpu/text/GrTextBlob.h
+++ b/src/gpu/text/GrTextBlob.h
@@ -291,7 +291,10 @@
 
     SkScalar strikeToSourceRatio() const { return fStrikeSpec.strikeToSourceRatio(); }
     std::tuple<bool, int> regenerateAtlas(
-            int begin, int end, GrMaskFormat maskFormat, int padding, GrMeshDrawOp::Target *target);
+            int begin, int end,
+            GrMaskFormat maskFormat,
+            GrMeshDrawOp::Target *target,
+            bool bilerpPadding = false);
 
     static size_t GlyphVectorSize(size_t count) {
         return sizeof(Variant) * count;
