gfx/2d/FilterProcessing.cpp

changeset 0
6474c204b198
     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

mercurial