class SkData;
class SkCanvas;
+class SkImageGenerator;
class SkPaint;
class GrContext;
class GrTexture;
*/
static SkImage* NewTexture(const SkBitmap&);
+ /**
+ * Construct a new SkImage based on the given ImageGenerator.
+ * This function will always take ownership of the passed
+ * ImageGenerator. Returns NULL on error.
+ */
+ static SkImage* NewFromGenerator(SkImageGenerator*);
+
int width() const { return fWidth; }
int height() const { return fHeight; }
uint32_t uniqueID() const { return fUniqueID; }
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkData.h"
+#include "SkDecodingImageGenerator.h"
#include "SkMallocPixelRef.h"
class SkImage_Raster : public SkImage_Base {
SkShader::TileMode,
const SkMatrix* localMatrix) const SK_OVERRIDE;
+ SkImage_Raster(const SkBitmap& bm)
+ : INHERITED(bm.width(), bm.height())
+ , fBitmap(bm) {}
+
private:
SkImage_Raster() : INHERITED(0, 0) {}
return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes));
}
+SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
+ SkBitmap bitmap;
+ if (!SkInstallDiscardablePixelRef(generator, &bitmap)) {
+ return NULL;
+ }
+ return SkNEW_ARGS(SkImage_Raster, (bitmap));
+}
+
SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
size_t rowBytes) {
return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes));
check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType,
reporter, kSkDiscardable_PixelRefType, globalPool);
}
+
+////////////////////////////////////////////////////////////////////////////////
+
+DEF_TEST(Image_NewFromGenerator, r) {
+ TestImageGenerator::TestType testTypes[] = {
+ TestImageGenerator::kFailGetInfo_TestType,
+ TestImageGenerator::kFailGetPixels_TestType,
+ TestImageGenerator::kSucceedGetPixels_TestType,
+ };
+ for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) {
+ 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);
+ continue;
+ }
+ REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width());
+ REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height());
+
+ SkBitmap bitmap;
+ SkAssertResult(bitmap.allocN32Pixels(TestImageGenerator::Width(),
+ TestImageGenerator::Height()));
+ SkCanvas canvas(bitmap);
+ canvas.clear(SK_ColorMAGENTA);
+ image->draw(&canvas, 0, 0, NULL);
+ SkColor color = bitmap.getColor(0, 0);
+ if (TestImageGenerator::kSucceedGetPixels_TestType == test) {
+ REPORTER_ASSERT(r, TestImageGenerator::Color() == color);
+ } else {
+ REPORTER_ASSERT(r, SK_ColorMAGENTA == color);
+ }
+ }
+}