blob: 24dbd5bf83d9bb5457c9dca755738a18766a4292 [file] [log] [blame]
rockot2a0f4fb32016-11-11 18:44:191// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "services/image_decoder/public/cpp/decode.h"
6
7#include "services/image_decoder/public/cpp/constants.h"
8#include "services/service_manager/public/cpp/connector.h"
9#include "third_party/skia/include/core/SkBitmap.h"
10
11namespace image_decoder {
12
13namespace {
14
15// Helper callback which owns an ImageDecoderPtr until invoked. This keeps the
16// ImageDecoder pipe open just long enough to dispatch a reply, at which point
17// the reply is forwarded to the wrapped |callback|.
18void OnDecodeImage(mojom::ImageDecoderPtr decoder,
19 const mojom::ImageDecoder::DecodeImageCallback& callback,
20 const SkBitmap& bitmap) {
21 callback.Run(bitmap);
22}
23
24// Called in the case of a connection error on an ImageDecoder proxy.
25void OnConnectionError(
26 const mojom::ImageDecoder::DecodeImageCallback& callback) {
27 SkBitmap null_bitmap;
28 callback.Run(null_bitmap);
29}
30
31} // namespace
32
33void Decode(service_manager::Connector* connector,
34 const std::vector<uint8_t>& encoded_bytes,
35 mojom::ImageCodec codec,
36 bool shrink_to_fit,
37 uint64_t max_size_in_bytes,
38 const mojom::ImageDecoder::DecodeImageCallback& callback) {
39 mojom::ImageDecoderPtr decoder;
40 connector->ConnectToInterface(kServiceName, &decoder);
41 decoder.set_connection_error_handler(
42 base::Bind(&OnConnectionError, callback));
43 mojom::ImageDecoder* raw_decoder = decoder.get();
44 raw_decoder->DecodeImage(
45 encoded_bytes, codec, shrink_to_fit, max_size_in_bytes,
46 base::Bind(&OnDecodeImage, base::Passed(&decoder), callback));
47}
48
49} // namespace image_decoder