ColorShaders report no bitmaps, but only a color_gradient, which we now detect

on the gpu side.



git-svn-id: http://skia.googlecode.com/svn/trunk@1810 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2011-07-06 21:18:09 +00:00
parent f78e78da58
commit 2be9e8b407
3 changed files with 18 additions and 28 deletions

View File

@ -47,6 +47,7 @@ public:
virtual void shadeSpan16(int x, int y, uint16_t span[], int count);
virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count);
// we return false for this, use asAGradient
virtual BitmapType asABitmap(SkBitmap* outTexture,
SkMatrix* outMatrix,
TileMode xy[2],
@ -68,9 +69,6 @@ private:
uint16_t fColor16; // cached after setContext()
SkBool8 fInheritColor;
// deferred allocation, used for asABitmap()
mutable SkPixelRef* fAsABitmapPixelRef;
typedef SkShader INHERITED;
};

View File

@ -219,23 +219,18 @@ SkShader* SkShader::CreateBitmapShader(const SkBitmap& src,
SkColorShader::SkColorShader() {
fFlags = 0;
fInheritColor = true;
fAsABitmapPixelRef = NULL;
}
SkColorShader::SkColorShader(SkColor c) {
fFlags = 0;
fColor = c;
fInheritColor = false;
fAsABitmapPixelRef = NULL;
}
SkColorShader::~SkColorShader() {
SkSafeUnref(fAsABitmapPixelRef);
}
SkColorShader::~SkColorShader() {}
SkColorShader::SkColorShader(SkFlattenableReadBuffer& b) : INHERITED(b) {
fFlags = 0; // computed in setContext
fAsABitmapPixelRef = NULL;
fInheritColor = b.readU8();
if (fInheritColor) {
@ -313,25 +308,7 @@ void SkColorShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
SkShader::BitmapType SkColorShader::asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
TileMode modes[],
SkScalar* twoPointRadialParams) const {
// we cache the pixelref, since its generateID is used in the texture cache
if (NULL == fAsABitmapPixelRef) {
SkPMColor* storage = (SkPMColor*)sk_malloc_throw(sizeof(SkPMColor));
*storage = fPMColor;
fAsABitmapPixelRef = new SkMallocPixelRef(storage, sizeof(SkPMColor),
NULL);
}
if (bitmap) {
bitmap->setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
bitmap->setPixelRef(fAsABitmapPixelRef);
}
if (matrix) {
matrix->reset();
}
if (modes) {
modes[0] = modes[1] = SkShader::kRepeat_TileMode;
}
return kDefault_BitmapType;
return kNone_BitmapType;
}
SkShader::GradientType SkColorShader::asAGradient(GradientInfo* info) const {

View File

@ -481,6 +481,21 @@ bool SkGpuDevice::skPaint2GrPaintShader(const SkPaint& skPaint,
GrSamplerState::SampleMode sampleMode = sk_bmp_type_to_sample_mode[bmptype];
if (-1 == sampleMode) {
SkShader::GradientInfo info;
SkColor color;
info.fColors = &color;
info.fColorOffsets = NULL;
info.fColorCount = 1;
if (SkShader::kColor_GradientType == shader->asAGradient(&info)) {
SkPaint copy(skPaint);
copy.setShader(NULL);
copy.setColor(SkColorSetA(color, copy.getAlpha()));
return this->skPaint2GrPaintNoShader(copy,
false,
grPaint,
constantColor);
}
return false;
}
GrSamplerState* sampler = grPaint->getTextureSampler(kShaderTextureIdx);