| Index: gm/image_pict.cpp
 | 
| diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp
 | 
| index 22b3d0067b888ca6e38e0ac5ab42b1bcd2405071..216b495dd3580785cb40f19ecf304798404a4e90 100644
 | 
| --- a/gm/image_pict.cpp
 | 
| +++ b/gm/image_pict.cpp
 | 
| @@ -108,11 +108,35 @@ static SkImageGenerator* make_pic_generator(GrContext*, SkPicture* pic) {
 | 
|  
 | 
|  class RasterGenerator : public SkImageGenerator {
 | 
|  public:
 | 
| -    RasterGenerator(const SkBitmap& bm) : SkImageGenerator(bm.info()), fBM(bm) {}
 | 
| +    RasterGenerator(const SkBitmap& bm) : SkImageGenerator(bm.info()), fBM(bm) {
 | 
| +        fBM.lockPixels();
 | 
| +    }
 | 
|  protected:
 | 
|      bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
 | 
| -                     SkPMColor*, int*) override {
 | 
| -        return fBM.readPixels(info, pixels, rowBytes, 0, 0);
 | 
| +                     SkPMColor* ctable, int* ctableCount) override {
 | 
| +        SkASSERT(fBM.width() == info.width());
 | 
| +        SkASSERT(fBM.height() == info.height());
 | 
| +
 | 
| +        if (info.colorType() == kIndex_8_SkColorType) {
 | 
| +            if (SkColorTable* ct = fBM.getColorTable()) {
 | 
| +                if (ctable) {
 | 
| +                    memcpy(ctable, ct->readColors(), ct->count() * sizeof(SkPMColor));
 | 
| +                }
 | 
| +                if (ctableCount) {
 | 
| +                    *ctableCount = ct->count();
 | 
| +                }
 | 
| +
 | 
| +                for (int y = 0; y < info.height(); ++y) {
 | 
| +                    memcpy(pixels, fBM.getAddr8(0, y), fBM.width());
 | 
| +                    pixels = (char*)pixels + rowBytes;
 | 
| +                }
 | 
| +                return true;
 | 
| +            } else {
 | 
| +                return false;
 | 
| +            }
 | 
| +        } else {
 | 
| +            return fBM.readPixels(info, pixels, rowBytes, 0, 0);
 | 
| +        }
 | 
|      }
 | 
|  private:
 | 
|      SkBitmap fBM;
 | 
| @@ -127,6 +151,54 @@ static SkImageGenerator* make_ras_generator(GrContext*, SkPicture* pic) {
 | 
|      return new RasterGenerator(bm);
 | 
|  }
 | 
|  
 | 
| +// so we can create a color-table
 | 
| +static int find_closest(SkPMColor c, const SkPMColor table[], int count) {
 | 
| +    const int cr = SkGetPackedR32(c);
 | 
| +    const int cg = SkGetPackedG32(c);
 | 
| +    const int cb = SkGetPackedB32(c);
 | 
| +
 | 
| +    int minDist = 999999999;
 | 
| +    int index = 0;
 | 
| +    for (int i = 0; i < count; ++i) {
 | 
| +        int dr = SkAbs32((int)SkGetPackedR32(table[i]) - cr);
 | 
| +        int dg = SkAbs32((int)SkGetPackedG32(table[i]) - cg);
 | 
| +        int db = SkAbs32((int)SkGetPackedB32(table[i]) - cb);
 | 
| +        int dist = dr + dg + db;
 | 
| +        if (dist < minDist) {
 | 
| +            minDist = dist;
 | 
| +            index = i;
 | 
| +        }
 | 
| +    }
 | 
| +    return index;
 | 
| +}
 | 
| +
 | 
| +static SkImageGenerator* make_ctable_generator(GrContext*, SkPicture* pic) {
 | 
| +    SkBitmap bm;
 | 
| +    bm.allocN32Pixels(100, 100);
 | 
| +    SkCanvas canvas(bm);
 | 
| +    canvas.clear(0);
 | 
| +    canvas.translate(-100, -100);
 | 
| +    canvas.drawPicture(pic);
 | 
| +
 | 
| +    const SkPMColor colors[] = {
 | 
| +        SkPreMultiplyColor(SK_ColorRED),
 | 
| +        SkPreMultiplyColor(0),
 | 
| +        SkPreMultiplyColor(SK_ColorBLUE),
 | 
| +    };
 | 
| +    const int count = SK_ARRAY_COUNT(colors);
 | 
| +    SkImageInfo info = SkImageInfo::Make(100, 100, kIndex_8_SkColorType, kPremul_SkAlphaType);
 | 
| +
 | 
| +    SkBitmap bm2;
 | 
| +    SkAutoTUnref<SkColorTable> ct(new SkColorTable(colors, count));
 | 
| +    bm2.allocPixels(info, nullptr, ct);
 | 
| +    for (int y = 0; y < info.height(); ++y) {
 | 
| +        for (int x = 0; x < info.width(); ++x) {
 | 
| +            *bm2.getAddr8(x, y) = find_closest(*bm.getAddr32(x, y), colors, count);
 | 
| +        }
 | 
| +    }
 | 
| +    return new RasterGenerator(bm2);
 | 
| +}
 | 
| +
 | 
|  class EmptyGenerator : public SkImageGenerator {
 | 
|  public:
 | 
|      EmptyGenerator(const SkImageInfo& info) : SkImageGenerator(info) {}
 | 
| @@ -297,6 +369,7 @@ private:
 | 
|  };
 | 
|  DEF_GM( return new ImageCacheratorGM("picture", make_pic_generator); )
 | 
|  DEF_GM( return new ImageCacheratorGM("raster", make_ras_generator); )
 | 
| +DEF_GM( return new ImageCacheratorGM("ctable", make_ctable_generator); )
 | 
|  #if SK_SUPPORT_GPU
 | 
|      DEF_GM( return new ImageCacheratorGM("texture", make_tex_generator); )
 | 
|  #endif
 | 
| 
 |