khPresenceMaskWriter::~khPresenceMaskWriter(void) { uint32 presenceBufferOffset = DataOffset(); uint32 totalFileSize = TotalFileSize(); uchar *filebuf = static_cast<uchar*>(munmapper.buffer()); // write header PresenceHeader *header = new(filebuf) PresenceHeader(presence.numLevels, totalFileSize); header->HostToLittleEndian(); PresenceLevelRecord *lrec = reinterpret_cast<PresenceLevelRecord*>(header + 1); for (uint i = 0; i < NumFusionLevels; ++i) { if (presence.levels[i]) { // write the level header rec (void) new(lrec) PresenceLevelRecord(presenceBufferOffset, *presence.levels[i]); lrec->HostToLittleEndian(); ++lrec; // write the level's presence buffer memcpy(filebuf + presenceBufferOffset, &presence.levels[i]->buf[0], presence.levels[i]->BufferSize()); presenceBufferOffset += presence.levels[i]->BufferSize(); } } // munmapper's destructor will call msync and munmap // geTmpLocalFile's destructor will take copy the file to its real path. }
TUint E32ImageFile::BssOffset() // // return the offset from the start of code where the bss is linked // { return DataOffset()+iHdr->iDataSize; }
uint32 khPresenceMaskWriter::TotalFileSize(void) { uint32 totalFileSize = DataOffset(); for (uint i = 0; i < NumFusionLevels; ++i) { if (presence.levels[i]) { totalFileSize += presence.levels[i]->BufferSize(); } } return totalFileSize; }
std::vector<BYTE> kjm::eventlog_record::Data() { std::vector<BYTE> data( DataLength() ); for ( int i = 0; i < data.size(); i++) { data.at( i ) = *(((unsigned char *)getRaw()) + DataOffset() + i); } return data; }
SurfaceFormat UploadSurfaceToTexture(GLContext* gl, gfxASurface *aSurface, const nsIntRegion& aDstRegion, GLuint& aTexture, bool aOverwrite, const nsIntPoint& aSrcPoint, bool aPixelBuffer, GLenum aTextureUnit, GLenum aTextureTarget) { nsRefPtr<gfxImageSurface> imageSurface = aSurface->GetAsImageSurface(); unsigned char* data = nullptr; if (!imageSurface || (imageSurface->Format() != gfxImageFormatARGB32 && imageSurface->Format() != gfxImageFormatRGB24 && imageSurface->Format() != gfxImageFormatRGB16_565 && imageSurface->Format() != gfxImageFormatA8)) { // We can't get suitable pixel data for the surface, make a copy nsIntRect bounds = aDstRegion.GetBounds(); imageSurface = new gfxImageSurface(gfxIntSize(bounds.width, bounds.height), gfxImageFormatARGB32); nsRefPtr<gfxContext> context = new gfxContext(imageSurface); context->Translate(-gfxPoint(aSrcPoint.x, aSrcPoint.y)); context->SetSource(aSurface); context->Paint(); data = imageSurface->Data(); NS_ASSERTION(!aPixelBuffer, "Must be using an image compatible surface with pixel buffers!"); } else { // If a pixel buffer is bound the data pointer parameter is relative // to the start of the data block. if (!aPixelBuffer) { data = imageSurface->Data(); } data += DataOffset(aSrcPoint, imageSurface->Stride(), imageSurface->Format()); } MOZ_ASSERT(imageSurface); imageSurface->Flush(); return UploadImageDataToTexture(gl, data, imageSurface->Stride(), imageSurface->Format(), aDstRegion, aTexture, aOverwrite, aPixelBuffer, aTextureUnit, aTextureTarget); }
SurfaceFormat UploadSurfaceToTexture(GLContext* gl, DataSourceSurface *aSurface, const nsIntRegion& aDstRegion, GLuint& aTexture, bool aOverwrite, const nsIntPoint& aSrcPoint, bool aPixelBuffer, GLenum aTextureUnit, GLenum aTextureTarget) { unsigned char* data = aPixelBuffer ? nullptr : aSurface->GetData(); int32_t stride = aSurface->Stride(); SurfaceFormat format = aSurface->GetFormat(); data += DataOffset(aSrcPoint, stride, format); return UploadImageDataToTexture(gl, data, stride, format, aDstRegion, aTexture, aOverwrite, aPixelBuffer, aTextureUnit, aTextureTarget); }
SurfaceFormat UploadSurfaceToTexture(GLContext* gl, DataSourceSurface* aSurface, const nsIntRegion& aDstRegion, GLuint aTexture, const gfx::IntSize& aSize, size_t* aOutUploadSize, bool aNeedInit, const gfx::IntPoint& aSrcPoint, GLenum aTextureUnit, GLenum aTextureTarget) { int32_t stride = aSurface->Stride(); SurfaceFormat format = aSurface->GetFormat(); unsigned char* data = aSurface->GetData() + DataOffset(aSrcPoint, stride, format); return UploadImageDataToTexture(gl, data, stride, format, aDstRegion, aTexture, aSize, aOutUploadSize, aNeedInit, aTextureUnit, aTextureTarget); }
SurfaceFormat UploadImageDataToTexture(GLContext* gl, unsigned char* aData, int32_t aStride, gfxImageFormat aFormat, const nsIntRegion& aDstRegion, GLuint& aTexture, bool aOverwrite, bool aPixelBuffer, GLenum aTextureUnit, GLenum aTextureTarget) { bool textureInited = aOverwrite ? false : true; gl->MakeCurrent(); gl->fActiveTexture(aTextureUnit); if (!aTexture) { gl->fGenTextures(1, &aTexture); gl->fBindTexture(aTextureTarget, aTexture); gl->fTexParameteri(aTextureTarget, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_LINEAR); gl->fTexParameteri(aTextureTarget, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_LINEAR); gl->fTexParameteri(aTextureTarget, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE); gl->fTexParameteri(aTextureTarget, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE); textureInited = false; } else { gl->fBindTexture(aTextureTarget, aTexture); } nsIntRegion paintRegion; if (!textureInited) { paintRegion = nsIntRegion(aDstRegion.GetBounds()); } else { paintRegion = aDstRegion; } GLenum format; GLenum internalFormat; GLenum type; int32_t pixelSize = gfxASurface::BytePerPixelFromFormat(aFormat); SurfaceFormat surfaceFormat; MOZ_ASSERT(gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA || gl->GetPreferredARGB32Format() == LOCAL_GL_RGBA); switch (aFormat) { case gfxImageFormatARGB32: if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { format = LOCAL_GL_BGRA; surfaceFormat = gfx::FORMAT_R8G8B8A8; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; } else { format = LOCAL_GL_RGBA; surfaceFormat = gfx::FORMAT_B8G8R8A8; type = LOCAL_GL_UNSIGNED_BYTE; } internalFormat = LOCAL_GL_RGBA; break; case gfxImageFormatRGB24: // Treat RGB24 surfaces as RGBA32 except for the surface // format used. if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { format = LOCAL_GL_BGRA; surfaceFormat = gfx::FORMAT_R8G8B8X8; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; } else { format = LOCAL_GL_RGBA; surfaceFormat = gfx::FORMAT_B8G8R8X8; type = LOCAL_GL_UNSIGNED_BYTE; } internalFormat = LOCAL_GL_RGBA; break; case gfxImageFormatRGB16_565: internalFormat = format = LOCAL_GL_RGB; type = LOCAL_GL_UNSIGNED_SHORT_5_6_5; surfaceFormat = gfx::FORMAT_R5G6B5; break; case gfxImageFormatA8: internalFormat = format = LOCAL_GL_LUMINANCE; type = LOCAL_GL_UNSIGNED_BYTE; // We don't have a specific luminance shader surfaceFormat = gfx::FORMAT_A8; break; default: NS_ASSERTION(false, "Unhandled image surface format!"); format = 0; type = 0; surfaceFormat = gfx::FORMAT_UNKNOWN; } nsIntRegionRectIterator iter(paintRegion); const nsIntRect *iterRect; // Top left point of the region's bounding rectangle. nsIntPoint topLeft = paintRegion.GetBounds().TopLeft(); while ((iterRect = iter.Next())) { // The inital data pointer is at the top left point of the region's // bounding rectangle. We need to find the offset of this rect // within the region and adjust the data pointer accordingly. unsigned char *rectData = aData + DataOffset(iterRect->TopLeft() - topLeft, aStride, aFormat); NS_ASSERTION(textureInited || (iterRect->x == 0 && iterRect->y == 0), "Must be uploading to the origin when we don't have an existing texture"); if (textureInited && CanUploadSubTextures(gl)) { TexSubImage2DHelper(gl, aTextureTarget, 0, iterRect->x, iterRect->y, iterRect->width, iterRect->height, aStride, pixelSize, format, type, rectData); } else { TexImage2DHelper(gl, aTextureTarget, 0, internalFormat, iterRect->width, iterRect->height, aStride, pixelSize, 0, format, type, rectData); } } return surfaceFormat; }
SurfaceFormat UploadImageDataToTexture(GLContext* gl, unsigned char* aData, int32_t aStride, SurfaceFormat aFormat, const nsIntRegion& aDstRegion, GLuint aTexture, const gfx::IntSize& aSize, size_t* aOutUploadSize, bool aNeedInit, GLenum aTextureUnit, GLenum aTextureTarget) { gl->MakeCurrent(); gl->fActiveTexture(aTextureUnit); gl->fBindTexture(aTextureTarget, aTexture); GLenum format = 0; GLenum internalFormat = 0; GLenum type = 0; int32_t pixelSize = BytesPerPixel(aFormat); SurfaceFormat surfaceFormat = gfx::SurfaceFormat::UNKNOWN; MOZ_ASSERT(gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA || gl->GetPreferredARGB32Format() == LOCAL_GL_RGBA); switch (aFormat) { case SurfaceFormat::B8G8R8A8: if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { format = LOCAL_GL_BGRA; surfaceFormat = SurfaceFormat::R8G8B8A8; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; } else { format = LOCAL_GL_RGBA; surfaceFormat = SurfaceFormat::B8G8R8A8; type = LOCAL_GL_UNSIGNED_BYTE; } internalFormat = LOCAL_GL_RGBA; break; case SurfaceFormat::B8G8R8X8: // Treat BGRX surfaces as BGRA except for the surface // format used. if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { format = LOCAL_GL_BGRA; surfaceFormat = SurfaceFormat::R8G8B8X8; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; } else { format = LOCAL_GL_RGBA; surfaceFormat = SurfaceFormat::B8G8R8X8; type = LOCAL_GL_UNSIGNED_BYTE; } internalFormat = LOCAL_GL_RGBA; break; case SurfaceFormat::R8G8B8A8: if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { // Upload our RGBA as BGRA, but store that the uploaded format is // BGRA. (sample from R to get B) format = LOCAL_GL_BGRA; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; surfaceFormat = SurfaceFormat::B8G8R8A8; } else { format = LOCAL_GL_RGBA; type = LOCAL_GL_UNSIGNED_BYTE; surfaceFormat = SurfaceFormat::R8G8B8A8; } internalFormat = LOCAL_GL_RGBA; break; case SurfaceFormat::R8G8B8X8: // Treat RGBX surfaces as RGBA except for the surface // format used. if (gl->GetPreferredARGB32Format() == LOCAL_GL_BGRA) { format = LOCAL_GL_BGRA; type = LOCAL_GL_UNSIGNED_INT_8_8_8_8_REV; surfaceFormat = SurfaceFormat::B8G8R8X8; } else { format = LOCAL_GL_RGBA; type = LOCAL_GL_UNSIGNED_BYTE; surfaceFormat = SurfaceFormat::R8G8B8X8; } internalFormat = LOCAL_GL_RGBA; break; case SurfaceFormat::R5G6B5_UINT16: internalFormat = format = LOCAL_GL_RGB; type = LOCAL_GL_UNSIGNED_SHORT_5_6_5; surfaceFormat = SurfaceFormat::R5G6B5_UINT16; break; case SurfaceFormat::A8: internalFormat = format = LOCAL_GL_LUMINANCE; type = LOCAL_GL_UNSIGNED_BYTE; // We don't have a specific luminance shader surfaceFormat = SurfaceFormat::A8; break; default: NS_ASSERTION(false, "Unhandled image surface format!"); } if (aOutUploadSize) { *aOutUploadSize = 0; } if (aNeedInit || !CanUploadSubTextures(gl)) { // If the texture needs initialized, or we are unable to // upload sub textures, then initialize and upload the entire // texture. TexImage2DHelper(gl, aTextureTarget, 0, internalFormat, aSize.width, aSize.height, aStride, pixelSize, 0, format, type, aData); if (aOutUploadSize && aNeedInit) { uint32_t texelSize = GetBytesPerTexel(internalFormat, type); size_t numTexels = size_t(aSize.width) * size_t(aSize.height); *aOutUploadSize += texelSize * numTexels; } } else { // Upload each rect in the region to the texture for (auto iter = aDstRegion.RectIter(); !iter.Done(); iter.Next()) { const IntRect& rect = iter.Get(); const unsigned char* rectData = aData + DataOffset(rect.TopLeft(), aStride, aFormat); TexSubImage2DHelper(gl, aTextureTarget, 0, rect.x, rect.y, rect.Width(), rect.Height(), aStride, pixelSize, format, type, rectData); } } return surfaceFormat; }