summaryrefslogtreecommitdiff
path: root/gfx/2d/Tools.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/2d/Tools.h')
-rw-r--r--gfx/2d/Tools.h246
1 files changed, 0 insertions, 246 deletions
diff --git a/gfx/2d/Tools.h b/gfx/2d/Tools.h
deleted file mode 100644
index 585cbbb2c..000000000
--- a/gfx/2d/Tools.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C++; tab-width: 20; 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_GFX_TOOLS_H_
-#define MOZILLA_GFX_TOOLS_H_
-
-#include "mozilla/CheckedInt.h"
-#include "mozilla/Move.h"
-#include "mozilla/TypeTraits.h"
-#include "Types.h"
-#include "Point.h"
-#include <math.h>
-
-namespace mozilla {
-namespace gfx {
-
-static inline bool
-IsOperatorBoundByMask(CompositionOp aOp) {
- switch (aOp) {
- case CompositionOp::OP_IN:
- case CompositionOp::OP_OUT:
- case CompositionOp::OP_DEST_IN:
- case CompositionOp::OP_DEST_ATOP:
- case CompositionOp::OP_SOURCE:
- return false;
- default:
- return true;
- }
-}
-
-template <class T>
-struct ClassStorage
-{
- char bytes[sizeof(T)];
-
- const T *addr() const { return (const T *)bytes; }
- T *addr() { return (T *)(void *)bytes; }
-};
-
-static inline bool
-FuzzyEqual(Float aA, Float aB, Float aErr)
-{
- if ((aA + aErr >= aB) && (aA - aErr <= aB)) {
- return true;
- }
- return false;
-}
-
-static inline void
-NudgeToInteger(float *aVal)
-{
- float r = floorf(*aVal + 0.5f);
- // The error threshold should be proportional to the rounded value. This
- // bounds the relative error introduced by the nudge operation. However,
- // when the rounded value is 0, the error threshold can't be proportional
- // to the rounded value (we'd never round), so we just choose the same
- // threshold as for a rounded value of 1.
- if (FuzzyEqual(r, *aVal, r == 0.0f ? 1e-6f : fabs(r*1e-6f))) {
- *aVal = r;
- }
-}
-
-static inline void
-NudgeToInteger(float *aVal, float aErr)
-{
- float r = floorf(*aVal + 0.5f);
- if (FuzzyEqual(r, *aVal, aErr)) {
- *aVal = r;
- }
-}
-
-static inline Float
-Distance(Point aA, Point aB)
-{
- return hypotf(aB.x - aA.x, aB.y - aA.y);
-}
-
-static inline int
-BytesPerPixel(SurfaceFormat aFormat)
-{
- switch (aFormat) {
- case SurfaceFormat::A8:
- return 1;
- case SurfaceFormat::R5G6B5_UINT16:
- return 2;
- case SurfaceFormat::R8G8B8:
- case SurfaceFormat::B8G8R8:
- return 3;
- case SurfaceFormat::HSV:
- case SurfaceFormat::Lab:
- return 3 * sizeof(float);
- case SurfaceFormat::Depth:
- return sizeof(uint16_t);
- default:
- return 4;
- }
-}
-
-static inline bool
-IsOpaqueFormat(SurfaceFormat aFormat) {
- switch (aFormat) {
- case SurfaceFormat::B8G8R8X8:
- case SurfaceFormat::R8G8B8X8:
- case SurfaceFormat::X8R8G8B8:
- case SurfaceFormat::YUV:
- case SurfaceFormat::NV12:
- case SurfaceFormat::YUV422:
- case SurfaceFormat::R5G6B5_UINT16:
- return true;
- default:
- return false;
- }
-}
-
-template<typename T, int alignment = 16>
-struct AlignedArray
-{
- typedef T value_type;
-
- AlignedArray()
- : mPtr(nullptr)
- , mStorage(nullptr)
- {
- }
-
- explicit MOZ_ALWAYS_INLINE AlignedArray(size_t aCount, bool aZero = false)
- : mStorage(nullptr)
- , mCount(0)
- {
- Realloc(aCount, aZero);
- }
-
- MOZ_ALWAYS_INLINE ~AlignedArray()
- {
- Dealloc();
- }
-
- void Dealloc()
- {
- // If we fail this assert we'll need to uncomment the loop below to make
- // sure dtors are properly invoked. If we do that, we should check that the
- // comment about compiler dead code elimination is in fact true for all the
- // compilers that we care about.
- static_assert(mozilla::IsPod<T>::value,
- "Destructors must be invoked for this type");
-#if 0
- for (size_t i = 0; i < mCount; ++i) {
- // Since we used the placement |operator new| function to construct the
- // elements of this array we need to invoke their destructors manually.
- // For types where the destructor does nothing the compiler's dead code
- // elimination step should optimize this loop away.
- mPtr[i].~T();
- }
-#endif
-
- free(mStorage);
- mStorage = nullptr;
- mPtr = nullptr;
- }
-
- MOZ_ALWAYS_INLINE void Realloc(size_t aCount, bool aZero = false)
- {
- free(mStorage);
- CheckedInt32 storageByteCount =
- CheckedInt32(sizeof(T)) * aCount + (alignment - 1);
- if (!storageByteCount.isValid()) {
- mStorage = nullptr;
- mPtr = nullptr;
- mCount = 0;
- return;
- }
- // We don't create an array of T here, since we don't want ctors to be
- // invoked at the wrong places if we realign below.
- if (aZero) {
- // calloc can be more efficient than new[] for large chunks,
- // so we use calloc/malloc/free for everything.
- mStorage = static_cast<uint8_t *>(calloc(1, storageByteCount.value()));
- } else {
- mStorage = static_cast<uint8_t *>(malloc(storageByteCount.value()));
- }
- if (!mStorage) {
- mStorage = nullptr;
- mPtr = nullptr;
- mCount = 0;
- return;
- }
- if (uintptr_t(mStorage) % alignment) {
- // Our storage does not start at a <alignment>-byte boundary. Make sure mPtr does!
- mPtr = (T*)(uintptr_t(mStorage) + alignment - (uintptr_t(mStorage) % alignment));
- } else {
- mPtr = (T*)(mStorage);
- }
- // Now that mPtr is pointing to the aligned position we can use placement
- // |operator new| to invoke any ctors at the correct positions. For types
- // that have a no-op default constructor the compiler's dead code
- // elimination step should optimize this away.
- mPtr = new (mPtr) T[aCount];
- mCount = aCount;
- }
-
- void Swap(AlignedArray<T, alignment>& aOther)
- {
- mozilla::Swap(mPtr, aOther.mPtr);
- mozilla::Swap(mStorage, aOther.mStorage);
- mozilla::Swap(mCount, aOther.mCount);
- }
-
- MOZ_ALWAYS_INLINE operator T*()
- {
- return mPtr;
- }
-
- T *mPtr;
-
-private:
- uint8_t *mStorage;
- size_t mCount;
-};
-
-/**
- * Returns aWidth * aBytesPerPixel increased, if necessary, so that it divides
- * exactly into |alignment|.
- *
- * Note that currently |alignment| must be a power-of-2. If for some reason we
- * want to support NPOT alignment we can revert back to this functions old
- * implementation.
- */
-template<int alignment>
-int32_t GetAlignedStride(int32_t aWidth, int32_t aBytesPerPixel)
-{
- static_assert(alignment > 0 && (alignment & (alignment-1)) == 0,
- "This implementation currently require power-of-two alignment");
- const int32_t mask = alignment - 1;
- CheckedInt32 stride = CheckedInt32(aWidth) * CheckedInt32(aBytesPerPixel) + CheckedInt32(mask);
- if (stride.isValid()) {
- return stride.value() & ~mask;
- }
- return 0;
-}
-
-} // namespace gfx
-} // namespace mozilla
-
-#endif /* MOZILLA_GFX_TOOLS_H_ */