Index: chrome/browser/image_decoder.h |
diff --git a/chrome/browser/image_decoder.h b/chrome/browser/image_decoder.h |
index 2206dd9f454ebcbfc3a29674cf41e1d42eb594ee..aa85d3d336d59958073cfc36e4ad140105e670e8 100644 |
--- a/chrome/browser/image_decoder.h |
+++ b/chrome/browser/image_decoder.h |
@@ -11,12 +11,11 @@ |
#include "base/compiler_specific.h" |
#include "base/memory/ref_counted.h" |
#include "base/threading/sequenced_worker_pool.h" |
-#include "content/public/browser/utility_process_host_client.h" |
- |
-class SkBitmap; |
+#include "content/common/image_decoder.mojom.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
// Decodes an image in a sandboxed process. |
-class ImageDecoder : public content::UtilityProcessHostClient { |
+class ImageDecoder : public base::RefCountedThreadSafe<ImageDecoder> { |
public: |
class Delegate { |
public: |
@@ -59,26 +58,48 @@ class ImageDecoder : public content::UtilityProcessHostClient { |
void set_shrink_to_fit(bool shrink_to_fit) { shrink_to_fit_ = shrink_to_fit; } |
private: |
+ friend class base::RefCountedThreadSafe<ImageDecoder>; |
// It's a reference counted object, so destructor is private. |
- ~ImageDecoder() override; |
- |
- // Overidden from UtilityProcessHostClient: |
- bool OnMessageReceived(const IPC::Message& message) override; |
- |
- // IPC message handlers. |
- void OnDecodeImageSucceeded(const SkBitmap& decoded_image); |
- void OnDecodeImageFailed(); |
+ ~ImageDecoder(); |
// Launches sandboxed process that will decode the image. |
void DecodeImageInSandbox(const std::vector<unsigned char>& image_data); |
+ // Mojo RPC callback. |
+ void OnDecodeImageDone(bool success, content::ImageDataPtr image); |
+ |
Delegate* delegate_; |
std::vector<unsigned char> image_data_; |
const ImageCodec image_codec_; |
scoped_refptr<base::SequencedTaskRunner> task_runner_; |
bool shrink_to_fit_; // if needed for IPC msg size limit |
+ content::ImageDecoderPtr decoder_; |
DISALLOW_COPY_AND_ASSIGN(ImageDecoder); |
}; |
+// TODO(amistry): Move somewhere else. |
+namespace mojo { |
+template <> |
+struct TypeConverter<SkBitmap, content::ImageDataPtr> { |
+ static SkBitmap Convert(const content::ImageDataPtr& image) { |
+ SkBitmap bitmap; |
+ if (!bitmap.tryAllocPixels(SkImageInfo::Make( |
+ image->width, image->height, |
+ static_cast<SkColorType>(image->color_type), |
+ static_cast<SkAlphaType>(image->alpha_type)))) { |
+ LOG(ERROR) << "Unable to create SkBitmap"; |
+ return bitmap; |
+ } |
+ if (bitmap.getSize() != image->pixels.size()) { |
+ LOG(ERROR) << "Incorrect bitmap size, expected: " << image->pixels.size() |
+ << ", actual: " << bitmap.getSize(); |
+ return bitmap; |
+ } |
+ memcpy(bitmap.getPixels(), &image->pixels[0], bitmap.getSize()); |
+ return bitmap; |
+ } |
+}; |
+} // namespace mojo |
+ |
#endif // CHROME_BROWSER_IMAGE_DECODER_H_ |