15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/image_decoder.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_utility_messages.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/utility_process_host.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UtilityProcessHost;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageDecoder::ImageDecoder(Delegate* delegate,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& image_data,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ImageCodec image_codec)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_data_(image_data.begin(), image_data.end()),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_codec_(image_codec),
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      task_runner_(NULL),
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      shrink_to_fit_(false) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageDecoder::~ImageDecoder() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageDecoder::Start(scoped_refptr<base::SequencedTaskRunner> task_runner) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner_ = task_runner;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     BrowserThread::IO, FROM_HERE,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     base::Bind(&ImageDecoder::DecodeImageInSandbox, this, image_data_));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImageDecoder::OnMessageReceived(const IPC::Message& message) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ImageDecoder, message)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_DecodeImage_Succeeded,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDecodeImageSucceeded)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_DecodeImage_Failed,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDecodeImageFailed)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageDecoder::OnDecodeImageSucceeded(const SkBitmap& decoded_image) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(task_runner_->RunsTasksOnCurrentThread());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnImageDecoded(this, decoded_image);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageDecoder::OnDecodeImageFailed() {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(task_runner_->RunsTasksOnCurrentThread());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDecodeImageFailed(this);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageDecoder::DecodeImageInSandbox(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<unsigned char>& image_data) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UtilityProcessHost* utility_process_host;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  utility_process_host = UtilityProcessHost::Create(this, task_runner_.get());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image_codec_ == ROBUST_JPEG_CODEC) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    utility_process_host->Send(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ChromeUtilityMsg_RobustJPEGDecodeImage(image_data));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    utility_process_host->Send(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ChromeUtilityMsg_DecodeImage(image_data, shrink_to_fit_));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
72