1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "tools/skiaserve/urlhandlers/UrlHandler.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "microhttpd.h" 11cb93a386Sopenharmony_ci#include "tools/skiaserve/Request.h" 12cb93a386Sopenharmony_ci#include "tools/skiaserve/Response.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciusing namespace Response; 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cibool BreakHandler::canHandle(const char* method, const char* url) { 17cb93a386Sopenharmony_ci static const char* kBasePath = "/break"; 18cb93a386Sopenharmony_ci return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && 19cb93a386Sopenharmony_ci 0 == strncmp(url, kBasePath, strlen(kBasePath)); 20cb93a386Sopenharmony_ci} 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciint BreakHandler::handle(Request* request, MHD_Connection* connection, 23cb93a386Sopenharmony_ci const char* url, const char* method, 24cb93a386Sopenharmony_ci const char* upload_data, size_t* upload_data_size) { 25cb93a386Sopenharmony_ci SkTArray<SkString> commands; 26cb93a386Sopenharmony_ci SkStrSplit(url, "/", &commands); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci if (!request->hasPicture() || commands.count() != 4) { 29cb93a386Sopenharmony_ci return MHD_NO; 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci // /break/<n>/<x>/<y> 33cb93a386Sopenharmony_ci int n; 34cb93a386Sopenharmony_ci sscanf(commands[1].c_str(), "%d", &n); 35cb93a386Sopenharmony_ci int x; 36cb93a386Sopenharmony_ci sscanf(commands[2].c_str(), "%d", &x); 37cb93a386Sopenharmony_ci int y; 38cb93a386Sopenharmony_ci sscanf(commands[3].c_str(), "%d", &y); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci int count = request->fDebugCanvas->getSize(); 41cb93a386Sopenharmony_ci SkASSERT(n < count); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci SkCanvas* canvas = request->getCanvas(); 44cb93a386Sopenharmony_ci canvas->clear(SK_ColorWHITE); 45cb93a386Sopenharmony_ci int saveCount = canvas->save(); 46cb93a386Sopenharmony_ci for (int i = 0; i <= n; ++i) { 47cb93a386Sopenharmony_ci request->fDebugCanvas->getDrawCommandAt(i)->execute(canvas); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci SkColor target = request->getPixel(x, y); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci SkDynamicMemoryWStream stream; 52cb93a386Sopenharmony_ci SkJSONWriter writer(&stream, SkJSONWriter::Mode::kFast); 53cb93a386Sopenharmony_ci writer.beginObject(); // root 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci writer.appendName("startColor"); 56cb93a386Sopenharmony_ci DrawCommand::MakeJsonColor(writer, target); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci bool changed = false; 59cb93a386Sopenharmony_ci for (int i = n + 1; i < n + count; ++i) { 60cb93a386Sopenharmony_ci int index = i % count; 61cb93a386Sopenharmony_ci if (index == 0) { 62cb93a386Sopenharmony_ci // reset canvas for wraparound 63cb93a386Sopenharmony_ci canvas->restoreToCount(saveCount); 64cb93a386Sopenharmony_ci canvas->clear(SK_ColorWHITE); 65cb93a386Sopenharmony_ci saveCount = canvas->save(); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci request->fDebugCanvas->getDrawCommandAt(index)->execute(canvas); 68cb93a386Sopenharmony_ci SkColor current = request->getPixel(x, y); 69cb93a386Sopenharmony_ci if (current != target) { 70cb93a386Sopenharmony_ci writer.appendName("endColor"); 71cb93a386Sopenharmony_ci DrawCommand::MakeJsonColor(writer, current); 72cb93a386Sopenharmony_ci writer.appendS32("endOp", index); 73cb93a386Sopenharmony_ci changed = true; 74cb93a386Sopenharmony_ci break; 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci if (!changed) { 78cb93a386Sopenharmony_ci writer.appendName("endColor"); 79cb93a386Sopenharmony_ci DrawCommand::MakeJsonColor(writer, target); 80cb93a386Sopenharmony_ci writer.appendS32("endOp", n); 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci canvas->restoreToCount(saveCount); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci writer.endObject(); // root 85cb93a386Sopenharmony_ci writer.flush(); 86cb93a386Sopenharmony_ci return SendData(connection, stream.detachAsData().get(), "application/json"); 87cb93a386Sopenharmony_ci} 88