bool ISurfaceAllocator::AllocSurfaceDescriptorWithCaps(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { bool tryPlatformSurface = true; #ifdef DEBUG tryPlatformSurface = !PR_GetEnv("MOZ_LAYERS_FORCE_SHMEM_SURFACES"); #endif if (tryPlatformSurface && PlatformAllocSurfaceDescriptor(aSize, aContent, aCaps, aBuffer)) { return true; } if (XRE_GetProcessType() == GoannaProcessType_Default) { gfxImageFormat format = gfxPlatform::GetPlatform()->OptimalFormatForContent(aContent); int32_t stride = gfxASurface::FormatStrideForWidth(format, aSize.width); uint8_t *data = new uint8_t[stride * aSize.height]; memset(data, 0, stride * aSize.height); *aBuffer = MemoryImage((uintptr_t)data, aSize, stride, format); return true; } nsRefPtr<gfxSharedImageSurface> buffer; if (!AllocSharedImageSurface(aSize, aContent, getter_AddRefs(buffer))) { return false; } *aBuffer = buffer->GetShmem(); return true; }
bool ISurfaceAllocator::AllocSurfaceDescriptorWithCaps(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { bool tryPlatformSurface = true; #ifdef DEBUG tryPlatformSurface = !PR_GetEnv("MOZ_LAYERS_FORCE_SHMEM_SURFACES"); #endif if (tryPlatformSurface && PlatformAllocSurfaceDescriptor(aSize, aContent, aCaps, aBuffer)) { return true; } if (XRE_GetProcessType() == GeckoProcessType_Default) { gfxImageFormat format = gfxPlatform::GetPlatform()->OptimalFormatForContent(aContent); int32_t stride = gfxASurface::FormatStrideForWidth(format, aSize.width); uint8_t *data = new (std::nothrow) uint8_t[stride * aSize.height]; if (!data) { return false; } #ifdef XP_MACOSX // Workaround a bug in Quartz where drawing an a8 surface to another a8 // surface with OPERATOR_SOURCE still requires the destination to be clear. if (format == gfxASurface::ImageFormatA8) { memset(data, 0, stride * aSize.height); } #endif *aBuffer = MemoryImage((uintptr_t)data, aSize, stride, format); return true; } nsRefPtr<gfxSharedImageSurface> buffer; if (!AllocSharedImageSurface(aSize, aContent, getter_AddRefs(buffer))) { return false; } *aBuffer = buffer->GetShmem(); return true; }
bool ISurfaceAllocator::AllocSurfaceDescriptorWithCaps(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { bool tryPlatformSurface = true; #ifdef DEBUG tryPlatformSurface = !PR_GetEnv("MOZ_LAYERS_FORCE_SHMEM_SURFACES"); #endif if (tryPlatformSurface && PlatformAllocSurfaceDescriptor(aSize, aContent, aCaps, aBuffer)) { return true; } nsRefPtr<gfxSharedImageSurface> buffer; if (!AllocSharedImageSurface(aSize, aContent, getter_AddRefs(buffer))) { return false; } *aBuffer = buffer->GetShmem(); return true; }