1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef GFX_LAYERS_BLOBSURFACE_H
8 #define GFX_LAYERS_BLOBSURFACE_H
9 
10 #include <stdint.h>                         // for uint8_t, uint32_t
11 #include "mozilla/Attributes.h"             // for MOZ_STACK_CLASS
12 #include "mozilla/RefPtr.h"                 // for already_AddRefed
13 #include "mozilla/gfx/Point.h"              // for IntSize
14 #include "mozilla/gfx/Rect.h"               // for IntRect
15 #include "mozilla/gfx/Types.h"              // for SurfaceFormat
16 #include "mozilla/layers/LayersSurfaces.h"  // for SurfaceDescriptor
17 
18 namespace mozilla {
19 namespace gfx {
20 class DataSourceSurface;
21 class DrawTarget;
22 }  // namespace gfx
23 }  // namespace mozilla
24 
25 namespace mozilla {
26 namespace layers {
27 
28 namespace ImageDataSerializer {
29 
30 // RGB
31 
32 int32_t ComputeRGBStride(gfx::SurfaceFormat aFormat, int32_t aWidth);
33 
34 int32_t GetRGBStride(const RGBDescriptor& aDescriptor);
35 
36 uint32_t ComputeRGBBufferSize(gfx::IntSize aSize, gfx::SurfaceFormat aFormat);
37 
38 // YCbCr
39 
40 /// This function is meant as a helper to know how much shared memory we need
41 /// to allocate in a shmem in order to place a shared YCbCr image blob of
42 /// given dimensions.
43 uint32_t ComputeYCbCrBufferSize(const gfx::IntSize& aYSize, int32_t aYStride,
44                                 const gfx::IntSize& aCbCrSize,
45                                 int32_t aCbCrStride);
46 uint32_t ComputeYCbCrBufferSize(const gfx::IntSize& aYSize, int32_t aYStride,
47                                 const gfx::IntSize& aCbCrSize,
48                                 int32_t aCbCrStride, uint32_t aYOffset,
49                                 uint32_t aCbOffset, uint32_t aCrOffset);
50 uint32_t ComputeYCbCrBufferSize(uint32_t aBufferSize);
51 
52 void ComputeYCbCrOffsets(int32_t yStride, int32_t yHeight, int32_t cbCrStride,
53                          int32_t cbCrHeight, uint32_t& outYOffset,
54                          uint32_t& outCbOffset, uint32_t& outCrOffset);
55 
56 gfx::SurfaceFormat FormatFromBufferDescriptor(
57     const BufferDescriptor& aDescriptor);
58 
59 gfx::IntSize SizeFromBufferDescriptor(const BufferDescriptor& aDescriptor);
60 
61 gfx::IntRect RectFromBufferDescriptor(const BufferDescriptor& aDescriptor);
62 
63 Maybe<gfx::IntSize> CbCrSizeFromBufferDescriptor(
64     const BufferDescriptor& aDescriptor);
65 
66 Maybe<int32_t> YStrideFromBufferDescriptor(const BufferDescriptor& aDescriptor);
67 
68 Maybe<int32_t> CbCrStrideFromBufferDescriptor(
69     const BufferDescriptor& aDescriptor);
70 
71 Maybe<gfx::YUVColorSpace> YUVColorSpaceFromBufferDescriptor(
72     const BufferDescriptor& aDescriptor);
73 
74 Maybe<gfx::ColorDepth> ColorDepthFromBufferDescriptor(
75     const BufferDescriptor& aDescriptor);
76 
77 Maybe<gfx::ColorRange> ColorRangeFromBufferDescriptor(
78     const BufferDescriptor& aDescriptor);
79 
80 Maybe<StereoMode> StereoModeFromBufferDescriptor(
81     const BufferDescriptor& aDescriptor);
82 
83 uint8_t* GetYChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor);
84 
85 uint8_t* GetCbChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor);
86 
87 uint8_t* GetCrChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor);
88 
89 already_AddRefed<gfx::DataSourceSurface> DataSourceSurfaceFromYCbCrDescriptor(
90     uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor,
91     gfx::DataSourceSurface* aSurface = nullptr);
92 
93 void ConvertAndScaleFromYCbCrDescriptor(uint8_t* aBuffer,
94                                         const YCbCrDescriptor& aDescriptor,
95                                         const gfx::SurfaceFormat& aDestFormat,
96                                         const gfx::IntSize& aDestSize,
97                                         unsigned char* aDestBuffer,
98                                         int32_t aStride);
99 
100 }  // namespace ImageDataSerializer
101 
102 }  // namespace layers
103 }  // namespace mozilla
104 
105 #endif
106