Chromium Code Reviews| Index: tools/skiaserve/Request.cpp |
| diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp |
| index 7534b1df98e985b0ba4b0fedd806d96c9c96c816..6e0275426491e264ed080e977b730067fcfa4625 100644 |
| --- a/tools/skiaserve/Request.cpp |
| +++ b/tools/skiaserve/Request.cpp |
| @@ -19,7 +19,8 @@ static int kDefaultHeight = 1080; |
| Request::Request(SkString rootUrl) |
| : fUploadContext(nullptr) |
| , fUrlDataManager(rootUrl) |
| - , fGPUEnabled(false) { |
| + , fGPUEnabled(false) |
| + , fColorMode(0) { |
| // create surface |
| #if SK_SUPPORT_GPU |
| GrContextOptions grContextOpts; |
| @@ -42,10 +43,26 @@ SkBitmap* Request::getBitmapFromCanvas(SkCanvas* canvas) { |
| SkIRect bounds = this->getBounds(); |
| SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), |
| kRGBA_8888_SkColorType, kOpaque_SkAlphaType); |
| - bmp->setInfo(info); |
| - if (!canvas->readPixels(bmp, 0, 0)) { |
| - fprintf(stderr, "Can't read pixels\n"); |
| - return nullptr; |
| + if (kRGBA_F16_SkColorType == canvas->imageInfo().colorType()) { |
|
Brian Osman
2016/04/18 16:17:03
We have other special-case conversion code in DM,
mtklein
2016/04/18 17:40:48
Think this is a sign we should fix readPixels() fi
|
| + SkBitmap n32TempBmp; |
| + SkImageInfo n32Info = SkImageInfo::Make(bounds.width(), bounds.height(), |
| + kN32_SkColorType, kOpaque_SkAlphaType); |
| + n32TempBmp.setInfo(n32Info); |
| + if (!canvas->readPixels(&n32TempBmp, 0, 0)) { |
| + fprintf(stderr, "Can't read pixels\n"); |
| + return nullptr; |
| + } |
| + |
| + if (!n32TempBmp.copyTo(bmp, kRGBA_8888_SkColorType)) { |
| + fprintf(stderr, "Can't copy pixels\n"); |
| + return nullptr; |
| + } |
| + } else { |
| + bmp->setInfo(info); |
| + if (!canvas->readPixels(bmp, 0, 0)) { |
| + fprintf(stderr, "Can't read pixels\n"); |
| + return nullptr; |
| + } |
| } |
| return bmp; |
| } |
| @@ -138,25 +155,48 @@ SkIRect Request::getBounds() { |
| return bounds; |
| } |
| +namespace { |
| + |
| +struct ColorAndProfile { |
| + SkColorType fColorType; |
| + SkColorProfileType fProfileType; |
| + bool fGammaCorrect; |
| +}; |
| + |
| +ColorAndProfile ColorModes[] = { |
| + { kN32_SkColorType, kLinear_SkColorProfileType, false }, |
| + { kN32_SkColorType, kSRGB_SkColorProfileType, true }, |
| + { kRGBA_F16_SkColorType, kLinear_SkColorProfileType, true }, |
| +}; |
| + |
| +} |
| + |
| SkSurface* Request::createCPUSurface() { |
| SkIRect bounds = this->getBounds(); |
| - SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), kN32_SkColorType, |
| - kPremul_SkAlphaType); |
| + ColorAndProfile cap = ColorModes[fColorMode]; |
| + SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), cap.fColorType, |
| + kPremul_SkAlphaType, cap.fProfileType); |
| return SkSurface::MakeRaster(info).release(); |
| } |
| SkSurface* Request::createGPUSurface() { |
| GrContext* context = this->getContext(); |
| SkIRect bounds = this->getBounds(); |
| - SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), |
| - kN32_SkColorType, kPremul_SkAlphaType); |
| - uint32_t flags = 0; |
| + ColorAndProfile cap = ColorModes[fColorMode]; |
| + SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), cap.fColorType, |
| + kPremul_SkAlphaType, cap.fProfileType); |
| + uint32_t flags = cap.fGammaCorrect ? SkSurfaceProps::kGammaCorrect_Flag : 0; |
|
Brian Osman
2016/04/18 16:17:03
Need to do this in createCPUSurface, too.
|
| SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
| SkSurface* surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info, 0, |
| &props).release(); |
| return surface; |
| } |
| +bool Request::setColorMode(int mode) { |
| + fColorMode = mode; |
| + return enableGPU(fGPUEnabled); |
| +} |
| + |
| bool Request::enableGPU(bool enable) { |
| if (enable) { |
| SkSurface* surface = this->createGPUSurface(); |
| @@ -167,8 +207,10 @@ bool Request::enableGPU(bool enable) { |
| // When we switch to GPU, there seems to be some mystery draws in the canvas. So we |
| // draw once to flush the pipe |
| // TODO understand what is actually happening here |
| - fDebugCanvas->drawTo(this->getCanvas(), this->getLastOp()); |
| - this->getCanvas()->flush(); |
| + if (fDebugCanvas) { |
| + fDebugCanvas->drawTo(this->getCanvas(), this->getLastOp()); |
| + this->getCanvas()->flush(); |
| + } |
| return true; |
| } |
| @@ -206,6 +248,7 @@ SkData* Request::getJsonOps(int n) { |
| Json::Value root = fDebugCanvas->toJSON(fUrlDataManager, n, canvas); |
| root["mode"] = Json::Value(fGPUEnabled ? "gpu" : "cpu"); |
| root["drawGpuBatchBounds"] = Json::Value(fDebugCanvas->getDrawGpuBatchBounds()); |
| + root["colorMode"] = Json::Value(fColorMode); |
| SkDynamicMemoryWStream stream; |
| stream.writeText(Json::FastWriter().write(root).c_str()); |