diff options
author | 2016-03-09 10:07:02 -0800 | |
---|---|---|
committer | 2016-03-09 10:07:02 -0800 | |
commit | e0449cf9f43e179a809eb1b87ca3bf77cf6f1222 (patch) | |
tree | aaa1df0e986009305e7e14def016d3f8b04cd8b3 /tools/skiaserve | |
parent | 0fcfb7525f60eabfdaf9761c75c7d4fd1b46d0c5 (diff) |
Fix up picture clip bounds in SkiaServe
BUG=skia:5067
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1781653002
Review URL: https://codereview.chromium.org/1781653002
Diffstat (limited to 'tools/skiaserve')
-rw-r--r-- | tools/skiaserve/Request.cpp | 59 | ||||
-rw-r--r-- | tools/skiaserve/Request.h | 6 | ||||
-rw-r--r-- | tools/skiaserve/urlhandlers/BreakHandler.cpp | 17 | ||||
-rw-r--r-- | tools/skiaserve/urlhandlers/DownloadHandler.cpp | 19 | ||||
-rw-r--r-- | tools/skiaserve/urlhandlers/UrlHandler.h | 2 |
5 files changed, 54 insertions, 49 deletions
diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp index 86527f81d9..2d956c90f7 100644 --- a/tools/skiaserve/Request.cpp +++ b/tools/skiaserve/Request.cpp @@ -9,8 +9,8 @@ #include "png.h" -const int Request::kImageWidth = 1920; -const int Request::kImageHeight = 1080; +#include "SkPictureRecorder.h" +#include "SkPixelSerializer.h" static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) { SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr); @@ -55,13 +55,13 @@ Request::Request(SkString rootUrl) // create surface GrContextOptions grContextOpts; fContextFactory.reset(new GrContextFactory(grContextOpts)); - fSurface.reset(this->createCPUSurface()); } SkBitmap* Request::getBitmapFromCanvas(SkCanvas* canvas) { SkBitmap* bmp = new SkBitmap(); - SkImageInfo info = SkImageInfo::Make(kImageWidth, kImageHeight, kRGBA_8888_SkColorType, - kOpaque_SkAlphaType); + SkIRect bounds = fPicture->cullRect().roundOut(); + 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"); @@ -72,7 +72,7 @@ SkBitmap* Request::getBitmapFromCanvas(SkCanvas* canvas) { SkData* Request::writeCanvasToPng(SkCanvas* canvas) { // capture pixels - SkAutoTDelete<SkBitmap> bmp(getBitmapFromCanvas(canvas)); + SkAutoTDelete<SkBitmap> bmp(this->getBitmapFromCanvas(canvas)); SkASSERT(bmp); // write to png @@ -87,6 +87,11 @@ SkCanvas* Request::getCanvas() { GrContextFactory::kNone_GLContextOptions).fGLContext; gl->makeCurrent(); SkASSERT(fDebugCanvas); + + // create the appropriate surface if necessary + if (!fSurface) { + this->enableGPU(fGPUEnabled); + } SkCanvas* target = fSurface->getCanvas(); return target; } @@ -101,8 +106,27 @@ SkData* Request::drawToPng(int n, int m) { return writeCanvasToPng(this->getCanvas()); } +SkData* Request::writeOutSkp() { + // Playback into picture recorder + SkIRect bounds = fPicture->cullRect().roundOut(); + SkPictureRecorder recorder; + SkCanvas* canvas = recorder.beginRecording(bounds.width(), bounds.height()); + + fDebugCanvas->draw(canvas); + + SkAutoTUnref<SkPicture> picture(recorder.endRecording()); + + SkDynamicMemoryWStream outStream; + + SkAutoTUnref<SkPixelSerializer> serializer(SkImageEncoder::CreatePixelSerializer()); + picture->serialize(&outStream, serializer); + + return outStream.copyToData(); +} + SkSurface* Request::createCPUSurface() { - SkImageInfo info = SkImageInfo::Make(kImageWidth, kImageHeight, kN32_SkColorType, + SkIRect bounds = fPicture->cullRect().roundOut(); + SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), kN32_SkColorType, kPremul_SkAlphaType); return SkSurface::NewRaster(info); } @@ -110,9 +134,8 @@ SkSurface* Request::createCPUSurface() { SkSurface* Request::createGPUSurface() { GrContext* context = fContextFactory->get(GrContextFactory::kNative_GLContextType, GrContextFactory::kNone_GLContextOptions); - int maxRTSize = context->caps()->maxRenderTargetSize(); - SkImageInfo info = SkImageInfo::Make(SkTMin(kImageWidth, maxRTSize), - SkTMin(kImageHeight, maxRTSize), + SkIRect bounds = fPicture->cullRect().roundOut(); + SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), kN32_SkColorType, kPremul_SkAlphaType); uint32_t flags = 0; SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType); @@ -145,7 +168,8 @@ bool Request::initPictureFromStream(SkStream* stream) { } // pour picture into debug canvas - fDebugCanvas.reset(new SkDebugCanvas(kImageWidth, Request::kImageHeight)); + SkIRect bounds = fPicture->cullRect().roundOut(); + fDebugCanvas.reset(new SkDebugCanvas(bounds.width(), bounds.height())); fDebugCanvas->drawPicture(fPicture); // for some reason we need to 'flush' the debug canvas by drawing all of the ops @@ -235,3 +259,16 @@ SkData* Request::getJsonInfo(int n) { // We don't want the null terminator so strlen is correct return SkData::NewWithCopy(json.c_str(), strlen(json.c_str())); } + +SkColor Request::getPixel(int x, int y) { + SkCanvas* canvas = this->getCanvas(); + canvas->flush(); + SkAutoTDelete<SkBitmap> bitmap(this->getBitmapFromCanvas(canvas)); + SkASSERT(bitmap); + bitmap->lockPixels(); + uint8_t* start = ((uint8_t*) bitmap->getPixels()) + (y * bitmap->width() + x) * 4; + SkColor result = SkColorSetARGB(start[3], start[0], start[1], start[2]); + bitmap->unlockPixels(); + return result; +} + diff --git a/tools/skiaserve/Request.h b/tools/skiaserve/Request.h index 0b974e7423..0a2b17a401 100644 --- a/tools/skiaserve/Request.h +++ b/tools/skiaserve/Request.h @@ -31,6 +31,7 @@ struct Request { // draws to skia draw op N, highlighting the Mth batch(-1 means no highlight) SkData* drawToPng(int n, int m = -1); + SkData* writeOutSkp(); SkCanvas* getCanvas(); SkBitmap* getBitmapFromCanvas(SkCanvas* canvas); bool enableGPU(bool enable); @@ -48,9 +49,8 @@ struct Request { // Returns json with the viewMatrix and clipRect SkData* getJsonInfo(int n); - // TODO probably want to make this configurable - static const int kImageWidth; - static const int kImageHeight; + // returns the color of the pixel at (x,y) in the canvas + SkColor getPixel(int x, int y); UploadContext* fUploadContext; SkAutoTUnref<SkDebugCanvas> fDebugCanvas; diff --git a/tools/skiaserve/urlhandlers/BreakHandler.cpp b/tools/skiaserve/urlhandlers/BreakHandler.cpp index 0b044634fe..b701955f90 100644 --- a/tools/skiaserve/urlhandlers/BreakHandler.cpp +++ b/tools/skiaserve/urlhandlers/BreakHandler.cpp @@ -19,19 +19,6 @@ bool BreakHandler::canHandle(const char* method, const char* url) { 0 == strncmp(url, kBasePath, strlen(kBasePath)); } -SkColor BreakHandler::GetPixel(Request* request, int x, int y) { - SkCanvas* canvas = request->getCanvas(); - canvas->flush(); - SkAutoTDelete<SkBitmap> bitmap(request->getBitmapFromCanvas(canvas)); - SkASSERT(bitmap); - bitmap->lockPixels(); - uint8_t* start = ((uint8_t*) bitmap->getPixels()) + (y * Request::kImageWidth + x) * 4; - SkColor result = SkColorSetARGB(start[3], start[0], start[1], start[2]); - bitmap->unlockPixels(); - return result; -} - - int BreakHandler::handle(Request* request, MHD_Connection* connection, const char* url, const char* method, const char* upload_data, size_t* upload_data_size) { @@ -59,7 +46,7 @@ int BreakHandler::handle(Request* request, MHD_Connection* connection, for (int i = 0; i <= n; ++i) { request->fDebugCanvas->getDrawCommandAt(i)->execute(canvas); } - SkColor target = GetPixel(request, x, y); + SkColor target = request->getPixel(x, y); Json::Value response(Json::objectValue); Json::Value startColor(Json::arrayValue); startColor.append(Json::Value(SkColorGetR(target))); @@ -78,7 +65,7 @@ int BreakHandler::handle(Request* request, MHD_Connection* connection, saveCount = canvas->save(); } request->fDebugCanvas->getDrawCommandAt(index)->execute(canvas); - SkColor current = GetPixel(request, x, y); + SkColor current = request->getPixel(x, y); if (current != target) { Json::Value endColor(Json::arrayValue); endColor.append(Json::Value(SkColorGetR(current))); diff --git a/tools/skiaserve/urlhandlers/DownloadHandler.cpp b/tools/skiaserve/urlhandlers/DownloadHandler.cpp index cc55c3b4b9..fd9308d26e 100644 --- a/tools/skiaserve/urlhandlers/DownloadHandler.cpp +++ b/tools/skiaserve/urlhandlers/DownloadHandler.cpp @@ -8,8 +8,6 @@ #include "UrlHandler.h" #include "microhttpd.h" -#include "SkPictureRecorder.h" -#include "SkPixelSerializer.h" #include "../Request.h" #include "../Response.h" @@ -27,22 +25,7 @@ int DownloadHandler::handle(Request* request, MHD_Connection* connection, return MHD_NO; } - // TODO move to a function - // Playback into picture recorder - SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(Request::kImageWidth, - Request::kImageHeight); - - request->fDebugCanvas->draw(canvas); - - SkAutoTUnref<SkPicture> picture(recorder.endRecording()); - - SkDynamicMemoryWStream outStream; - - SkAutoTUnref<SkPixelSerializer> serializer(SkImageEncoder::CreatePixelSerializer()); - picture->serialize(&outStream, serializer); - - SkAutoTUnref<SkData> data(outStream.copyToData()); + SkAutoTUnref<SkData> data(request->writeOutSkp()); // TODO fancier name handling return SendData(connection, data, "application/octet-stream", true, diff --git a/tools/skiaserve/urlhandlers/UrlHandler.h b/tools/skiaserve/urlhandlers/UrlHandler.h index 3fe269a57f..4fa9731da1 100644 --- a/tools/skiaserve/urlhandlers/UrlHandler.h +++ b/tools/skiaserve/urlhandlers/UrlHandler.h @@ -41,8 +41,6 @@ public: int handle(Request* request, MHD_Connection* connection, const char* url, const char* method, const char* upload_data, size_t* upload_data_size) override; -private: - static SkColor GetPixel(Request* request, int x, int y); }; /** |