diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 7bbdff7..638f670 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -57,12 +57,7 @@
         return SkStringPrintf("Couldn't decode %s.", fPath.c_str());
     }
 
-    SkImageInfo decodeInfo;
-    if (!codec->getInfo(&decodeInfo)) {
-        return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str());
-    }
-
-    decodeInfo = decodeInfo.makeColorType(canvasInfo.colorType());
+    SkImageInfo decodeInfo = codec->getInfo().makeColorType(canvasInfo.colorType());
     if (decodeInfo.alphaType() == kUnpremul_SkAlphaType) {
         // FIXME: Currently we cannot draw unpremultiplied sources.
         decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType);
@@ -93,11 +88,7 @@
 SkISize CodecSrc::size() const {
     SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
     SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
-    SkImageInfo info;
-    if (codec && codec->getInfo(&info)) {
-        return info.dimensions();
-    }
-    return SkISize::Make(0,0);
+    return codec->getInfo().dimensions();
 }
 
 Name CodecSrc::name() const {
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index 6d0557c..3550bb1 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -58,10 +58,12 @@
      *  initially returns a non-opaque answer, but completing the decode
      *  reveals that the image is actually opaque.
      */
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
     bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
         *info = fInfo;
         return true;
     }
+#endif
 
     // Helper for subclasses.
     const SkImageInfo& getOriginalInfo() { return fInfo; }
@@ -99,5 +101,7 @@
     const SkImageInfo       fInfo;
     SkAutoTDelete<SkStream> fStream;
     bool                    fNeedsRewind;
+
+    typedef SkImageGenerator INHERITED;
 };
 #endif // SkCodec_DEFINED
diff --git a/include/core/SkImageGenerator.h b/include/core/SkImageGenerator.h
index a5440bd..5f8f5ba 100644
--- a/include/core/SkImageGenerator.h
+++ b/include/core/SkImageGenerator.h
@@ -65,15 +65,19 @@
     SkData* refEncodedData() { return this->onRefEncodedData(); }
 
     /**
-     *  Return some information about the image, allowing the owner of
-     *  this object to allocate pixels.
-     *
-     *  Repeated calls to this function should give the same results,
-     *  allowing the PixelRef to be immutable.
-     *
-     *  @return false if anything goes wrong.
+     *  Return the ImageInfo associated with this generator.
      */
-    bool getInfo(SkImageInfo* info);
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
+    SkImageInfo getInfo();
+    bool getInfo(SkImageInfo* info) {
+        if (info) {
+            *info = this->getInfo();
+        }
+        return true;
+    }
+#else
+    const SkImageInfo& getInfo() const { return fInfo; }
+#endif
 
     /**
      *  Used to describe the result of a call to getPixels().
@@ -206,8 +210,14 @@
     static SkImageGenerator* NewFromData(SkData*);
 
 protected:
-    virtual SkData* onRefEncodedData();
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
+    SkImageGenerator() : fInfo(SkImageInfo::MakeUnknown(0, 0) ) {}
     virtual bool onGetInfo(SkImageInfo* info);
+#endif
+    SkImageGenerator(const SkImageInfo& info) : fInfo(info) {}
+
+    virtual SkData* onRefEncodedData();
+
 #ifdef SK_SUPPORT_LEGACY_OPTIONLESS_GET_PIXELS
     virtual Result onGetPixels(const SkImageInfo& info,
                                void* pixels, size_t rowBytes,
@@ -219,6 +229,9 @@
     virtual bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3]);
     virtual bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3],
                                  SkYUVColorSpace* colorSpace);
+
+private:
+    const SkImageInfo fInfo;
 };
 
 #endif  // SkImageGenerator_DEFINED
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index d557087..12341f5 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -46,7 +46,8 @@
 }
 
 SkCodec::SkCodec(const SkImageInfo& info, SkStream* stream)
-    : fInfo(info)
+    : INHERITED(info)
+    , fInfo(info)
     , fStream(stream)
     , fNeedsRewind(false)
 {}
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index 4c69fd2..27bc141 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -7,13 +7,15 @@
 
 #include "SkImageGenerator.h"
 
-bool SkImageGenerator::getInfo(SkImageInfo* info) {
-    SkImageInfo dummy;
-    if (NULL == info) {
-        info = &dummy;
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
+SkImageInfo SkImageGenerator::getInfo() {
+    SkImageInfo info;
+    if (!this->onGetInfo(&info)) {
+        info = SkImageInfo::MakeUnknown(0, 0);
     }
-    return this->onGetInfo(info);
+    return info;
 }
+#endif
 
 SkImageGenerator::Result SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels,
                                                      size_t rowBytes, const Options* options,
@@ -120,9 +122,11 @@
     return NULL;
 }
 
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
 bool SkImageGenerator::onGetInfo(SkImageInfo*) {
     return false;
 }
+#endif
 
 #ifdef SK_SUPPORT_LEGACY_OPTIONLESS_GET_PIXELS
 SkImageGenerator::Result SkImageGenerator::onGetPixels(const SkImageInfo&, void*, size_t,
diff --git a/src/images/SkDecodingImageGenerator.cpp b/src/images/SkDecodingImageGenerator.cpp
index 170397d..337a964 100644
--- a/src/images/SkDecodingImageGenerator.cpp
+++ b/src/images/SkDecodingImageGenerator.cpp
@@ -38,10 +38,12 @@
 
 protected:
     SkData* onRefEncodedData() SK_OVERRIDE;
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
     bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
         *info = fInfo;
         return true;
     }
+#endif
     virtual Result onGetPixels(const SkImageInfo& info,
                                void* pixels, size_t rowBytes, const Options&,
                                SkPMColor ctable[], int* ctableCount) SK_OVERRIDE;
@@ -116,7 +118,8 @@
         const SkImageInfo& info,
         int sampleSize,
         bool ditherImage)
-    : fData(data)
+    : INHERITED(info)
+    , fData(data)
     , fStream(stream)
     , fInfo(info)
     , fSampleSize(sampleSize)
diff --git a/src/lazy/SkCachingPixelRef.cpp b/src/lazy/SkCachingPixelRef.cpp
index dc53a5d..5fc0d2a 100644
--- a/src/lazy/SkCachingPixelRef.cpp
+++ b/src/lazy/SkCachingPixelRef.cpp
@@ -11,11 +11,12 @@
 
 bool SkCachingPixelRef::Install(SkImageGenerator* generator,
                                 SkBitmap* dst) {
-    SkImageInfo info;
     SkASSERT(dst != NULL);
-    if ((NULL == generator)
-        || !(generator->getInfo(&info))
-        || !dst->setInfo(info)) {
+    if (NULL == generator) {
+        return false;
+    }
+    const SkImageInfo info = generator->getInfo();
+    if (!dst->setInfo(info)) {
         SkDELETE(generator);
         return false;
     }
diff --git a/src/lazy/SkDiscardablePixelRef.cpp b/src/lazy/SkDiscardablePixelRef.cpp
index b810c2b..1e42042 100644
--- a/src/lazy/SkDiscardablePixelRef.cpp
+++ b/src/lazy/SkDiscardablePixelRef.cpp
@@ -109,12 +109,12 @@
 
 bool SkInstallDiscardablePixelRef(SkImageGenerator* generator, SkBitmap* dst,
                                   SkDiscardableMemory::Factory* factory) {
-    SkImageInfo info;
     SkAutoTDelete<SkImageGenerator> autoGenerator(generator);
-    if ((NULL == autoGenerator.get())
-        || (!autoGenerator->getInfo(&info))
-        || info.isEmpty()
-        || (!dst->setInfo(info))) {
+    if (NULL == autoGenerator.get()) {
+        return false;
+    }
+    SkImageInfo info = autoGenerator->getInfo();
+    if (info.isEmpty() || !dst->setInfo(info)) {
         return false;
     }
     // Since dst->setInfo() may have changed/fixed-up info, we copy it back from that bitmap
diff --git a/src/ports/SkImageGenerator_skia.cpp b/src/ports/SkImageGenerator_skia.cpp
index 1448d57..6938880 100644
--- a/src/ports/SkImageGenerator_skia.cpp
+++ b/src/ports/SkImageGenerator_skia.cpp
@@ -39,7 +39,7 @@
 
 public:
     SkImageDecoderGenerator(const SkImageInfo& info, SkImageDecoder* decoder, SkData* data)
-        : fInfo(info), fDecoder(decoder), fData(SkRef(data))
+        : INHERITED(info), fInfo(info), fDecoder(decoder), fData(SkRef(data))
     {}
 
 protected:
@@ -47,10 +47,12 @@
         return SkRef(fData.get());
     }
 
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
     virtual bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
         *info = fInfo;
         return true;
     }
+#endif
 
     virtual Result onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
                                const Options&,
@@ -92,7 +94,9 @@
         SkMemoryStream stream(fData->data(), fData->size(), false);
         return fDecoder->decodeYUV8Planes(&stream, sizes, planes, rowBytes, colorSpace);
     }
-    
+
+private:
+    typedef SkImageGenerator INHERITED;
 };
 
 SkImageGenerator* SkImageGenerator::NewFromData(SkData* data) {
diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp
index d6edda7..ddc0994 100644
--- a/tests/CachedDecodingPixelRefTest.cpp
+++ b/tests/CachedDecodingPixelRefTest.cpp
@@ -163,7 +163,6 @@
 class TestImageGenerator : public SkImageGenerator {
 public:
     enum TestType {
-        kFailGetInfo_TestType,
         kFailGetPixels_TestType,
         kSucceedGetPixels_TestType,
         kLast_TestType = kSucceedGetPixels_TestType
@@ -172,22 +171,24 @@
     static int Height() { return 10; }
     static uint32_t Color() { return 0xff123456; }
     TestImageGenerator(TestType type, skiatest::Reporter* reporter)
-        : fType(type), fReporter(reporter) {
+    : INHERITED(GetMyInfo()), fType(type), fReporter(reporter) {
         SkASSERT((fType <= kLast_TestType) && (fType >= 0));
     }
     virtual ~TestImageGenerator() { }
 
 protected:
+    static SkImageInfo GetMyInfo() {
+        return SkImageInfo::MakeN32(TestImageGenerator::Width(), TestImageGenerator::Height(),
+                                    kOpaque_SkAlphaType);
+    }
+
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
     bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
         REPORTER_ASSERT(fReporter, info);
-        if ((NULL == info) || (kFailGetInfo_TestType == fType)) {
-            return false;
-        }
-        *info = SkImageInfo::MakeN32(TestImageGenerator::Width(),
-                                     TestImageGenerator::Height(),
-                                     kOpaque_SkAlphaType);
+        *info = GetMyInfo();
         return true;
     }
+#endif
 
     virtual Result onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
                                const Options&,
@@ -212,6 +213,8 @@
 private:
     const TestType fType;
     skiatest::Reporter* const fReporter;
+
+    typedef SkImageGenerator INHERITED;
 };
 
 static void check_test_image_generator_bitmap(skiatest::Reporter* reporter,
@@ -256,8 +259,7 @@
     } else {
         success = SkInstallDiscardablePixelRef(gen.detach(), &lazy, factory);
     }
-    REPORTER_ASSERT(reporter, success
-                    == (TestImageGenerator::kFailGetInfo_TestType != type));
+    REPORTER_ASSERT(reporter, success);
     if (TestImageGenerator::kSucceedGetPixels_TestType == type) {
         check_test_image_generator_bitmap(reporter, lazy);
     } else if (TestImageGenerator::kFailGetPixels_TestType == type) {
@@ -283,15 +285,11 @@
 DEF_TEST(DiscardableAndCachingPixelRef, reporter) {
     test_newlockdelete(reporter);
 
-    check_pixelref(TestImageGenerator::kFailGetInfo_TestType,
-                   reporter, kSkCaching_PixelRefType, NULL);
     check_pixelref(TestImageGenerator::kFailGetPixels_TestType,
                    reporter, kSkCaching_PixelRefType, NULL);
     check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType,
                    reporter, kSkCaching_PixelRefType, NULL);
 
-    check_pixelref(TestImageGenerator::kFailGetInfo_TestType,
-                   reporter, kSkDiscardable_PixelRefType, NULL);
     check_pixelref(TestImageGenerator::kFailGetPixels_TestType,
                    reporter, kSkDiscardable_PixelRefType, NULL);
     check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType,
@@ -321,7 +319,6 @@
 
 DEF_TEST(Image_NewFromGenerator, r) {
     TestImageGenerator::TestType testTypes[] = {
-        TestImageGenerator::kFailGetInfo_TestType,
         TestImageGenerator::kFailGetPixels_TestType,
         TestImageGenerator::kSucceedGetPixels_TestType,
     };
@@ -329,10 +326,6 @@
         TestImageGenerator::TestType test = testTypes[i];
         SkImageGenerator* gen = SkNEW_ARGS(TestImageGenerator, (test, r));
         SkAutoTUnref<SkImage> image(SkImage::NewFromGenerator(gen));
-        if (TestImageGenerator::kFailGetInfo_TestType == test) {
-            REPORTER_ASSERT(r, NULL == image.get());
-            continue;
-        }
         if (NULL == image.get()) {
             ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed ["
                    SK_SIZE_T_SPECIFIER "]", i);
diff --git a/tests/DrawBitmapRectTest.cpp b/tests/DrawBitmapRectTest.cpp
index 9c0c683..bde0095 100644
--- a/tests/DrawBitmapRectTest.cpp
+++ b/tests/DrawBitmapRectTest.cpp
@@ -20,14 +20,14 @@
 // A BitmapFactory that always fails when asked to return pixels.
 class FailureImageGenerator : public SkImageGenerator {
 public:
-    FailureImageGenerator() { }
-    virtual ~FailureImageGenerator() { }
-
+    FailureImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(100, 100)) {}
 protected:
+#ifdef SK_SUPPORT_LEGACY_BOOL_ONGETINFO
     bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
         *info = SkImageInfo::MakeN32Premul(100, 100);
         return true;
     }
+#endif
     // default onGetPixels() returns kUnimplemented, which is what we want.
 };
 
diff --git a/tests/ImageGeneratorTest.cpp b/tests/ImageGeneratorTest.cpp
index 1f960ea..94867bc 100644
--- a/tests/ImageGeneratorTest.cpp
+++ b/tests/ImageGeneratorTest.cpp
@@ -8,8 +8,13 @@
 #include "SkImageGenerator.h"
 #include "Test.h"
 
+class MyImageGenerator : public SkImageGenerator {
+public:
+    MyImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
+};
+
 DEF_TEST(ImageGenerator, reporter) {
-    SkImageGenerator ig;
+    MyImageGenerator ig;
     SkISize sizes[3];
     sizes[0] = SkISize::Make(200, 200);
     sizes[1] = SkISize::Make(100, 100);
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 9ce9d5f..6142af9 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -67,11 +67,8 @@
 #include "SkImageGenerator.h"
 
 class EmptyGenerator : public SkImageGenerator {
-protected:
-    bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
-        *info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_SkAlphaType);
-        return true;
-    }
+public:
+    EmptyGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
 };
 
 static void test_empty_image(skiatest::Reporter* reporter) {
diff --git a/tools/LazyDecodeBitmap.cpp b/tools/LazyDecodeBitmap.cpp
index 0dca16b..3b6f17e 100644
--- a/tools/LazyDecodeBitmap.cpp
+++ b/tools/LazyDecodeBitmap.cpp
@@ -22,19 +22,17 @@
 
 //  Fits SkPicture::InstallPixelRefProc call signature.
 //  Used in SkPictureData::CreateFromStream
-bool sk_tools::LazyDecodeBitmap(const void* src,
-                                size_t length,
-                                SkBitmap* dst) {
+bool sk_tools::LazyDecodeBitmap(const void* src, size_t length, SkBitmap* dst) {
     SkAutoDataUnref data(SkData::NewWithCopy(src, length));
     if (NULL == data.get()) {
         return false;
     }
 
     SkAutoTDelete<SkImageGenerator> gen(SkImageGenerator::NewFromData(data));
-    SkImageInfo info;
-    if ((NULL == gen.get()) || !gen->getInfo(&info)) {
+    if (NULL == gen.get()) {
         return false;
     }
+    const SkImageInfo info = gen->getInfo();
     SkDiscardableMemory::Factory* pool = NULL;
     if ((!FLAGS_useVolatileCache) || (info.width() * info.height() < 32 * 1024)) {
         // how to do switching with SkDiscardableMemory.
