Deleted SkImage::newShaderClamp: not used, not implemented.
Implemented SkImage::newShader. BUG=skia:2701, 344804 R=junov@chromium.org, reed@chromium.org, bsalomon@chromium.org, reed@google.com Author: piotaixr@chromium.org Review URL: https://codereview.chromium.org/345463009
This commit is contained in:
parent
4fdba1cec4
commit
cef04f8188
@ -102,6 +102,7 @@
|
||||
'../tests/ImageCacheTest.cpp',
|
||||
'../tests/ImageDecodingTest.cpp',
|
||||
'../tests/ImageFilterTest.cpp',
|
||||
'../tests/ImageNewShaderTest.cpp',
|
||||
'../tests/InfRectTest.cpp',
|
||||
'../tests/InterpolatorTest.cpp',
|
||||
'../tests/JpegTest.cpp',
|
||||
|
@ -12,17 +12,14 @@
|
||||
#include "SkImageEncoder.h"
|
||||
#include "SkRefCnt.h"
|
||||
#include "SkScalar.h"
|
||||
#include "SkShader.h"
|
||||
|
||||
class SkData;
|
||||
class SkCanvas;
|
||||
class SkPaint;
|
||||
class SkShader;
|
||||
class GrContext;
|
||||
class GrTexture;
|
||||
|
||||
// need for TileMode
|
||||
#include "SkShader.h"
|
||||
|
||||
/**
|
||||
* SkImage is an abstraction for drawing a rectagle of pixels, though the
|
||||
* particular type of image could be actually storing its data on the GPU, or
|
||||
@ -61,8 +58,7 @@ public:
|
||||
*/
|
||||
GrTexture* getTexture();
|
||||
|
||||
SkShader* newShaderClamp() const;
|
||||
SkShader* newShader(SkShader::TileMode, SkShader::TileMode) const;
|
||||
virtual SkShader* newShader(SkShader::TileMode, SkShader::TileMode) const;
|
||||
|
||||
void draw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*);
|
||||
|
||||
|
@ -78,6 +78,10 @@ GrTexture* SkImage::getTexture() {
|
||||
return as_IB(this)->onGetTexture();
|
||||
}
|
||||
|
||||
SkShader* SkImage::newShader(SkShader::TileMode tileX, SkShader::TileMode tileY) const {
|
||||
return as_IB(this)->onNewShader(tileX, tileY);
|
||||
}
|
||||
|
||||
SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const {
|
||||
SkBitmap bm;
|
||||
if (as_IB(this)->getROPixels(&bm)) {
|
||||
|
@ -31,6 +31,7 @@ public:
|
||||
// but only inspect them (or encode them).
|
||||
virtual bool getROPixels(SkBitmap*) const { return false; }
|
||||
|
||||
virtual SkShader* onNewShader(SkShader::TileMode, SkShader::TileMode) const { return NULL; };
|
||||
private:
|
||||
typedef SkImage INHERITED;
|
||||
};
|
||||
|
@ -27,6 +27,7 @@ public:
|
||||
|
||||
GrTexture* getTexture() { return fBitmap.getTexture(); }
|
||||
|
||||
virtual SkShader* onNewShader(SkShader::TileMode, SkShader::TileMode) const SK_OVERRIDE;
|
||||
private:
|
||||
SkBitmap fBitmap;
|
||||
|
||||
@ -44,6 +45,10 @@ SkImage_Gpu::SkImage_Gpu(const SkBitmap& bitmap)
|
||||
SkImage_Gpu::~SkImage_Gpu() {
|
||||
}
|
||||
|
||||
SkShader* SkImage_Gpu::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY) const {
|
||||
return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, NULL);
|
||||
}
|
||||
|
||||
void SkImage_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y,
|
||||
const SkPaint* paint) {
|
||||
canvas->drawBitmap(fBitmap, x, y, paint);
|
||||
|
@ -64,6 +64,8 @@ public:
|
||||
|
||||
SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); }
|
||||
|
||||
virtual SkShader* onNewShader(SkShader::TileMode, SkShader::TileMode) const SK_OVERRIDE;
|
||||
|
||||
private:
|
||||
SkImage_Raster() : INHERITED(0, 0) {}
|
||||
|
||||
@ -111,6 +113,10 @@ SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes
|
||||
|
||||
SkImage_Raster::~SkImage_Raster() {}
|
||||
|
||||
SkShader* SkImage_Raster::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY) const {
|
||||
return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, NULL);
|
||||
}
|
||||
|
||||
void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) {
|
||||
canvas->drawBitmap(fBitmap, x, y, paint);
|
||||
}
|
||||
|
107
tests/ImageNewShaderTest.cpp
Normal file
107
tests/ImageNewShaderTest.cpp
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2014 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GrContextFactory.h"
|
||||
#endif
|
||||
#include "SkCanvas.h"
|
||||
#include "SkImage.h"
|
||||
#include "SkShader.h"
|
||||
#include "SkSurface.h"
|
||||
|
||||
#include "Test.h"
|
||||
|
||||
void testBitmapEquality(skiatest::Reporter* reporter, SkBitmap& bm1, SkBitmap& bm2) {
|
||||
bm1.lockPixels();
|
||||
bm2.lockPixels();
|
||||
|
||||
REPORTER_ASSERT(reporter, bm1.getSize() == bm2.getSize());
|
||||
REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getPixels(), bm2.getPixels(), bm1.getSize()));
|
||||
|
||||
bm2.unlockPixels();
|
||||
bm1.unlockPixels();
|
||||
}
|
||||
|
||||
void runShaderTest(skiatest::Reporter* reporter, SkSurface* source, SkSurface* destination, SkImageInfo& info) {
|
||||
SkCanvas* rasterCanvas = source->getCanvas();
|
||||
rasterCanvas->drawColor(0xFFDEDEDE, SkXfermode::kSrc_Mode);
|
||||
|
||||
SkAutoTUnref<SkImage> rasterImage(source->newImageSnapshot());
|
||||
SkAutoTUnref<SkShader> rasterShader(rasterImage->newShader(
|
||||
SkShader::kRepeat_TileMode,
|
||||
SkShader::kRepeat_TileMode));
|
||||
|
||||
SkPaint paint;
|
||||
paint.setShader(rasterShader);
|
||||
SkCanvas* canvasDest = destination->getCanvas();
|
||||
canvasDest->clear(SK_ColorTRANSPARENT);
|
||||
canvasDest->drawPaint(paint);
|
||||
|
||||
SkIRect rect = SkIRect::MakeXYWH(0, 0, 5, 5);
|
||||
|
||||
SkBitmap bmOrig;
|
||||
rasterCanvas->readPixels(rect, &bmOrig);
|
||||
|
||||
SkBitmap bm;
|
||||
canvasDest->readPixels(rect, &bm);
|
||||
|
||||
testBitmapEquality(reporter, bmOrig, bm);
|
||||
}
|
||||
|
||||
DEF_TEST(ImageNewShader, reporter) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
|
||||
|
||||
SkAutoTUnref<SkSurface> srcSurface(SkSurface::NewRaster(info));
|
||||
SkAutoTUnref<SkSurface> dstSurface(SkSurface::NewRaster(info));
|
||||
|
||||
runShaderTest(reporter, srcSurface.get(), dstSurface.get(), info);
|
||||
}
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
void gpuToGpu(skiatest::Reporter* reporter, GrContext* context) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
|
||||
|
||||
SkAutoTUnref<SkSurface> srcSurface(SkSurface::NewRenderTarget(context, info));
|
||||
SkAutoTUnref<SkSurface> dstSurface(SkSurface::NewRenderTarget(context, info));
|
||||
|
||||
runShaderTest(reporter, srcSurface.get(), dstSurface.get(), info);
|
||||
}
|
||||
|
||||
void gpuToRaster(skiatest::Reporter* reporter, GrContext* context) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
|
||||
|
||||
SkAutoTUnref<SkSurface> srcSurface(SkSurface::NewRenderTarget(context, info));
|
||||
SkAutoTUnref<SkSurface> dstSurface(SkSurface::NewRaster(info));
|
||||
|
||||
runShaderTest(reporter, srcSurface.get(), dstSurface.get(), info);
|
||||
}
|
||||
|
||||
void rasterToGpu(skiatest::Reporter* reporter, GrContext* context) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
|
||||
|
||||
SkAutoTUnref<SkSurface> srcSurface(SkSurface::NewRaster(info));
|
||||
SkAutoTUnref<SkSurface> dstSurface(SkSurface::NewRenderTarget(context, info));
|
||||
|
||||
runShaderTest(reporter, srcSurface.get(), dstSurface.get(), info);
|
||||
}
|
||||
|
||||
DEF_GPUTEST(ImageNewShader_GPU, reporter, factory) {
|
||||
GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
|
||||
|
||||
// GPU -> GPU
|
||||
gpuToGpu(reporter, context);
|
||||
|
||||
// GPU -> RASTER
|
||||
gpuToRaster(reporter, context);
|
||||
|
||||
|
||||
// RASTER -> GPU
|
||||
rasterToGpu(reporter, context);
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user