Bug 1876318 - set shipping-product for push-bundle tasks. r=bhearsum,releng-reviewers
[gecko.git] / gfx / gl / GLReadTexImageHelper.h
blobc5b631fc1a1b2b32d13fcd6c264abb7df03fe267
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/. */
7 #ifndef GLREADTEXIMAGEHELPER_H_
8 #define GLREADTEXIMAGEHELPER_H_
10 #include "GLContextTypes.h"
11 #include "mozilla/Attributes.h"
12 #include "nsSize.h"
13 #include "mozilla/RefPtr.h"
14 #include "mozilla/gfx/Types.h"
16 namespace mozilla {
18 namespace gfx {
19 class DataSourceSurface;
20 } // namespace gfx
22 namespace gl {
24 // Returns true if the `dest{Format,Type}` are the same as the
25 // `read{Format,Type}`.
26 bool GetActualReadFormats(GLContext* gl, GLenum destFormat, GLenum destType,
27 GLenum* out_readFormat, GLenum* out_readType);
29 void ReadPixelsIntoBuffer(GLContext* gl, uint8_t* aData, int32_t aStride,
30 const gfx::IntSize& aSize,
31 gfx::SurfaceFormat aFormat);
33 void ReadPixelsIntoDataSurface(GLContext* aGL,
34 gfx::DataSourceSurface* aSurface);
36 already_AddRefed<gfx::DataSourceSurface> ReadBackSurface(
37 GLContext* gl, GLuint aTexture, bool aYInvert, gfx::SurfaceFormat aFormat);
39 already_AddRefed<gfx::DataSourceSurface> YInvertImageSurface(
40 gfx::DataSourceSurface* aSurf, uint32_t aStride);
42 void SwapRAndBComponents(gfx::DataSourceSurface* surf);
44 class GLReadTexImageHelper final {
45 // The GLContext is the sole owner of the GLBlitHelper.
46 GLContext* mGL;
48 GLuint mPrograms[4];
50 GLuint TextureImageProgramFor(GLenum aTextureTarget, int aShader);
52 bool DidGLErrorOccur(const char* str);
54 public:
55 explicit GLReadTexImageHelper(GLContext* gl);
56 ~GLReadTexImageHelper();
58 /**
59 * Read the image data contained in aTexture, and return it as an
60 * ImageSurface. If GL_RGBA is given as the format, a
61 * SurfaceFormat::A8R8G8B8_UINT32 surface is returned. Not implemented yet: If
62 * GL_RGB is given as the format, a SurfaceFormat::X8R8G8B8_UINT32 surface is
63 * returned. If GL_LUMINANCE is given as the format, a SurfaceFormat::A8
64 * surface is returned.
66 * THIS IS EXPENSIVE. It is ridiculously expensive. Only do this
67 * if you absolutely positively must, and never in any performance
68 * critical path.
70 * NOTE: aShaderProgram is really mozilla::layers::ShaderProgramType. It is
71 * passed as int to eliminate including LayerManagerOGLProgram.h here.
73 already_AddRefed<gfx::DataSourceSurface> ReadTexImage(
74 GLuint aTextureId, GLenum aTextureTarget, const gfx::IntSize& aSize,
75 /* ShaderProgramType */ int aShaderProgram, bool aYInvert = false);
77 bool ReadTexImage(gfx::DataSourceSurface* aDest, GLuint aTextureId,
78 GLenum aTextureTarget, const gfx::IntSize& aSize,
79 int aShaderProgram, bool aYInvert = false);
82 } // namespace gl
83 } // namespace mozilla
85 #endif