1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_CODEC_JPEG_CODEC_H_
#define UI_GFX_CODEC_JPEG_CODEC_H_
#include <stddef.h>
#include <memory>
#include <optional>
#include <vector>
#include "base/containers/span.h"
#include "third_party/skia/include/core/SkColorType.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "third_party/skia/include/encode/SkJpegEncoder.h"
#include "ui/gfx/codec/codec_export.h"
class SkBitmap;
namespace gfx {
// Interface for encoding/decoding JPEG data. This is a wrapper around Skia
// image codecs, with a simpler interface for callers. This is only used for UI
// elements; Blink has its own more complicated JPEG decoder which handles,
// among other things, partially downloaded data.
class CODEC_EXPORT JPEGCodec {
public:
// Encodes the given raw `input` pixmap, which includes a pointer to pixels as
// well as information describing the pixel format.
//
// Returns the encoded data on success, or std::nullopt on failure.
//
// downsample: specifies how pixels will be sampled in the encoded JPEG image,
// can be either k420, k422 or k444.
//
// quality: an integer in the range 0-100, where 100 is the highest quality.
//
// xmp_metadata: pointer to XMP metadata, or nullptr if there is no XMP
// metadata.
static std::optional<std::vector<uint8_t>> Encode(
const SkPixmap& input,
int quality,
SkJpegEncoder::Downsample downsample,
const SkData* xmp_metadata = nullptr);
// Encodes the given raw `input` pixmap, which includes a pointer to pixels
// as well as information describing the pixel format.
//
// Returns the encoded data on success, or std::nullopt on failure.
//
// quality: an integer in the range 0-100, where 100 is the highest quality.
static std::optional<std::vector<uint8_t>> Encode(const SkPixmap& input,
int quality);
// Encodes the `input` bitmap`
//
// Returns the encoded data on success, or std::nullopt on failure.
//
// quality: an integer in the range 0-100, where 100 is the highest quality.
static std::optional<std::vector<uint8_t>> Encode(const SkBitmap& input,
int quality);
// Decodes the JPEG data contained in `input` of length `input_size`.
// `color_type` must be RGBA_8888 or BGRA_8888. The decoded data will be
// placed in *output, with the dimensions in *w and *h on success (returns
// true). This data will be written in the `color_type` format. On failure,
// the values of these output variables is undefined.
//
// TODO(https://crbug.com/371987005): Remove and replace, as this is untested
// and unused other than in unit tests.
[[nodiscard]] static bool Decode(const uint8_t* input,
size_t input_size,
SkColorType color_type,
std::vector<uint8_t>* output,
int* w,
int* h);
// Decodes the JPEG data contained in `input`.
//
// Returns a valid SkBitmap if the data can be decoded as a JPEG, and a null
// SkBitmap otherwise.
static SkBitmap Decode(base::span<const uint8_t> input);
};
} // namespace gfx
#endif // UI_GFX_CODEC_JPEG_CODEC_H_
|