Fix canvas and GL uses of DataSourceSurface::GetData. (bug 1405390 part 2, r=jgilbert)

--HG--
extra : rebase_source : eb4dcdfe9374e317a3a1e426bf35999ea50b074d
This commit is contained in:
David Anderson 2017-11-09 00:43:30 -08:00
parent 32e1584385
commit 3f697bb27d
3 changed files with 17 additions and 8 deletions

View File

@ -6015,6 +6015,7 @@ CanvasRenderingContext2D::PutImageData_explicit(int32_t aX, int32_t aY, uint32_t
return NS_ERROR_FAILURE;
}
DataSourceSurface::MappedSurface map;
RefPtr<DataSourceSurface> sourceSurface;
uint8_t* lockedBits = nullptr;
uint8_t* dstData;
@ -6036,11 +6037,15 @@ CanvasRenderingContext2D::PutImageData_explicit(int32_t aX, int32_t aY, uint32_t
if (!sourceSurface) {
return NS_ERROR_FAILURE;
}
dstData = sourceSurface->GetData();
if (!sourceSurface->Map(DataSourceSurface::READ_WRITE, &map)) {
return NS_ERROR_FAILURE;
}
dstData = map.mData;
if (!dstData) {
return NS_ERROR_OUT_OF_MEMORY;
}
dstStride = sourceSurface->Stride();
dstStride = map.mStride;
dstFormat = sourceSurface->GetFormat();
}
@ -6055,6 +6060,7 @@ CanvasRenderingContext2D::PutImageData_explicit(int32_t aX, int32_t aY, uint32_t
if (lockedBits) {
mTarget->ReleaseBits(lockedBits);
} else if (sourceSurface) {
sourceSurface->Unmap();
mTarget->CopySurface(sourceSurface, dirtyRect - dirtyRect.TopLeft(), dirtyRect.TopLeft());
}

View File

@ -390,8 +390,10 @@ ReadPixelsIntoDataSurface(GLContext* gl, DataSourceSurface* dest)
readSurf = tempSurf;
}
DataSourceSurface::ScopedMap map(readSurf, DataSourceSurface::READ_WRITE);
MOZ_ASSERT(readAlignment);
MOZ_ASSERT(reinterpret_cast<uintptr_t>(readSurf->GetData()) % readAlignment == 0);
MOZ_ASSERT(reinterpret_cast<uintptr_t>(map.GetData()) % readAlignment == 0);
GLsizei width = dest->GetSize().width;
GLsizei height = dest->GetSize().height;
@ -403,7 +405,7 @@ ReadPixelsIntoDataSurface(GLContext* gl, DataSourceSurface* dest)
gl->fReadPixels(0, 0,
width, height,
readFormat, readType,
readSurf->GetData());
map.GetData());
}
if (readSurf != dest) {
@ -475,7 +477,8 @@ ReadBackSurface(GLContext* gl, GLuint aTexture, bool aYInvert, SurfaceFormat aFo
gl->fPixelStorei(LOCAL_GL_PACK_ALIGNMENT, 4);
}
gl->fGetTexImage(LOCAL_GL_TEXTURE_2D, 0, LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_BYTE, surf->GetData());
DataSourceSurface::ScopedMap map(surf, DataSourceSurface::READ);
gl->fGetTexImage(LOCAL_GL_TEXTURE_2D, 0, LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_BYTE, map.GetData());
if (currentPackAlignment != 4) {
gl->fPixelStorei(LOCAL_GL_PACK_ALIGNMENT, currentPackAlignment);

View File

@ -539,10 +539,10 @@ UploadSurfaceToTexture(GLContext* gl,
GLenum aTextureUnit,
GLenum aTextureTarget)
{
int32_t stride = aSurface->Stride();
DataSourceSurface::ScopedMap map(aSurface, DataSourceSurface::READ);
int32_t stride = map.GetStride();
SurfaceFormat format = aSurface->GetFormat();
unsigned char* data = aSurface->GetData() +
unsigned char* data = map.GetData() +
DataOffset(aSrcPoint, stride, format);
return UploadImageDataToTexture(gl, data, stride, format,