From 312aa6a81e508f80a46419a14ec842b129ffe563 Mon Sep 17 00:00:00 2001 From: brianosman Date: Tue, 19 Apr 2016 12:47:54 -0700 Subject: [PATCH] Adding support for controlling the global sRGB SkColor switch. Frontend change: https://codereview.chromium.org/1900233002/ BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1902143002 Review URL: https://codereview.chromium.org/1902143002 --- tools/skiaserve/Request.cpp | 7 ++++ tools/skiaserve/Request.h | 1 + tools/skiaserve/skiaserve.cpp | 1 + .../skiaserve/urlhandlers/SRGBModeHandler.cpp | 42 +++++++++++++++++++ tools/skiaserve/urlhandlers/UrlHandler.h | 13 ++++++ 5 files changed, 64 insertions(+) create mode 100644 tools/skiaserve/urlhandlers/SRGBModeHandler.cpp diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp index 58aca84b53..7cbc9ef212 100644 --- a/tools/skiaserve/Request.cpp +++ b/tools/skiaserve/Request.cpp @@ -9,6 +9,7 @@ #include "SkPictureRecorder.h" #include "SkPixelSerializer.h" +#include "SkPM4fPriv.h" #include "picture_utils.h" using namespace sk_gpu_test; @@ -186,6 +187,11 @@ bool Request::setColorMode(int mode) { return enableGPU(fGPUEnabled); } +bool Request::setSRGBMode(bool enable) { + gTreatSkColorAsSRGB = enable; + return true; +} + bool Request::enableGPU(bool enable) { if (enable) { SkSurface* surface = this->createGPUSurface(); @@ -238,6 +244,7 @@ SkData* Request::getJsonOps(int n) { root["mode"] = Json::Value(fGPUEnabled ? "gpu" : "cpu"); root["drawGpuBatchBounds"] = Json::Value(fDebugCanvas->getDrawGpuBatchBounds()); root["colorMode"] = Json::Value(fColorMode); + root["srgbMode"] = Json::Value(gTreatSkColorAsSRGB); SkDynamicMemoryWStream stream; stream.writeText(Json::FastWriter().write(root).c_str()); diff --git a/tools/skiaserve/Request.h b/tools/skiaserve/Request.h index f3af6b72ee..6cb969170d 100644 --- a/tools/skiaserve/Request.h +++ b/tools/skiaserve/Request.h @@ -42,6 +42,7 @@ struct Request { SkBitmap* getBitmapFromCanvas(SkCanvas* canvas); bool enableGPU(bool enable); bool setColorMode(int mode); + bool setSRGBMode(bool enable); bool hasPicture() const { return SkToBool(fPicture.get()); } int getLastOp() const { return fDebugCanvas->getSize() - 1; } diff --git a/tools/skiaserve/skiaserve.cpp b/tools/skiaserve/skiaserve.cpp index fc3018141e..77b2cc053a 100644 --- a/tools/skiaserve/skiaserve.cpp +++ b/tools/skiaserve/skiaserve.cpp @@ -41,6 +41,7 @@ public: fHandlers.push_back(new BatchesHandler); fHandlers.push_back(new BatchBoundsHandler); fHandlers.push_back(new ColorModeHandler); + fHandlers.push_back(new SRGBModeHandler); } ~UrlManager() { diff --git a/tools/skiaserve/urlhandlers/SRGBModeHandler.cpp b/tools/skiaserve/urlhandlers/SRGBModeHandler.cpp new file mode 100644 index 0000000000..df06050b90 --- /dev/null +++ b/tools/skiaserve/urlhandlers/SRGBModeHandler.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "UrlHandler.h" + +#include "microhttpd.h" +#include "../Request.h" +#include "../Response.h" + +using namespace Response; + +bool SRGBModeHandler::canHandle(const char* method, const char* url) { + static const char* kBasePath = "/srgbMode/"; + return 0 == strcmp(method, MHD_HTTP_METHOD_POST) && + 0 == strncmp(url, kBasePath, strlen(kBasePath)); +} + +int SRGBModeHandler::handle(Request* request, MHD_Connection* connection, + const char* url, const char* method, + const char* upload_data, size_t* upload_data_size) { + SkTArray commands; + SkStrSplit(url, "/", &commands); + + if (commands.count() != 2) { + return MHD_NO; + } + + int enable; + if (1 != sscanf(commands[1].c_str(), "%d", &enable)) { + return MHD_NO; + } + + bool success = request->setSRGBMode(enable); + if (!success) { + return SendError(connection, "Unable to set requested mode"); + } + return SendOK(connection); +} diff --git a/tools/skiaserve/urlhandlers/UrlHandler.h b/tools/skiaserve/urlhandlers/UrlHandler.h index adbdcb9aa2..d767aaebd4 100644 --- a/tools/skiaserve/urlhandlers/UrlHandler.h +++ b/tools/skiaserve/urlhandlers/UrlHandler.h @@ -141,3 +141,16 @@ public: const char* url, const char* method, const char* upload_data, size_t* upload_data_size) override; }; + +/** + * Controls the global sRGB flag (is SkColor treated as sRGB or not). + * Posting to /srgbMode/0 causes SkColor to be linear, /colorMode/1 + * causes SkColor to be sRGB; + */ +class SRGBModeHandler : public UrlHandler { +public: + bool canHandle(const char* method, const char* url) override; + int handle(Request* request, MHD_Connection* connection, + const char* url, const char* method, + const char* upload_data, size_t* upload_data_size) override; +};