Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/canvas/TexUnpackBlob.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6
#ifndef TEX_UNPACK_BLOB_H_
7
#define TEX_UNPACK_BLOB_H_
8
9
#include "GLContextTypes.h"
10
#include "mozilla/RefPtr.h"
11
#include "WebGLStrongTypes.h"
12
#include "WebGLTypes.h"
13
14
15
namespace mozilla {
16
17
class UniqueBuffer;
18
class WebGLContext;
19
class WebGLTexture;
20
21
namespace dom {
22
class Element;
23
class HTMLCanvasElement;
24
class HTMLVideoElement;
25
} // namespace dom
26
27
namespace gfx {
28
class DataSourceSurface;
29
} // namespace gfx
30
31
namespace layers {
32
class Image;
33
class ImageContainer;
34
} // namespace layers
35
36
namespace webgl {
37
38
struct PackingInfo;
39
struct DriverUnpackInfo;
40
41
class TexUnpackBlob
42
{
43
public:
44
    const uint32_t mAlignment;
45
    const uint32_t mRowLength;
46
    const uint32_t mImageHeight;
47
    const uint32_t mSkipPixels;
48
    const uint32_t mSkipRows;
49
    const uint32_t mSkipImages;
50
    const uint32_t mWidth;
51
    const uint32_t mHeight;
52
    const uint32_t mDepth;
53
54
    const gfxAlphaType mSrcAlphaType;
55
56
    bool mNeedsExactUpload;
57
58
protected:
59
    TexUnpackBlob(const WebGLContext* webgl, TexImageTarget target, uint32_t rowLength,
60
                  uint32_t width, uint32_t height, uint32_t depth,
61
                  gfxAlphaType srcAlphaType);
62
63
public:
64
0
    virtual ~TexUnpackBlob() { }
65
66
protected:
67
    bool ConvertIfNeeded(WebGLContext* webgl,
68
                         const uint32_t rowLength, const uint32_t rowCount,
69
                         WebGLTexelFormat srcFormat,
70
                         const uint8_t* const srcBegin, const ptrdiff_t srcStride,
71
                         WebGLTexelFormat dstFormat, const ptrdiff_t dstStride,
72
73
                         const uint8_t** const out_begin,
74
                         UniqueBuffer* const out_anchoredBuffer) const;
75
76
public:
77
0
    virtual bool HasData() const { return true; }
78
79
    virtual bool Validate(WebGLContext* webgl, const webgl::PackingInfo& pi) = 0;
80
81
    // Returns false when we've generated a WebGL error.
82
    // Returns true but with a non-zero *out_error if we still need to generate a WebGL
83
    // error.
84
    virtual bool TexOrSubImage(bool isSubImage, bool needsRespec,
85
                               WebGLTexture* tex, TexImageTarget target, GLint level,
86
                               const webgl::DriverUnpackInfo* dui, GLint xOffset,
87
                               GLint yOffset, GLint zOffset,
88
                               const webgl::PackingInfo& pi, GLenum* const out_error) const = 0;
89
};
90
91
class TexUnpackBytes final : public TexUnpackBlob
92
{
93
public:
94
    const bool mIsClientData;
95
    const uint8_t* const mPtr;
96
    const size_t mAvailBytes;
97
98
    TexUnpackBytes(const WebGLContext* webgl, TexImageTarget target, uint32_t width,
99
                   uint32_t height, uint32_t depth, bool isClientData, const uint8_t* ptr,
100
                   size_t availBytes);
101
102
0
    virtual bool HasData() const override { return !mIsClientData || bool(mPtr); }
103
104
    virtual bool Validate(WebGLContext* webgl,
105
                          const webgl::PackingInfo& pi) override;
106
    virtual bool TexOrSubImage(bool isSubImage, bool needsRespec,
107
                               WebGLTexture* tex, TexImageTarget target, GLint level,
108
                               const webgl::DriverUnpackInfo* dui, GLint xOffset,
109
                               GLint yOffset, GLint zOffset,
110
                               const webgl::PackingInfo& pi, GLenum* const out_error) const override;
111
};
112
113
class TexUnpackImage final : public TexUnpackBlob
114
{
115
public:
116
    const RefPtr<layers::Image> mImage;
117
118
    TexUnpackImage(const WebGLContext* webgl, TexImageTarget target, uint32_t width,
119
                   uint32_t height, uint32_t depth, layers::Image* image,
120
                   gfxAlphaType srcAlphaType);
121
122
    ~TexUnpackImage(); // Prevent needing to define layers::Image in the header.
123
124
    virtual bool Validate(WebGLContext* webgl,
125
                          const webgl::PackingInfo& pi) override;
126
    virtual bool TexOrSubImage(bool isSubImage, bool needsRespec,
127
                               WebGLTexture* tex, TexImageTarget target, GLint level,
128
                               const webgl::DriverUnpackInfo* dui, GLint xOffset,
129
                               GLint yOffset, GLint zOffset,
130
                               const webgl::PackingInfo& dstPI, GLenum* const out_error)  const override;
131
};
132
133
class TexUnpackSurface final : public TexUnpackBlob
134
{
135
public:
136
    const RefPtr<gfx::DataSourceSurface> mSurf;
137
138
    TexUnpackSurface(const WebGLContext* webgl, TexImageTarget target, uint32_t width,
139
                     uint32_t height, uint32_t depth, gfx::DataSourceSurface* surf,
140
                     gfxAlphaType srcAlphaType);
141
142
    virtual bool Validate(WebGLContext* webgl,
143
                          const webgl::PackingInfo& pi) override;
144
    virtual bool TexOrSubImage(bool isSubImage, bool needsRespec,
145
                               WebGLTexture* tex, TexImageTarget target, GLint level,
146
                               const webgl::DriverUnpackInfo* dui, GLint xOffset,
147
                               GLint yOffset, GLint zOffset,
148
                               const webgl::PackingInfo& dstPI, GLenum* const out_error) const override;
149
};
150
151
} // namespace webgl
152
} // namespace mozilla
153
154
#endif // TEX_UNPACK_BLOB_H_