ColorShaders report no bitmaps, but only a color_gradient, which we now detect
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 6 Jul 2011 21:18:09 +0000 (21:18 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 6 Jul 2011 21:18:09 +0000 (21:18 +0000)
on the gpu side.

git-svn-id: http://skia.googlecode.com/svn/trunk@1810 2bbb7eff-a529-9590-31e7-b0007b416f81

include/core/SkColorShader.h
src/core/SkShader.cpp
src/gpu/SkGpuDevice.cpp

index b7537e1..63b8a5e 100644 (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;
 };
 
index 48c9966..6865fb7 100644 (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 {
index 0f18726..b8cc2bb 100644 (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);