Bug 1379404 - Part 4. Prevent unnecessary AzureState copy in GlyphBufferAzure::Flush. draft
authorcku <cku@mozilla.com>
Sun, 09 Jul 2017 00:49:24 +0800
changeset 605962 796130130330d90de8302ab0e8b1f4ab31538e95
parent 605961 7dd59aa052aea4b54afc1596de187660243a4aca
child 636639 105fa6a1ada3527a1f1ad915c7487f69583d6e25
push id67564
push userbmo:cku@mozilla.com
push dateMon, 10 Jul 2017 05:06:36 +0000
bugs1379404
milestone56.0a1
Bug 1379404 - Part 4. Prevent unnecessary AzureState copy in GlyphBufferAzure::Flush. ~AzureState is expensive, especially in GlyphBufferAzure::Flush, which is a high fan-in function. MozReview-Commit-ID: 4JfjMje0Kgs
gfx/thebes/gfxFont.cpp
gfx/thebes/gfxPattern.cpp
gfx/thebes/gfxPattern.h
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -1640,33 +1640,35 @@ private:
             Glyph *end = &mGlyphBuffer[mNumGlyphs];
             std::reverse(begin, end);
         }
 
         gfx::GlyphBuffer buf;
         buf.mGlyphs = mGlyphBuffer;
         buf.mNumGlyphs = mNumGlyphs;
 
-        gfxContext::AzureState state = mRunParams.context->CurrentState();
+        const gfxContext::AzureState &state = mRunParams.context->CurrentState();
         if (mRunParams.drawMode & DrawMode::GLYPH_FILL) {
             if (state.pattern || mFontParams.contextPaint) {
                 Pattern *pat;
 
                 RefPtr<gfxPattern> fillPattern;
                 if (mFontParams.contextPaint) {
                   imgDrawingParams imgParams;
                   fillPattern =
                     mFontParams.contextPaint->GetFillPattern(
                                           mRunParams.context->GetDrawTarget(),
                                           mRunParams.context->CurrentMatrix(),
                                           imgParams);
                 }
                 if (!fillPattern) {
                     if (state.pattern) {
-                        pat = state.pattern->GetPattern(mRunParams.dt,
+                        RefPtr<gfxPattern> statePattern =
+                          mRunParams.context->CurrentState().pattern;
+                        pat = statePattern->GetPattern(mRunParams.dt,
                                       state.patternTransformChanged ?
                                           &state.patternTransform : nullptr);
                     } else {
                         pat = nullptr;
                     }
                 } else {
                     pat = fillPattern->GetPattern(mRunParams.dt);
                 }
--- a/gfx/thebes/gfxPattern.cpp
+++ b/gfx/thebes/gfxPattern.cpp
@@ -101,17 +101,17 @@ gfxPattern::GetMatrix() const
 gfxMatrix
 gfxPattern::GetInverseMatrix() const
 {
   return ThebesMatrix(mPatternToUserSpace);
 }
 
 Pattern*
 gfxPattern::GetPattern(const DrawTarget *aTarget,
-                       Matrix *aOriginalUserToDevice)
+                       const Matrix *aOriginalUserToDevice)
 {
   Matrix patternToUser = mPatternToUserSpace;
 
   if (aOriginalUserToDevice &&
       *aOriginalUserToDevice != aTarget->GetTransform()) {
     // mPatternToUserSpace maps from pattern space to the original user space,
     // but aTarget now has a transform to a different user space.  In order for
     // the Pattern* that we return to be usable in aTarget's new user space we
--- a/gfx/thebes/gfxPattern.h
+++ b/gfx/thebes/gfxPattern.h
@@ -43,17 +43,17 @@ public:
     gfxMatrix GetInverseMatrix() const;
 
     /* Get an Azure Pattern for the current Cairo pattern. aPattern transform
      * specifies the transform that was set on the DrawTarget when the pattern
      * was set. When this is nullptr it is assumed the transform is identical
      * to the current transform.
      */
     mozilla::gfx::Pattern *GetPattern(const mozilla::gfx::DrawTarget *aTarget,
-                                      mozilla::gfx::Matrix *aOriginalUserToDevice = nullptr);
+                                      const mozilla::gfx::Matrix *aOriginalUserToDevice = nullptr);
     bool IsOpaque();
 
     // clamp, repeat, reflect
     void SetExtend(mozilla::gfx::ExtendMode aExtend);
 
     void SetSamplingFilter(mozilla::gfx::SamplingFilter aSamplingFilter);
     mozilla::gfx::SamplingFilter SamplingFilter() const;