ImageDataSerializer.h (4233B)
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/gfx/Point.h" // for IntSize 13 #include "mozilla/gfx/Rect.h" // for IntRect 14 #include "mozilla/gfx/Types.h" // for SurfaceFormat 15 #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor 16 17 namespace mozilla { 18 namespace gfx { 19 class DataSourceSurface; 20 class DrawTarget; 21 } // namespace gfx 22 } // namespace mozilla 23 24 namespace mozilla { 25 namespace layers { 26 27 namespace ImageDataSerializer { 28 29 // RGB 30 31 int32_t ComputeRGBStride(gfx::SurfaceFormat aFormat, int32_t aWidth); 32 33 int32_t GetRGBStride(const RGBDescriptor& aDescriptor); 34 35 uint32_t ComputeRGBBufferSize(gfx::IntSize aSize, gfx::SurfaceFormat aFormat); 36 37 // YCbCr 38 39 /// This function is meant as a helper to know how much shared memory we need 40 /// to allocate in a shmem in order to place a shared YCbCr image blob of 41 /// given dimensions. 42 uint32_t ComputeYCbCrBufferSize(const gfx::IntSize& aYSize, int32_t aYStride, 43 const gfx::IntSize& aCbCrSize, 44 int32_t aCbCrStride); 45 uint32_t ComputeYCbCrBufferSize(const gfx::IntSize& aYSize, int32_t aYStride, 46 const gfx::IntSize& aCbCrSize, 47 int32_t aCbCrStride, uint32_t aYOffset, 48 uint32_t aCbOffset, uint32_t aCrOffset); 49 uint32_t ComputeYCbCrBufferSize(uint32_t aBufferSize); 50 51 void ComputeYCbCrOffsets(int32_t yStride, int32_t yHeight, int32_t cbCrStride, 52 int32_t cbCrHeight, uint32_t& outYOffset, 53 uint32_t& outCbOffset, uint32_t& outCrOffset); 54 55 gfx::SurfaceFormat FormatFromBufferDescriptor( 56 const BufferDescriptor& aDescriptor); 57 58 gfx::IntSize SizeFromBufferDescriptor(const BufferDescriptor& aDescriptor); 59 60 gfx::IntRect RectFromBufferDescriptor(const BufferDescriptor& aDescriptor); 61 62 Maybe<gfx::IntSize> YSizeFromBufferDescriptor( 63 const BufferDescriptor& aDescriptor); 64 65 Maybe<gfx::IntSize> CbCrSizeFromBufferDescriptor( 66 const BufferDescriptor& aDescriptor); 67 68 Maybe<int32_t> YStrideFromBufferDescriptor(const BufferDescriptor& aDescriptor); 69 70 Maybe<int32_t> CbCrStrideFromBufferDescriptor( 71 const BufferDescriptor& aDescriptor); 72 73 Maybe<gfx::YUVColorSpace> YUVColorSpaceFromBufferDescriptor( 74 const BufferDescriptor& aDescriptor); 75 76 Maybe<gfx::ColorDepth> ColorDepthFromBufferDescriptor( 77 const BufferDescriptor& aDescriptor); 78 79 Maybe<gfx::ColorRange> ColorRangeFromBufferDescriptor( 80 const BufferDescriptor& aDescriptor); 81 82 Maybe<StereoMode> StereoModeFromBufferDescriptor( 83 const BufferDescriptor& aDescriptor); 84 85 Maybe<gfx::ChromaSubsampling> ChromaSubsamplingFromBufferDescriptor( 86 const BufferDescriptor& aDescriptor); 87 88 uint8_t* GetYChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor); 89 90 uint8_t* GetCbChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor); 91 92 uint8_t* GetCrChannel(uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor); 93 94 already_AddRefed<gfx::DataSourceSurface> DataSourceSurfaceFromYCbCrDescriptor( 95 uint8_t* aBuffer, const YCbCrDescriptor& aDescriptor, 96 gfx::DataSourceSurface* aSurface = nullptr); 97 98 void ConvertAndScaleFromYCbCrDescriptor(uint8_t* aBuffer, 99 const YCbCrDescriptor& aDescriptor, 100 const gfx::SurfaceFormat& aDestFormat, 101 const gfx::IntSize& aDestSize, 102 unsigned char* aDestBuffer, 103 int32_t aStride); 104 105 gfx::IntSize GetCroppedCbCrSize(const YCbCrDescriptor& aDescriptor); 106 107 } // namespace ImageDataSerializer 108 109 } // namespace layers 110 } // namespace mozilla 111 112 #endif