| Index: tools/skiaserve/Request.cpp
|
| diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp
|
| index 2d956c90f72d4a819635ab3794125b8f0e0a79a3..a0580754107667994ee4d12b03a8521a4d7a6ccb 100644
|
| --- a/tools/skiaserve/Request.cpp
|
| +++ b/tools/skiaserve/Request.cpp
|
| @@ -12,6 +12,9 @@
|
| #include "SkPictureRecorder.h"
|
| #include "SkPixelSerializer.h"
|
|
|
| +static int kDefaultWidth = 1920;
|
| +static int kDefaultHeight = 1080;
|
| +
|
| 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);
|
| out->write(data, length);
|
| @@ -59,7 +62,7 @@ Request::Request(SkString rootUrl)
|
|
|
| SkBitmap* Request::getBitmapFromCanvas(SkCanvas* canvas) {
|
| SkBitmap* bmp = new SkBitmap();
|
| - SkIRect bounds = fPicture->cullRect().roundOut();
|
| + SkIRect bounds = this->getBounds();
|
| SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(),
|
| kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
|
| bmp->setInfo(info);
|
| @@ -108,7 +111,7 @@ SkData* Request::drawToPng(int n, int m) {
|
|
|
| SkData* Request::writeOutSkp() {
|
| // Playback into picture recorder
|
| - SkIRect bounds = fPicture->cullRect().roundOut();
|
| + SkIRect bounds = this->getBounds();
|
| SkPictureRecorder recorder;
|
| SkCanvas* canvas = recorder.beginRecording(bounds.width(), bounds.height());
|
|
|
| @@ -124,17 +127,41 @@ SkData* Request::writeOutSkp() {
|
| return outStream.copyToData();
|
| }
|
|
|
| +GrContext* Request::getContext() {
|
| + return fContextFactory->get(GrContextFactory::kNative_GLContextType,
|
| + GrContextFactory::kNone_GLContextOptions);
|
| +}
|
| +
|
| +SkIRect Request::getBounds() {
|
| + SkIRect bounds;
|
| + if (fPicture) {
|
| + bounds = fPicture->cullRect().roundOut();
|
| + if (fGPUEnabled) {
|
| + int maxRTSize = this->getContext()->caps()->maxRenderTargetSize();
|
| + bounds = SkIRect::MakeWH(SkTMin(bounds.width(), maxRTSize),
|
| + SkTMin(bounds.height(), maxRTSize));
|
| + }
|
| + } else {
|
| + bounds = SkIRect::MakeWH(kDefaultWidth, kDefaultHeight);
|
| + }
|
| +
|
| + // We clip to kDefaultWidth / kDefaultHeight for performance reasons
|
| + // TODO make this configurable
|
| + bounds = SkIRect::MakeWH(SkTMin(bounds.width(), kDefaultWidth),
|
| + SkTMin(bounds.height(), kDefaultHeight));
|
| + return bounds;
|
| +}
|
| +
|
| SkSurface* Request::createCPUSurface() {
|
| - SkIRect bounds = fPicture->cullRect().roundOut();
|
| + SkIRect bounds = this->getBounds();
|
| SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), kN32_SkColorType,
|
| kPremul_SkAlphaType);
|
| return SkSurface::NewRaster(info);
|
| }
|
|
|
| SkSurface* Request::createGPUSurface() {
|
| - GrContext* context = fContextFactory->get(GrContextFactory::kNative_GLContextType,
|
| - GrContextFactory::kNone_GLContextOptions);
|
| - SkIRect bounds = fPicture->cullRect().roundOut();
|
| + GrContext* context = this->getContext();
|
| + SkIRect bounds = this->getBounds();
|
| SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(),
|
| kN32_SkColorType, kPremul_SkAlphaType);
|
| uint32_t flags = 0;
|
| @@ -167,8 +194,11 @@ bool Request::initPictureFromStream(SkStream* stream) {
|
| return false;
|
| }
|
|
|
| + // reinitialize canvas with the new picture dimensions
|
| + this->enableGPU(fGPUEnabled);
|
| +
|
| // pour picture into debug canvas
|
| - SkIRect bounds = fPicture->cullRect().roundOut();
|
| + SkIRect bounds = this->getBounds();
|
| fDebugCanvas.reset(new SkDebugCanvas(bounds.width(), bounds.height()));
|
| fDebugCanvas->drawPicture(fPicture);
|
|
|
| @@ -178,28 +208,6 @@ bool Request::initPictureFromStream(SkStream* stream) {
|
| return true;
|
| }
|
|
|
| -GrAuditTrail* Request::getAuditTrail(SkCanvas* canvas) {
|
| - GrAuditTrail* at = nullptr;
|
| -#if SK_SUPPORT_GPU
|
| - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
|
| - if (rt) {
|
| - GrContext* ctx = rt->getContext();
|
| - if (ctx) {
|
| - at = ctx->getAuditTrail();
|
| - }
|
| - }
|
| -#endif
|
| - return at;
|
| -}
|
| -
|
| -void Request::cleanupAuditTrail(SkCanvas* canvas) {
|
| - GrAuditTrail* at = this->getAuditTrail(canvas);
|
| - if (at) {
|
| - GrAuditTrail::AutoEnable ae(at);
|
| - at->fullReset();
|
| - }
|
| -}
|
| -
|
| SkData* Request::getJsonOps(int n) {
|
| SkCanvas* canvas = this->getCanvas();
|
| Json::Value root = fDebugCanvas->toJSON(fUrlDataManager, n, canvas);
|
| @@ -208,8 +216,6 @@ SkData* Request::getJsonOps(int n) {
|
| SkDynamicMemoryWStream stream;
|
| stream.writeText(Json::FastWriter().write(root).c_str());
|
|
|
| - this->cleanupAuditTrail(canvas);
|
| -
|
| return stream.copyToData();
|
| }
|
|
|
| @@ -217,24 +223,10 @@ SkData* Request::getJsonBatchList(int n) {
|
| SkCanvas* canvas = this->getCanvas();
|
| SkASSERT(fGPUEnabled);
|
|
|
| - // TODO if this is inefficient we could add a method to GrAuditTrail which takes
|
| - // a Json::Value and is only compiled in this file
|
| - Json::Value parsedFromString;
|
| -#if SK_SUPPORT_GPU
|
| - // we use the toJSON method on debug canvas, but then just ignore the results and pull
|
| - // the information we care about from the audit trail
|
| - fDebugCanvas->toJSON(fUrlDataManager, n, canvas);
|
| -
|
| - GrAuditTrail* at = this->getAuditTrail(canvas);
|
| - GrAuditTrail::AutoManageBatchList enable(at);
|
| - Json::Reader reader;
|
| - SkDEBUGCODE(bool parsingSuccessful = )reader.parse(at->toJson().c_str(),
|
| - parsedFromString);
|
| - SkASSERT(parsingSuccessful);
|
| -#endif
|
| + Json::Value result = fDebugCanvas->toJSONBatchList(n, canvas);
|
|
|
| SkDynamicMemoryWStream stream;
|
| - stream.writeText(Json::FastWriter().write(parsedFromString).c_str());
|
| + stream.writeText(Json::FastWriter().write(result).c_str());
|
|
|
| return stream.copyToData();
|
| }
|
|
|