gfx/2d/FilterProcessing.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "FilterProcessing.h"
     8 namespace mozilla {
     9 namespace gfx {
    11 TemporaryRef<DataSourceSurface>
    12 FilterProcessing::ExtractAlpha(DataSourceSurface* aSource)
    13 {
    14   IntSize size = aSource->GetSize();
    15   RefPtr<DataSourceSurface> alpha = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8);
    16   uint8_t* sourceData = aSource->GetData();
    17   int32_t sourceStride = aSource->Stride();
    18   uint8_t* alphaData = alpha->GetData();
    19   int32_t alphaStride = alpha->Stride();
    21   if (Factory::HasSSE2()) {
    22 #ifdef USE_SSE2
    23     ExtractAlpha_SSE2(size, sourceData, sourceStride, alphaData, alphaStride);
    24 #endif
    25   } else {
    26     ExtractAlpha_Scalar(size, sourceData, sourceStride, alphaData, alphaStride);
    27   }
    29   return alpha;
    30 }
    32 TemporaryRef<DataSourceSurface>
    33 FilterProcessing::ConvertToB8G8R8A8(SourceSurface* aSurface)
    34 {
    35   if (Factory::HasSSE2()) {
    36 #ifdef USE_SSE2
    37     return ConvertToB8G8R8A8_SSE2(aSurface);
    38 #endif
    39   }
    40   return ConvertToB8G8R8A8_Scalar(aSurface);
    41 }
    43 TemporaryRef<DataSourceSurface>
    44 FilterProcessing::ApplyBlending(DataSourceSurface* aInput1, DataSourceSurface* aInput2,
    45                                 BlendMode aBlendMode)
    46 {
    47   if (Factory::HasSSE2()) {
    48 #ifdef USE_SSE2
    49     return ApplyBlending_SSE2(aInput1, aInput2, aBlendMode);
    50 #endif
    51   }
    52   return ApplyBlending_Scalar(aInput1, aInput2, aBlendMode);
    53 }
    55 void
    56 FilterProcessing::ApplyMorphologyHorizontal(uint8_t* aSourceData, int32_t aSourceStride,
    57                                             uint8_t* aDestData, int32_t aDestStride,
    58                                             const IntRect& aDestRect, int32_t aRadius,
    59                                             MorphologyOperator aOp)
    60 {
    61   if (Factory::HasSSE2()) {
    62 #ifdef USE_SSE2
    63     ApplyMorphologyHorizontal_SSE2(
    64       aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp);
    65 #endif
    66   } else {
    67     ApplyMorphologyHorizontal_Scalar(
    68       aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp);
    69   }
    70 }
    72 void
    73 FilterProcessing::ApplyMorphologyVertical(uint8_t* aSourceData, int32_t aSourceStride,
    74                                             uint8_t* aDestData, int32_t aDestStride,
    75                                             const IntRect& aDestRect, int32_t aRadius,
    76                                             MorphologyOperator aOp)
    77 {
    78   if (Factory::HasSSE2()) {
    79 #ifdef USE_SSE2
    80     ApplyMorphologyVertical_SSE2(
    81       aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp);
    82 #endif
    83   } else {
    84     ApplyMorphologyVertical_Scalar(
    85       aSourceData, aSourceStride, aDestData, aDestStride, aDestRect, aRadius, aOp);
    86   }
    87 }
    89 TemporaryRef<DataSourceSurface>
    90 FilterProcessing::ApplyColorMatrix(DataSourceSurface* aInput, const Matrix5x4 &aMatrix)
    91 {
    92   if (Factory::HasSSE2()) {
    93 #ifdef USE_SSE2
    94     return ApplyColorMatrix_SSE2(aInput, aMatrix);
    95 #endif
    96   }
    97   return ApplyColorMatrix_Scalar(aInput, aMatrix);
    98 }
   100 void
   101 FilterProcessing::ApplyComposition(DataSourceSurface* aSource, DataSourceSurface* aDest,
   102                                    CompositeOperator aOperator)
   103 {
   104   if (Factory::HasSSE2()) {
   105 #ifdef USE_SSE2
   106     ApplyComposition_SSE2(aSource, aDest, aOperator);
   107 #endif
   108   } else {
   109     ApplyComposition_Scalar(aSource, aDest, aOperator);
   110   }
   111 }
   113 void
   114 FilterProcessing::SeparateColorChannels(DataSourceSurface* aSource,
   115                                         RefPtr<DataSourceSurface>& aChannel0,
   116                                         RefPtr<DataSourceSurface>& aChannel1,
   117                                         RefPtr<DataSourceSurface>& aChannel2,
   118                                         RefPtr<DataSourceSurface>& aChannel3)
   119 {
   120   IntSize size = aSource->GetSize();
   121   aChannel0 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8);
   122   aChannel1 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8);
   123   aChannel2 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8);
   124   aChannel3 = Factory::CreateDataSourceSurface(size, SurfaceFormat::A8);
   125   uint8_t* sourceData = aSource->GetData();
   126   int32_t sourceStride = aSource->Stride();
   127   uint8_t* channel0Data = aChannel0->GetData();
   128   uint8_t* channel1Data = aChannel1->GetData();
   129   uint8_t* channel2Data = aChannel2->GetData();
   130   uint8_t* channel3Data = aChannel3->GetData();
   131   int32_t channelStride = aChannel0->Stride();
   133   if (Factory::HasSSE2()) {
   134 #ifdef USE_SSE2
   135     SeparateColorChannels_SSE2(size, sourceData, sourceStride, channel0Data, channel1Data, channel2Data, channel3Data, channelStride);
   136 #endif
   137   } else {
   138     SeparateColorChannels_Scalar(size, sourceData, sourceStride, channel0Data, channel1Data, channel2Data, channel3Data, channelStride);
   139   }
   140 }
   142 TemporaryRef<DataSourceSurface>
   143 FilterProcessing::CombineColorChannels(DataSourceSurface* aChannel0, DataSourceSurface* aChannel1,
   144                                        DataSourceSurface* aChannel2, DataSourceSurface* aChannel3)
   145 {
   146   IntSize size = aChannel0->GetSize();
   147   RefPtr<DataSourceSurface> result =
   148     Factory::CreateDataSourceSurface(size, SurfaceFormat::B8G8R8A8);
   149   int32_t resultStride = result->Stride();
   150   uint8_t* resultData = result->GetData();
   151   int32_t channelStride = aChannel0->Stride();
   152   uint8_t* channel0Data = aChannel0->GetData();
   153   uint8_t* channel1Data = aChannel1->GetData();
   154   uint8_t* channel2Data = aChannel2->GetData();
   155   uint8_t* channel3Data = aChannel3->GetData();
   157   if (Factory::HasSSE2()) {
   158 #ifdef USE_SSE2
   159     CombineColorChannels_SSE2(size, resultStride, resultData, channelStride, channel0Data, channel1Data, channel2Data, channel3Data);
   160 #endif
   161   } else {
   162     CombineColorChannels_Scalar(size, resultStride, resultData, channelStride, channel0Data, channel1Data, channel2Data, channel3Data);
   163   }
   165   return result;
   166 }
   168 void
   169 FilterProcessing::DoPremultiplicationCalculation(const IntSize& aSize,
   170                                                  uint8_t* aTargetData, int32_t aTargetStride,
   171                                                  uint8_t* aSourceData, int32_t aSourceStride)
   172 {
   173   if (Factory::HasSSE2()) {
   174 #ifdef USE_SSE2 
   175     DoPremultiplicationCalculation_SSE2(
   176       aSize, aTargetData, aTargetStride, aSourceData, aSourceStride);
   177 #endif
   178   } else {
   179     DoPremultiplicationCalculation_Scalar(
   180       aSize, aTargetData, aTargetStride, aSourceData, aSourceStride);
   181   }
   182 }
   184 void
   185 FilterProcessing::DoUnpremultiplicationCalculation(const IntSize& aSize,
   186                                                    uint8_t* aTargetData, int32_t aTargetStride,
   187                                                    uint8_t* aSourceData, int32_t aSourceStride)
   188 {
   189   if (Factory::HasSSE2()) {
   190 #ifdef USE_SSE2 
   191     DoUnpremultiplicationCalculation_SSE2(
   192       aSize, aTargetData, aTargetStride, aSourceData, aSourceStride);
   193 #endif
   194   } else {
   195     DoUnpremultiplicationCalculation_Scalar(
   196       aSize, aTargetData, aTargetStride, aSourceData, aSourceStride);
   197   }
   198 }
   200 TemporaryRef<DataSourceSurface>
   201 FilterProcessing::RenderTurbulence(const IntSize &aSize, const Point &aOffset, const Size &aBaseFrequency,
   202                                    int32_t aSeed, int aNumOctaves, TurbulenceType aType, bool aStitch, const Rect &aTileRect)
   203 {
   204   if (Factory::HasSSE2()) {
   205 #ifdef USE_SSE2
   206     return RenderTurbulence_SSE2(aSize, aOffset, aBaseFrequency, aSeed, aNumOctaves, aType, aStitch, aTileRect);
   207 #endif
   208   }
   209   return RenderTurbulence_Scalar(aSize, aOffset, aBaseFrequency, aSeed, aNumOctaves, aType, aStitch, aTileRect);
   210 }
   212 TemporaryRef<DataSourceSurface>
   213 FilterProcessing::ApplyArithmeticCombine(DataSourceSurface* aInput1, DataSourceSurface* aInput2, Float aK1, Float aK2, Float aK3, Float aK4)
   214 {
   215   if (Factory::HasSSE2()) {
   216 #ifdef USE_SSE2
   217     return ApplyArithmeticCombine_SSE2(aInput1, aInput2, aK1, aK2, aK3, aK4);
   218 #endif
   219   }
   220   return ApplyArithmeticCombine_Scalar(aInput1, aInput2, aK1, aK2, aK3, aK4);
   221 }
   223 } // namespace gfx
   224 } // namespace mozilla

mercurial