Commit 5d763da0 authored by Jonathan Kew's avatar Jonathan Kew
Browse files

Bug 1699835d - Check that references in cached fontGroup match current presContext. r=lsalzman

parent 91dfab0b
Loading
Loading
Loading
Loading
+33 −15
Original line number Diff line number Diff line
@@ -4040,13 +4040,37 @@ TextMetrics* CanvasRenderingContext2D::DrawOrMeasureText(
}

gfxFontGroup* CanvasRenderingContext2D::GetCurrentFontStyle() {
  // use lazy initilization for the font group since it's rather expensive
  if (!CurrentState().fontGroup) {
  // Use lazy (re)initialization for the fontGroup since it's rather expensive.

  RefPtr<PresShell> presShell = GetPresShell();
  gfxTextPerfMetrics* tp = nullptr;
  FontMatchingStats* fontStats = nullptr;
  if (presShell && !presShell->IsDestroying()) {
    nsPresContext* pc = presShell->GetPresContext();
    tp = pc->GetTextPerfMetrics();
    fontStats = pc->GetFontMatchingStats();
  }

  // If we have a cached fontGroup, check that it is valid for the current
  // prescontext; if not, we need to discard and re-create it.
  RefPtr<gfxFontGroup>& fontGroup = CurrentState().fontGroup;
  if (fontGroup) {
    if (fontGroup->GetFontMatchingStats() != fontStats ||
        fontGroup->GetTextPerfMetrics() != tp) {
      fontGroup = nullptr;
    }
  }

  if (!fontGroup) {
    ErrorResult err;
    constexpr auto kDefaultFontStyle = "10px sans-serif"_ns;
    static float kDefaultFontSize = 10.0;
    RefPtr<PresShell> presShell = GetPresShell();
    bool fontUpdated = SetFontInternal(kDefaultFontStyle, err);
    const float kDefaultFontSize = 10.0;
    // If the font has already been set, we're re-creating the fontGroup
    // and should re-use the existing font attribute; if not, we initialize
    // it to the canvas default.
    const nsCString& currentFont = CurrentState().font;
    bool fontUpdated = SetFontInternal(
        currentFont.IsEmpty() ? kDefaultFontStyle : currentFont, err);
    if (err.Failed() || !fontUpdated) {
      err.SuppressException();
      // XXX Should we get a default lang from the prescontext or something?
@@ -4054,19 +4078,13 @@ gfxFontGroup* CanvasRenderingContext2D::GetCurrentFontStyle() {
      bool explicitLanguage = false;
      gfxFontStyle style;
      style.size = kDefaultFontSize;
      gfxTextPerfMetrics* tp = nullptr;
      FontMatchingStats* fontStats = nullptr;
      if (presShell && !presShell->IsDestroying()) {
        tp = presShell->GetPresContext()->GetTextPerfMetrics();
        fontStats = presShell->GetPresContext()->GetFontMatchingStats();
      }
      int32_t perDevPixel, perCSSPixel;
      GetAppUnitsValues(&perDevPixel, &perCSSPixel);
      gfxFloat devToCssSize = gfxFloat(perDevPixel) / gfxFloat(perCSSPixel);
      CurrentState().fontGroup = gfxPlatform::GetPlatform()->CreateFontGroup(
      fontGroup = gfxPlatform::GetPlatform()->CreateFontGroup(
          FontFamilyList(StyleGenericFontFamily::SansSerif), &style, language,
          explicitLanguage, tp, fontStats, nullptr, devToCssSize);
      if (CurrentState().fontGroup) {
      if (fontGroup) {
        CurrentState().font = kDefaultFontStyle;
      } else {
        NS_ERROR("Default canvas font is invalid");
@@ -4074,10 +4092,10 @@ gfxFontGroup* CanvasRenderingContext2D::GetCurrentFontStyle() {
    }
  } else {
    // The fontgroup needs to check if its cached families/faces are valid.
    CurrentState().fontGroup->CheckForUpdatedPlatformList();
    fontGroup->CheckForUpdatedPlatformList();
  }

  return CurrentState().fontGroup;
  return fontGroup;
}

//
+2 −1
Original line number Diff line number Diff line
@@ -150,7 +150,8 @@ already_AddRefed<nsFontMetrics> nsFontCache::GetMetricsFor(
        fm->GetUserFontSet() == aParams.userFontSet &&
        fm->Language() == language &&
        fm->Orientation() == aParams.orientation &&
        fm->ExplicitLanguage() == aParams.explicitLanguage) {
        fm->ExplicitLanguage() == aParams.explicitLanguage &&
        fm->GetThebesFontGroup()->GetFontMatchingStats() == aParams.fontStats) {
      if (i != n) {
        // promote it to the end of the cache
        mFontMetrics.RemoveElementAt(i);
+3 −1
Original line number Diff line number Diff line
@@ -1049,7 +1049,9 @@ class gfxFontGroup final : public gfxTextRunFactory {
  uint64_t GetRebuildGeneration();

  // used when logging text performance
  gfxTextPerfMetrics* GetTextPerfMetrics() { return mTextPerf; }
  gfxTextPerfMetrics* GetTextPerfMetrics() const { return mTextPerf; }

  FontMatchingStats* GetFontMatchingStats() const { return mFontMatchingStats; }

  // This will call UpdateUserFonts() if the user font set is changed.
  void SetUserFontSet(gfxUserFontSet* aUserFontSet);