michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef _MOZILLA_GFX_IMAGESCALING_H michael@0: #define _MOZILLA_GFX_IMAGESCALING_H michael@0: michael@0: #include "Types.h" michael@0: michael@0: #include michael@0: #include "Point.h" michael@0: michael@0: namespace mozilla { michael@0: namespace gfx { michael@0: michael@0: class ImageHalfScaler michael@0: { michael@0: public: michael@0: ImageHalfScaler(uint8_t *aData, int32_t aStride, const IntSize &aSize) michael@0: : mOrigData(aData), mOrigStride(aStride), mOrigSize(aSize) michael@0: , mDataStorage(nullptr) michael@0: { michael@0: } michael@0: michael@0: ~ImageHalfScaler() michael@0: { michael@0: delete [] mDataStorage; michael@0: } michael@0: michael@0: void ScaleForSize(const IntSize &aSize); michael@0: michael@0: uint8_t *GetScaledData() const { return mData; } michael@0: IntSize GetSize() const { return mSize; } michael@0: uint32_t GetStride() const { return mStride; } michael@0: michael@0: private: michael@0: void HalfImage2D(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageVertical(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageHorizontal(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: michael@0: // This is our SSE2 scaling function. Our destination must always be 16-byte michael@0: // aligned and use a 16-byte aligned stride. michael@0: void HalfImage2D_SSE2(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageVertical_SSE2(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageHorizontal_SSE2(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: michael@0: void HalfImage2D_C(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageVertical_C(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: void HalfImageHorizontal_C(uint8_t *aSource, int32_t aSourceStride, const IntSize &aSourceSize, michael@0: uint8_t *aDest, uint32_t aDestStride); michael@0: michael@0: uint8_t *mOrigData; michael@0: int32_t mOrigStride; michael@0: IntSize mOrigSize; michael@0: michael@0: uint8_t *mDataStorage; michael@0: // Guaranteed 16-byte aligned michael@0: uint8_t *mData; michael@0: IntSize mSize; michael@0: // Guaranteed 16-byte aligned michael@0: uint32_t mStride; michael@0: }; michael@0: michael@0: } michael@0: } michael@0: michael@0: #endif