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

Unified Diff: blimp/client/feature/compositor/decoding_image_generator.cc

Issue 1680333004: Add support for encoding/decoding WebP images. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@serialize-deserialize-images-framework
Patch Set: Simplify WebPDecoder and assume premultiplied alpha channel Created 4 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: blimp/client/feature/compositor/decoding_image_generator.cc
diff --git a/blimp/client/feature/compositor/decoding_image_generator.cc b/blimp/client/feature/compositor/decoding_image_generator.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b2239c538ddd5a12aeb4c4872516f0e2f67c6992
--- /dev/null
+++ b/blimp/client/feature/compositor/decoding_image_generator.cc
@@ -0,0 +1,58 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "blimp/client/feature/compositor/decoding_image_generator.h"
+
+#include "blimp/common/compositor/webp_decoder.h"
+#include "third_party/libwebp/webp/decode.h"
+#include "third_party/libwebp/webp/demux.h"
+#include "third_party/skia/include/core/SkData.h"
+
+namespace blimp {
+namespace client {
+
+SkImageGenerator* DecodingImageGenerator::create(SkData* data) {
+ WebPData inputData = {reinterpret_cast<const uint8_t*>(data->data()),
+ data->size()};
+ WebPDemuxState demuxState(WEBP_DEMUX_PARSING_HEADER);
+ WebPDemuxer* demux = WebPDemuxPartial(&inputData, &demuxState);
+
+ uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
+ uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
+
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
+ return new DecodingImageGenerator(info, data->data(), data->size());
+}
+
+DecodingImageGenerator::DecodingImageGenerator(const SkImageInfo info,
+ const void* data,
+ size_t size)
+ : SkImageGenerator(info) {
+ WebPDecoder(data, size, &decoded_bitmap_);
+}
+
+DecodingImageGenerator::~DecodingImageGenerator() {}
+
+bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info,
+ void* pixels,
+ size_t rowBytes,
+ SkPMColor table[],
+ int* tableCount) {
+ SkAutoLockPixels bitmapLock(decoded_bitmap_);
+ if (decoded_bitmap_.getPixels() != pixels) {
+ return decoded_bitmap_.copyPixelsTo(pixels, rowBytes * info.height(),
+ rowBytes);
+ }
+ return true;
+}
+
+bool DecodingImageGenerator::onGetYUV8Planes(SkISize sizes[3],
+ void* planes[3],
+ size_t rowBytes[3],
+ SkYUVColorSpace*) {
+ return false;
+}
+
+} // namespace client
+} // namespace blimp

Powered by Google App Engine
This is Rietveld 408576698