merge in klp-release history after reset to klp-dev
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
index 8f0f1cf..5a2c315 100644
--- a/src/gpu/GrTextContext.cpp
+++ b/src/gpu/GrTextContext.cpp
@@ -152,13 +152,13 @@
         if (fStrike->getGlyphAtlas(glyph, scaler)) {
             goto HAS_ATLAS;
         }
-
+#if 0 // M30 specific revert of font cache improvement to fix https://code.google.com/p/chromium/issues/detail?id=303803
         // try to clear out an unused atlas before we flush
         fContext->getFontCache()->freeAtlasExceptFor(fStrike);
         if (fStrike->getGlyphAtlas(glyph, scaler)) {
             goto HAS_ATLAS;
         }
-
+#endif
         // before we purge the cache, we must flush any accumulated draws
         this->flushGlyphs();
         fContext->flush();
diff --git a/src/ports/SkFontHost_fontconfig.cpp b/src/ports/SkFontHost_fontconfig.cpp
index 012ce90..0db44b2 100644
--- a/src/ports/SkFontHost_fontconfig.cpp
+++ b/src/ports/SkFontHost_fontconfig.cpp
@@ -109,6 +109,15 @@
         return NULL;
     }
 
+    // check if we, in fact, already have this. perhaps fontconfig aliased the
+    // requested name to some other name we actually have...
+    rec.fFamilyName = outFamilyName.c_str();
+    rec.fStyle = outStyle;
+    face = SkTypefaceCache::FindByProcAndRef(find_proc, &rec);
+    if (face) {
+        return face;
+    }
+
     face = SkNEW_ARGS(FontConfigTypeface, (outStyle, indentity, outFamilyName));
     SkTypefaceCache::Add(face, style);
 //    SkDebugf("add face <%s> <%s> %p [%d]\n", familyName, outFamilyName.c_str(), face, face->getRefCnt());
diff --git a/tests/FontMgrTest.cpp b/tests/FontMgrTest.cpp
index 6b6ee9a..00ff79b 100644
--- a/tests/FontMgrTest.cpp
+++ b/tests/FontMgrTest.cpp
@@ -11,6 +11,27 @@
 #include "SkFontMgr.h"
 #include "SkTypeface.h"
 
+/*
+ *  If the font backend is going to "alias" some font names to other fonts
+ *  (e.g. sans -> Arial) then we want to at least get the same typeface back
+ *  if we request the alias name multiple times.
+ */
+static void test_badnames(skiatest::Reporter* reporter) {
+    const char* inName = "sans";
+    SkAutoTUnref<SkTypeface> first(SkTypeface::CreateFromName(inName, SkTypeface::kNormal));
+    
+    SkString name;
+    for (int i = 0; i < 10; ++i) {
+        SkAutoTUnref<SkTypeface> face(SkTypeface::CreateFromName(inName, SkTypeface::kNormal));
+#if 0
+        face->getFamilyName(&name);
+        printf("request %s, received %s, first id %x received %x\n",
+               inName, name.c_str(), first->uniqueID(), face->uniqueID());
+#endif
+        REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID());
+    }
+}
+
 static void test_fontiter(skiatest::Reporter* reporter, bool verbose) {
     SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
     int count = fm->countFamilies();
@@ -49,6 +70,7 @@
 
 static void TestFontMgr(skiatest::Reporter* reporter) {
     test_fontiter(reporter, FLAGS_verboseFontMgr);
+    test_badnames(reporter);
 }
 
 #include "TestClassDef.h"