Add SkImageGenerator Interface

-   Add SkDiscardablePixelRef class that uses SkDiscardableMemory and
    a SkImageGenerator.

-   Add SkDecodingImageGenerator class as an example of a
    SkImageGenerator.

-   Add DecodingImageGenerator unit test.

-   Add SkBasicDiscardableMemory implmentation for unit tests only.

R=reed@google.com, scroggo@google.com

Review URL: https://codereview.chromium.org/74793011

git-svn-id: http://skia.googlecode.com/svn/trunk/include@12341 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkImageGenerator.h b/core/SkImageGenerator.h
new file mode 100644
index 0000000..e43fbc1
--- /dev/null
+++ b/core/SkImageGenerator.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkImageGenerator_DEFINED
+#define SkImageGenerator_DEFINED
+
+#include "SkImageInfo.h"
+
+class SkData;
+
+/**
+ *  An interface that allows a purgeable PixelRef (such as a
+ *  SkDiscardablePixelRef) to decode and re-decode an image as needed.
+ */
+class SkImageGenerator {
+public:
+    /**
+     *  The PixelRef which takes ownership of this SkImageGenerator
+     *  will call the image generator's destructor.
+     */
+    virtual ~SkImageGenerator() { }
+
+    /**
+     *  Return a ref to the encoded (i.e. compressed) representation,
+     *  of this data.
+     *
+     *  If non-NULL is returned, the caller is responsible for calling
+     *  unref() on the data when it is finished.
+     */
+    virtual SkData* refEncodedData() { return NULL; }
+
+    /**
+     *  Return some information about the image, allowing the owner of
+     *  this object to allocate pixels.
+     *
+     *  @return false if anything goes wrong.
+     */
+    virtual bool getInfo(SkImageInfo* info) = 0;
+
+    /**
+     *  Decode into the given pixels, a block of memory of size at
+     *  least (info.fHeight - 1) * rowBytes + (info.fWidth *
+     *  bytesPerPixel)
+     *
+     *  @param info A description of the format (config, size)
+     *         expected by the caller.  This can simply be identical
+     *         to the info returned by getInfo().
+     *
+     *         This contract also allows the caller to specify
+     *         different output-configs, which the implementation can
+     *         decide to support or not.
+     *
+     *  @return false if anything goes wrong or if the image info is
+     *          unsupported.
+     */
+    virtual bool getPixels(const SkImageInfo& info,
+                           void* pixels,
+                           size_t rowBytes) = 0;
+};
+
+#endif  // SkImageGenerator_DEFINED