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
--- 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;