mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-12 02:07:33 +09:00
Bug 1388020. r=nical, a=RyanVM
This commit is contained in:
parent
55bde34653
commit
e3e79721f6
6 changed files with 41 additions and 6 deletions
|
|
@ -27,6 +27,23 @@ DataOffset(const IntPoint& aPoint, int32_t aStride, SurfaceFormat aFormat)
|
|||
return data;
|
||||
}
|
||||
|
||||
static bool
|
||||
CheckUploadBounds(const IntSize& aDst, const IntSize& aSrc, const IntPoint& aOffset)
|
||||
{
|
||||
if (aOffset.x < 0 || aOffset.y < 0 ||
|
||||
aOffset.x >= aSrc.width ||
|
||||
aOffset.y >= aSrc.height) {
|
||||
MOZ_ASSERT_UNREACHABLE("Offset outside source bounds");
|
||||
return false;
|
||||
}
|
||||
if (aDst.width > (aSrc.width - aOffset.x) ||
|
||||
aDst.height > (aSrc.height - aOffset.y)) {
|
||||
MOZ_ASSERT_UNREACHABLE("Source has insufficient data");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static GLint GetAddressAlignment(ptrdiff_t aAddress)
|
||||
{
|
||||
if (!(aAddress & 0x7)) {
|
||||
|
|
@ -375,6 +392,7 @@ TexImage2DHelper(GLContext* gl,
|
|||
SurfaceFormat
|
||||
UploadImageDataToTexture(GLContext* gl,
|
||||
unsigned char* aData,
|
||||
const gfx::IntSize& aDataSize,
|
||||
int32_t aStride,
|
||||
SurfaceFormat aFormat,
|
||||
const nsIntRegion& aDstRegion,
|
||||
|
|
@ -498,6 +516,10 @@ UploadImageDataToTexture(GLContext* gl,
|
|||
// Upload each rect in the region to the texture
|
||||
for (auto iter = aDstRegion.RectIter(); !iter.Done(); iter.Next()) {
|
||||
const IntRect& rect = iter.Get();
|
||||
if (!CheckUploadBounds(rect.Size(), aDataSize, rect.TopLeft())) {
|
||||
return SurfaceFormat::UNKNOWN;
|
||||
}
|
||||
|
||||
const unsigned char* rectData =
|
||||
aData + DataOffset(rect.TopLeft(), aStride, aFormat);
|
||||
|
||||
|
|
@ -534,10 +556,17 @@ UploadSurfaceToTexture(GLContext* gl,
|
|||
|
||||
int32_t stride = aSurface->Stride();
|
||||
SurfaceFormat format = aSurface->GetFormat();
|
||||
gfx::IntSize size = aSurface->GetSize();
|
||||
if (!CheckUploadBounds(aSize, size, aSrcPoint)) {
|
||||
return SurfaceFormat::UNKNOWN;
|
||||
}
|
||||
|
||||
unsigned char* data = aSurface->GetData() +
|
||||
DataOffset(aSrcPoint, stride, format);
|
||||
size.width -= aSrcPoint.x;
|
||||
size.height -= aSrcPoint.y;
|
||||
|
||||
return UploadImageDataToTexture(gl, data, stride, format,
|
||||
return UploadImageDataToTexture(gl, data, size, stride, format,
|
||||
aDstRegion, aTexture, aSize,
|
||||
aOutUploadSize, aNeedInit,
|
||||
aTextureUnit, aTextureTarget);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue