1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/2d/FilterProcessing.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,224 @@ 1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "FilterProcessing.h" 1.10 + 1.11 +namespace mozilla { 1.12 +namespace gfx { 1.13 + 1.14 +TemporaryRef<DataSourceSurface> 1.15 +FilterProcessing::ExtractAlpha(DataSourceSurface* aSource) 1.16 +{ 1.17 + IntSize size = aSource->GetSize(); 1.18 + RefPtr<DataSourceSurface> alpha = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8); 1.19 + uint8_t* sourceData = aSource->GetData(); 1.20 + int32_t sourceStride = aSource->Stride(); 1.21 + uint8_t* alphaData = alpha->GetData(); 1.22 + int32_t alphaStride = alpha->Stride(); 1.23 + 1.24 + if (Factory::HasSSE2()) { 1.25 +#ifdef USE_SSE2 1.26 + ExtractAlpha_SSE2(size, sourceData, sourceStride, alphaData, alphaStride); 1.27 +#endif 1.28 + } else { 1.29 + ExtractAlpha_Scalar(size, sourceData, sourceStride, alphaData, alphaStride); 1.30 + } 1.31 + 1.32 + return alpha; 1.33 +} 1.34 + 1.35 +TemporaryRef<DataSourceSurface> 1.36 +FilterProcessing::ConvertToB8G8R8A8(SourceSurface* aSurface) 1.37 +{ 1.38 + if (Factory::HasSSE2()) { 1.39 +#ifdef USE_SSE2 1.40 + return ConvertToB8G8R8A8_SSE2(aSurface); 1.41 +#endif 1.42 + } 1.43 + return ConvertToB8G8R8A8_Scalar(aSurface); 1.44 +} 1.45 + 1.46 +TemporaryRef<DataSourceSurface> 1.47 +FilterProcessing::ApplyBlending(DataSourceSurface* aInput1, DataSourceSurface* aInput2, 1.48 + BlendMode aBlendMode) 1.49 +{ 1.50 + if (Factory::HasSSE2()) { 1.51 +#ifdef USE_SSE2 1.52 + return ApplyBlending_SSE2(aInput1, aInput2, aBlendMode); 1.53 +#endif 1.54 + } 1.55 + return ApplyBlending_Scalar(aInput1, aInput2, aBlendMode); 1.56 +} 1.57 + 1.58 +void 1.59 +FilterProcessing::ApplyMorphologyHorizontal(uint8_t* aSourceData, int32_t aSourceStride, 1.60 + uint8_t* aDestData, int32_t aDestStride, 1.61 + const IntRect& aDestRect, int32_t aRadius, 1.62 + MorphologyOperator aOp) 1.63 +{ 1.64 + if (Factory::HasSSE2()) { 1.65 +#ifdef USE_SSE2 1.66 + ApplyMorphologyHorizontal_SSE2( 1.67 + aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp); 1.68 +#endif 1.69 + } else { 1.70 + ApplyMorphologyHorizontal_Scalar( 1.71 + aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp); 1.72 + } 1.73 +} 1.74 + 1.75 +void 1.76 +FilterProcessing::ApplyMorphologyVertical(uint8_t* aSourceData, int32_t aSourceStride, 1.77 + uint8_t* aDestData, int32_t aDestStride, 1.78 + const IntRect& aDestRect, int32_t aRadius, 1.79 + MorphologyOperator aOp) 1.80 +{ 1.81 + if (Factory::HasSSE2()) { 1.82 +#ifdef USE_SSE2 1.83 + ApplyMorphologyVertical_SSE2( 1.84 + aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp); 1.85 +#endif 1.86 + } else { 1.87 + ApplyMorphologyVertical_Scalar( 1.88 + aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp); 1.89 + } 1.90 +} 1.91 + 1.92 +TemporaryRef<DataSourceSurface> 1.93 +FilterProcessing::ApplyColorMatrix(DataSourceSurface* aInput, const Matrix5x4 &aMatrix) 1.94 +{ 1.95 + if (Factory::HasSSE2()) { 1.96 +#ifdef USE_SSE2 1.97 + return ApplyColorMatrix_SSE2(aInput, aMatrix); 1.98 +#endif 1.99 + } 1.100 + return ApplyColorMatrix_Scalar(aInput, aMatrix); 1.101 +} 1.102 + 1.103 +void 1.104 +FilterProcessing::ApplyComposition(DataSourceSurface* aSource, DataSourceSurface* aDest, 1.105 + CompositeOperator aOperator) 1.106 +{ 1.107 + if (Factory::HasSSE2()) { 1.108 +#ifdef USE_SSE2 1.109 + ApplyComposition_SSE2(aSource, aDest, aOperator); 1.110 +#endif 1.111 + } else { 1.112 + ApplyComposition_Scalar(aSource, aDest, aOperator); 1.113 + } 1.114 +} 1.115 + 1.116 +void 1.117 +FilterProcessing::SeparateColorChannels(DataSourceSurface* aSource, 1.118 + RefPtr<DataSourceSurface>& aChannel0, 1.119 + RefPtr<DataSourceSurface>& aChannel1, 1.120 + RefPtr<DataSourceSurface>& aChannel2, 1.121 + RefPtr<DataSourceSurface>& aChannel3) 1.122 +{ 1.123 + IntSize size = aSource->GetSize(); 1.124 + aChannel0 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8); 1.125 + aChannel1 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8); 1.126 + aChannel2 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8); 1.127 + aChannel3 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8); 1.128 + uint8_t* sourceData = aSource->GetData(); 1.129 + int32_t sourceStride = aSource->Stride(); 1.130 + uint8_t* channel0Data = aChannel0->GetData(); 1.131 + uint8_t* channel1Data = aChannel1->GetData(); 1.132 + uint8_t* channel2Data = aChannel2->GetData(); 1.133 + uint8_t* channel3Data = aChannel3->GetData(); 1.134 + int32_t channelStride = aChannel0->Stride(); 1.135 + 1.136 + if (Factory::HasSSE2()) { 1.137 +#ifdef USE_SSE2 1.138 + SeparateColorChannels_SSE2(size, sourceData, sourceStride, channel0Data, channel1Data, channel2Data, channel3Data, channelStride); 1.139 +#endif 1.140 + } else { 1.141 + SeparateColorChannels_Scalar(size, sourceData, sourceStride, channel0Data, channel1Data, channel2Data, channel3Data, channelStride); 1.142 + } 1.143 +} 1.144 + 1.145 +TemporaryRef<DataSourceSurface> 1.146 +FilterProcessing::CombineColorChannels(DataSourceSurface* aChannel0, DataSourceSurface* aChannel1, 1.147 + DataSourceSurface* aChannel2, DataSourceSurface* aChannel3) 1.148 +{ 1.149 + IntSize size = aChannel0->GetSize(); 1.150 + RefPtr<DataSourceSurface> result = 1.151 + Factory::CreateDataSourceSurface(size, SurfaceFormat::B8G8R8A8); 1.152 + int32_t resultStride = result->Stride(); 1.153 + uint8_t* resultData = result->GetData(); 1.154 + int32_t channelStride = aChannel0->Stride(); 1.155 + uint8_t* channel0Data = aChannel0->GetData(); 1.156 + uint8_t* channel1Data = aChannel1->GetData(); 1.157 + uint8_t* channel2Data = aChannel2->GetData(); 1.158 + uint8_t* channel3Data = aChannel3->GetData(); 1.159 + 1.160 + if (Factory::HasSSE2()) { 1.161 +#ifdef USE_SSE2 1.162 + CombineColorChannels_SSE2(size, resultStride, resultData, channelStride, channel0Data, channel1Data, channel2Data, channel3Data); 1.163 +#endif 1.164 + } else { 1.165 + CombineColorChannels_Scalar(size, resultStride, resultData, channelStride, channel0Data, channel1Data, channel2Data, channel3Data); 1.166 + } 1.167 + 1.168 + return result; 1.169 +} 1.170 + 1.171 +void 1.172 +FilterProcessing::DoPremultiplicationCalculation(const IntSize& aSize, 1.173 + uint8_t* aTargetData, int32_t aTargetStride, 1.174 + uint8_t* aSourceData, int32_t aSourceStride) 1.175 +{ 1.176 + if (Factory::HasSSE2()) { 1.177 +#ifdef USE_SSE2 1.178 + DoPremultiplicationCalculation_SSE2( 1.179 + aSize, aTargetData, aTargetStride, aSourceData, aSourceStride); 1.180 +#endif 1.181 + } else { 1.182 + DoPremultiplicationCalculation_Scalar( 1.183 + aSize, aTargetData, aTargetStride, aSourceData, aSourceStride); 1.184 + } 1.185 +} 1.186 + 1.187 +void 1.188 +FilterProcessing::DoUnpremultiplicationCalculation(const IntSize& aSize, 1.189 + uint8_t* aTargetData, int32_t aTargetStride, 1.190 + uint8_t* aSourceData, int32_t aSourceStride) 1.191 +{ 1.192 + if (Factory::HasSSE2()) { 1.193 +#ifdef USE_SSE2 1.194 + DoUnpremultiplicationCalculation_SSE2( 1.195 + aSize, aTargetData, aTargetStride, aSourceData, aSourceStride); 1.196 +#endif 1.197 + } else { 1.198 + DoUnpremultiplicationCalculation_Scalar( 1.199 + aSize, aTargetData, aTargetStride, aSourceData, aSourceStride); 1.200 + } 1.201 +} 1.202 + 1.203 +TemporaryRef<DataSourceSurface> 1.204 +FilterProcessing::RenderTurbulence(const IntSize &aSize, const Point &aOffset, const Size &aBaseFrequency, 1.205 + int32_t aSeed, int aNumOctaves, TurbulenceType aType, bool aStitch, const Rect &aTileRect) 1.206 +{ 1.207 + if (Factory::HasSSE2()) { 1.208 +#ifdef USE_SSE2 1.209 + return RenderTurbulence_SSE2(aSize, aOffset, aBaseFrequency, aSeed, aNumOctaves, aType, aStitch, aTileRect); 1.210 +#endif 1.211 + } 1.212 + return RenderTurbulence_Scalar(aSize, aOffset, aBaseFrequency, aSeed, aNumOctaves, aType, aStitch, aTileRect); 1.213 +} 1.214 + 1.215 +TemporaryRef<DataSourceSurface> 1.216 +FilterProcessing::ApplyArithmeticCombine(DataSourceSurface* aInput1, DataSourceSurface* aInput2, Float aK1, Float aK2, Float aK3, Float aK4) 1.217 +{ 1.218 + if (Factory::HasSSE2()) { 1.219 +#ifdef USE_SSE2 1.220 + return ApplyArithmeticCombine_SSE2(aInput1, aInput2, aK1, aK2, aK3, aK4); 1.221 +#endif 1.222 + } 1.223 + return ApplyArithmeticCombine_Scalar(aInput1, aInput2, aK1, aK2, aK3, aK4); 1.224 +} 1.225 + 1.226 +} // namespace gfx 1.227 +} // namespace mozilla