SkCanvas(const SkBitmap&) creates CPU canvas. You should try using the GPU backend to draw into a texture, then read those pixels back to a bitmap.
SkBitmap* drawViaGanesh(GrContext* grContext,
int width, int height,
void (*drawMP)(SkCanvas*)) {
SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
SkAutoTUnref<SkSurface> mpSurface(
SkSurface::NewRenderTarget(
grContext, SkSurface::kNo_Budgeted, info));
SkCanvas* mpDrawCanvas = mpSurface->getCanvas();
drawMP(mpDrawCanvas);
mpDrawCanvas->flush();
SkBitmap* mpDrawBitmap = new SkBitmap;
mpDrawBitmap->allocPixels(info);
mpDrawCanvas->readPixels(mpDrawBitmap, 0, 0);
return mpDrawBitmap;
}
Or even better, use an image rather than a bitmap: