Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(583)

Side by Side Diff: tools/debugger/SkDrawCommand.cpp

Issue 1818043003: unified PNG encoding between SkDrawCommand and skiaserve (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/debugger/SkDrawCommand.h ('k') | tools/skiaserve/Request.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkDrawCommand.h" 10 #include "SkDrawCommand.h"
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 buffer.writeToMemory(data); 599 buffer.writeToMemory(data);
600 Json::Value jsonData; 600 Json::Value jsonData;
601 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlData Manager, &jsonData); 601 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlData Manager, &jsonData);
602 Json::Value jsonFlattenable; 602 Json::Value jsonFlattenable;
603 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->get TypeName()); 603 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->get TypeName());
604 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData; 604 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
605 (*target) = jsonFlattenable; 605 (*target) = jsonFlattenable;
606 sk_free(data); 606 sk_free(data);
607 } 607 }
608 608
609 static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t l ength) {
610 SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
611 out->write(data, length);
612 }
613
614 void SkDrawCommand::WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_3 2 height,
615 SkWStream& out) {
616 png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
617 SkASSERT(png != nullptr);
618 png_infop info_ptr = png_create_info_struct(png);
619 SkASSERT(info_ptr != nullptr);
620 if (setjmp(png_jmpbuf(png))) {
621 SkFAIL("png encode error");
622 }
623 png_set_IHDR(png, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERL ACE_NONE,
624 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
625 png_set_compression_level(png, 1);
626 png_bytepp rows = (png_bytepp) sk_malloc_throw(height * sizeof(png_byte*));
627 png_bytep pixels = (png_bytep) sk_malloc_throw(width * height * 3);
628 for (png_size_t y = 0; y < height; ++y) {
629 const png_bytep src = rgba + y * width * 4;
630 rows[y] = pixels + y * width * 3;
631 // convert from RGBA to RGB
632 for (png_size_t x = 0; x < width; ++x) {
633 rows[y][x * 3] = src[x * 4];
634 rows[y][x * 3 + 1] = src[x * 4 + 1];
635 rows[y][x * 3 + 2] = src[x * 4 + 2];
636 }
637 }
638 png_set_filter(png, 0, PNG_NO_FILTERS);
639 png_set_rows(png, info_ptr, &rows[0]);
640 png_set_write_fn(png, &out, write_png_callback, NULL);
641 png_write_png(png, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
642 png_destroy_write_struct(&png, NULL);
643 sk_free(rows);
644 sk_free(pixels);
645 }
646
609 static bool SK_WARN_UNUSED_RESULT flatten(const SkImage& image, Json::Value* tar get, 647 static bool SK_WARN_UNUSED_RESULT flatten(const SkImage& image, Json::Value* tar get,
610 UrlDataManager& urlDataManager) { 648 UrlDataManager& urlDataManager) {
611 SkData* encoded = image.encode(SkImageEncoder::kPNG_Type, 100); 649 size_t rowBytes = 4 * image.width();
612 if (encoded == nullptr) { 650 SkAutoFree buffer(sk_malloc_throw(rowBytes * image.height()));
613 // PNG encode doesn't necessarily support all color formats, convert to a different 651 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
614 // format 652 kN32_SkColorType, kPremul_SkAlphaTyp e);
615 size_t rowBytes = 4 * image.width(); 653 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
616 void* buffer = sk_malloc_throw(rowBytes * image.height()); 654 SkDebugf("readPixels failed\n");
617 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(), 655 return false;
618 kN32_SkColorType, kPremul_SkAlph aType);
619 if (!image.readPixels(dstInfo, buffer, rowBytes, 0, 0)) {
620 SkDebugf("readPixels failed\n");
621 return false;
622 }
623 sk_sp<SkImage> converted = SkImage::MakeRasterCopy(SkPixmap(dstInfo, buf fer, rowBytes));
624 encoded = converted->encode(SkImageEncoder::kPNG_Type, 100);
625 if (encoded == nullptr) {
626 SkDebugf("image encode failed\n");
627 return false;
628 }
629 sk_free(buffer);
630 } 656 }
657 SkDynamicMemoryWStream out;
658 SkDrawCommand::WritePNG((png_bytep) buffer.get(), image.width(), image.heigh t(), out);
659 SkData* encoded = out.copyToData();
631 Json::Value jsonData; 660 Json::Value jsonData;
632 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, & jsonData); 661 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, & jsonData);
633 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData; 662 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
634 encoded->unref(); 663 encoded->unref();
635 return true; 664 return true;
636 } 665 }
637 666
638 static const char* color_type_name(SkColorType colorType) { 667 static const char* color_type_name(SkColorType colorType) {
639 switch (colorType) { 668 switch (colorType) {
640 case kARGB_4444_SkColorType: 669 case kARGB_4444_SkColorType:
(...skipping 2462 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix); 3132 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
3104 return result; 3133 return result;
3105 } 3134 }
3106 3135
3107 SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command, 3136 SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command,
3108 UrlDataManager& urlDataManager) { 3137 UrlDataManager& urlDataManager) {
3109 SkMatrix matrix; 3138 SkMatrix matrix;
3110 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix); 3139 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3111 return new SkSetMatrixCommand(matrix); 3140 return new SkSetMatrixCommand(matrix);
3112 } 3141 }
OLDNEW
« no previous file with comments | « tools/debugger/SkDrawCommand.h ('k') | tools/skiaserve/Request.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698