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

Unified Diff: ios/chrome/browser/suggestions/ios_image_decoder_impl.mm

Issue 2689213010: Add a static method to WebPDecoder to decode WebP (Closed)
Patch Set: Address comment Created 3 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: ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
diff --git a/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm b/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
index 8c6d84adad23a50a85fd7578150f659ba55fe10c..212c29d2b634524f7ed06cff9740c36f65667cdc 100644
--- a/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
+++ b/ios/chrome/browser/suggestions/ios_image_decoder_impl.mm
@@ -7,7 +7,7 @@
#import <UIKit/UIKit.h>
#include "base/callback.h"
-#include "base/mac/scoped_nsobject.h"
+#import "base/mac/bind_objc_block.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
@@ -19,73 +19,6 @@
#error "This file requires ARC support."
#endif
-namespace {
-
-class WebpDecoderDelegate : public webp_transcode::WebpDecoder::Delegate {
- public:
- WebpDecoderDelegate() = default;
-
- NSData* data() const { return decoded_image_; }
-
- // WebpDecoder::Delegate methods
- void OnFinishedDecoding(bool success) override {
- if (!success)
- decoded_image_ = nil;
- }
-
- void SetImageFeatures(
- size_t total_size,
- webp_transcode::WebpDecoder::DecodedImageFormat format) override {
- decoded_image_ = [[NSMutableData alloc] initWithCapacity:total_size];
- }
-
- void OnDataDecoded(NSData* data) override {
- DCHECK(decoded_image_);
- [decoded_image_ appendData:data];
- }
-
- private:
- ~WebpDecoderDelegate() override {}
- NSMutableData* decoded_image_;
-
- DISALLOW_COPY_AND_ASSIGN(WebpDecoderDelegate);
-};
-
-// Returns an NSData object containing the decoded image data of the given
-// webp_image. Returns nil in case of failure.
-base::scoped_nsobject<NSData> DecodeWebpImage(
- const base::scoped_nsobject<NSData>& webp_image) {
- scoped_refptr<WebpDecoderDelegate> delegate(new WebpDecoderDelegate);
- scoped_refptr<webp_transcode::WebpDecoder> decoder(
- new webp_transcode::WebpDecoder(delegate.get()));
- decoder->OnDataReceived(webp_image);
- DLOG_IF(ERROR, !delegate->data()) << "WebP image decoding failed.";
- return base::scoped_nsobject<NSData>(delegate->data());
-}
-
-// Returns true if the given image_data is a WebP image.
-//
-// Every WebP file contains a 12 byte file header in the beginning of the file.
-// A WebP file header starts with the four ASCII characters "RIFF". The next
-// four bytes contain the image size and the last four header bytes contain the
-// four ASCII characters "WEBP".
-//
-// WebP file header:
-// 1 1
-// Byte Nr. 0 1 2 3 4 5 6 7 8 9 0 1
-// Byte value [ R I F F ? ? ? ? W E B P ]
-//
-// For more information see:
-// https://developers.google.com/speed/webp/docs/riff_container#webp_file_header
-bool IsWebpImage(const std::string& image_data) {
- if (image_data.length() < 12)
- return false;
- return image_data.compare(0, 4, "RIFF") == 0 &&
- image_data.compare(8, 4, "WEBP") == 0;
-}
-
-} // namespace
-
namespace suggestions {
class IOSImageDecoderImpl : public image_fetcher::ImageDecoder {
@@ -100,7 +33,7 @@ class IOSImageDecoderImpl : public image_fetcher::ImageDecoder {
private:
void CreateUIImageAndRunCallback(
const image_fetcher::ImageDecodedCallback& callback,
- const base::scoped_nsobject<NSData>& image_data);
+ NSData* image_data);
// The task runner used to decode images if necessary.
const scoped_refptr<base::TaskRunner> task_runner_;
@@ -124,16 +57,18 @@ void IOSImageDecoderImpl::DecodeImage(
const std::string& image_data,
const image_fetcher::ImageDecodedCallback& callback) {
// Convert the |image_data| std::string to an NSData buffer.
- base::scoped_nsobject<NSData> data([NSData
- dataWithBytesNoCopy:const_cast<char*>(image_data.c_str())
- length:image_data.length()
- freeWhenDone:NO]);
+ // The data is copied as it may have to outlive the caller in
+ // PostTaskAndReplyWithResult.
+ NSData* data =
+ [NSData dataWithBytes:image_data.data() length:image_data.size()];
// The WebP image format is not supported by iOS natively. Therefore WebP
// images need to be decoded explicitly,
- if (IsWebpImage(image_data)) {
+ if (webp_transcode::WebpDecoder::IsWebpImage(image_data)) {
base::PostTaskAndReplyWithResult(
- task_runner_.get(), FROM_HERE, base::Bind(&DecodeWebpImage, data),
+ task_runner_.get(), FROM_HERE, base::BindBlockArc(^NSData*() {
+ return webp_transcode::WebpDecoder::DecodeWebpImage(data);
+ }),
base::Bind(&IOSImageDecoderImpl::CreateUIImageAndRunCallback,
weak_factory_.GetWeakPtr(), callback));
} else {
@@ -143,7 +78,7 @@ void IOSImageDecoderImpl::DecodeImage(
void IOSImageDecoderImpl::CreateUIImageAndRunCallback(
const image_fetcher::ImageDecodedCallback& callback,
- const base::scoped_nsobject<NSData>& image_data) {
+ NSData* image_data) {
// Decode the image data using UIImage.
if (image_data) {
// "Most likely" always returns 1x images.
« no previous file with comments | « components/image_fetcher/ios/ios_image_data_fetcher_wrapper_unittest.mm ('k') | ios/web/public/image_fetcher/webp_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698