summaryrefslogtreecommitdiffstats
path: root/image/SurfaceFlags.h
diff options
context:
space:
mode:
Diffstat (limited to 'image/SurfaceFlags.h')
-rw-r--r--image/SurfaceFlags.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/image/SurfaceFlags.h b/image/SurfaceFlags.h
new file mode 100644
index 0000000000..a494ea15ff
--- /dev/null
+++ b/image/SurfaceFlags.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_image_SurfaceFlags_h
+#define mozilla_image_SurfaceFlags_h
+
+#include "imgIContainer.h"
+#include "mozilla/TypedEnumBits.h"
+
+namespace mozilla {
+namespace image {
+
+/**
+ * Flags that change the output a decoder generates. Because different
+ * combinations of these flags result in logically different surfaces, these
+ * flags must be taken into account in SurfaceCache lookups.
+ */
+enum class SurfaceFlags : uint8_t {
+ NO_PREMULTIPLY_ALPHA = 1 << 0,
+ NO_COLORSPACE_CONVERSION = 1 << 1,
+ TO_SRGB_COLORSPACE = 1 << 2,
+ RECORD_BLOB = 1 << 3,
+};
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(SurfaceFlags)
+
+/**
+ * @return the default set of surface flags.
+ */
+inline SurfaceFlags DefaultSurfaceFlags() { return SurfaceFlags(); }
+
+/**
+ * Given a set of imgIContainer FLAG_* flags, returns a set of SurfaceFlags with
+ * the corresponding flags set.
+ */
+inline SurfaceFlags ToSurfaceFlags(uint32_t aFlags) {
+ SurfaceFlags flags = DefaultSurfaceFlags();
+ if (aFlags & imgIContainer::FLAG_DECODE_NO_PREMULTIPLY_ALPHA) {
+ flags |= SurfaceFlags::NO_PREMULTIPLY_ALPHA;
+ }
+ if (aFlags & imgIContainer::FLAG_DECODE_NO_COLORSPACE_CONVERSION) {
+ flags |= SurfaceFlags::NO_COLORSPACE_CONVERSION;
+ }
+ if (aFlags & imgIContainer::FLAG_DECODE_TO_SRGB_COLORSPACE) {
+ flags |= SurfaceFlags::TO_SRGB_COLORSPACE;
+ }
+ if (aFlags & imgIContainer::FLAG_RECORD_BLOB) {
+ flags |= SurfaceFlags::RECORD_BLOB;
+ }
+ return flags;
+}
+
+/**
+ * Given a set of SurfaceFlags, returns a set of imgIContainer FLAG_* flags with
+ * the corresponding flags set.
+ */
+inline uint32_t FromSurfaceFlags(SurfaceFlags aFlags) {
+ uint32_t flags = imgIContainer::DECODE_FLAGS_DEFAULT;
+ if (aFlags & SurfaceFlags::NO_PREMULTIPLY_ALPHA) {
+ flags |= imgIContainer::FLAG_DECODE_NO_PREMULTIPLY_ALPHA;
+ }
+ if (aFlags & SurfaceFlags::NO_COLORSPACE_CONVERSION) {
+ flags |= imgIContainer::FLAG_DECODE_NO_COLORSPACE_CONVERSION;
+ }
+ if (aFlags & SurfaceFlags::TO_SRGB_COLORSPACE) {
+ flags |= imgIContainer::FLAG_DECODE_TO_SRGB_COLORSPACE;
+ }
+ if (aFlags & SurfaceFlags::RECORD_BLOB) {
+ flags |= imgIContainer::FLAG_RECORD_BLOB;
+ }
+ return flags;
+}
+
+} // namespace image
+} // namespace mozilla
+
+#endif // mozilla_image_SurfaceFlags_h