Bug 719627 - Merge the functionality of ScaledFontCairo into ScaledFontBase, as is its purpose. r=jrmuizel
authorJoe Drew <joe@drew.ca>
Fri, 27 Jan 2012 13:08:46 -0500
changeset 86832 64c5a333c0f63e2e0748c7bf02f82f4ecc40260e
parent 86831 920e8c77c0424f541f8ade0ed2eecdd171067e80
child 86833 151ed82c3193ad05d943099f3f41ab2d395bb379
push id805
push userakeybl@mozilla.com
push dateWed, 01 Feb 2012 18:17:35 +0000
treeherdermozilla-aurora@6fb3bf232436 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjrmuizel
bugs719627
milestone12.0a1
Bug 719627 - Merge the functionality of ScaledFontCairo into ScaledFontBase, as is its purpose. r=jrmuizel
gfx/2d/2D.h
gfx/2d/DrawTargetCairo.cpp
gfx/2d/Factory.cpp
gfx/2d/Makefile.in
gfx/2d/ScaledFontBase.cpp
gfx/2d/ScaledFontBase.h
gfx/2d/ScaledFontCairo.cpp
gfx/2d/ScaledFontCairo.h
gfx/thebes/gfxMacFont.cpp
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -45,16 +45,19 @@
 // This RefPtr class isn't ideal for usage in Azure, as it doesn't allow T**
 // outparams using the &-operator. But it will have to do as there's no easy
 // solution.
 #include "mozilla/RefPtr.h"
 
 struct _cairo_surface;
 typedef _cairo_surface cairo_surface_t;
 
+struct _cairo_scaled_font;
+typedef _cairo_scaled_font cairo_scaled_font_t;
+
 struct ID3D10Device1;
 struct ID3D10Texture2D;
 
 namespace mozilla {
 namespace gfx {
 
 class SourceSurface;
 class DataSourceSurface;
@@ -768,16 +771,24 @@ public:
   
   static TemporaryRef<DrawTarget>
     CreateDrawTargetForData(BackendType aBackend, unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat);
 
   static TemporaryRef<ScaledFont>
     CreateScaledFontForNativeFont(const NativeFont &aNativeFont, Float aSize);
 
   /*
+   * This creates a scaled font with an associated cairo_scaled_font_t, and
+   * must be used when using the Cairo backend. The NativeFont and
+   * cairo_scaled_font_t* parameters must correspond to the same font.
+   */
+  static TemporaryRef<ScaledFont>
+    CreateScaledFontWithCairo(const NativeFont &aNativeFont, Float aSize, cairo_scaled_font_t* aScaledFont);
+
+  /*
    * This creates a simple data source surface for a certain size. It allocates
    * new memory for the surface. This memory is freed when the surface is
    * destroyed.
    */
   static TemporaryRef<DataSourceSurface>
     CreateDataSourceSurface(const IntSize &aSize, SurfaceFormat aFormat);
   
   /*
--- a/gfx/2d/DrawTargetCairo.cpp
+++ b/gfx/2d/DrawTargetCairo.cpp
@@ -34,17 +34,17 @@
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "DrawTargetCairo.h"
 
 #include "SourceSurfaceCairo.h"
 #include "PathCairo.h"
 #include "HelpersCairo.h"
-#include "ScaledFontCairo.h"
+#include "ScaledFontBase.h"
 
 #include "cairo.h"
 
 #include "Blur.h"
 
 #ifdef CAIRO_HAS_QUARTZ_SURFACE
 #include "cairo-quartz.h"
 #include <ApplicationServices/ApplicationServices.h>
@@ -586,20 +586,17 @@ DrawTargetCairo::Fill(const Path *aPath,
 void
 DrawTargetCairo::FillGlyphs(ScaledFont *aFont,
                             const GlyphBuffer &aBuffer,
                             const Pattern &aPattern,
                             const DrawOptions &aOptions)
 {
   AutoPrepareForDrawing prep(this, mContext);
 
-  if (aFont->GetType() != FONT_CAIRO)
-    return;
-
-  ScaledFontCairo* scaledFont = static_cast<ScaledFontCairo*>(aFont);
+  ScaledFontBase* scaledFont = static_cast<ScaledFontBase*>(aFont);
   cairo_set_scaled_font(mContext, scaledFont->GetCairoScaledFont());
 
   cairo_pattern_t* pat = GfxPatternToCairoPattern(aPattern, aOptions.mAlpha);
   cairo_set_source(mContext, pat);
   cairo_pattern_destroy(pat);
 
   // Convert our GlyphBuffer into an array of Cairo glyphs.
   std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs);
--- a/gfx/2d/Factory.cpp
+++ b/gfx/2d/Factory.cpp
@@ -34,17 +34,17 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "2D.h"
 
 #ifdef USE_CAIRO
 #include "DrawTargetCairo.h"
-#include "ScaledFontCairo.h"
+#include "ScaledFontBase.h"
 #endif
 
 #ifdef USE_SKIA
 #include "DrawTargetSkia.h"
 #include "ScaledFontBase.h"
 #endif
 
 #ifdef WIN32
@@ -154,26 +154,44 @@ Factory::CreateScaledFontForNativeFont(c
       return new ScaledFontWin(static_cast<gfxGDIFont*>(aNativeFont.mFont), aSize);
     }
 #endif
   case NATIVE_FONT_SKIA_FONT_FACE:
     {
       return new ScaledFontBase(static_cast<gfxFont*>(aNativeFont.mFont), aSize);
     }
 #endif
+#ifdef USE_CAIRO
   case NATIVE_FONT_CAIRO_FONT_FACE:
     {
-      return new ScaledFontCairo(static_cast<gfxFont*>(aNativeFont.mFont));
+      return new ScaledFontBase(aSize);
     }
+#endif
   default:
     gfxWarning() << "Invalid native font type specified.";
     return NULL;
   }
 }
 
+TemporaryRef<ScaledFont>
+Factory::CreateScaledFontWithCairo(const NativeFont& aNativeFont, Float aSize, cairo_scaled_font_t* aScaledFont)
+{
+#ifdef USE_CAIRO
+  // In theory, we could pull the NativeFont out of the cairo_scaled_font_t*,
+  // but that would require a lot of code that would be otherwise repeated in
+  // various backends.
+  // Therefore, we just reuse CreateScaledFontForNativeFont's implementation.
+  RefPtr<ScaledFont> font = CreateScaledFontForNativeFont(aNativeFont, aSize);
+  static_cast<ScaledFontBase*>(font.get())->SetCairoScaledFont(aScaledFont);
+  return font;
+#else
+  return NULL;
+#endif
+}
+
 #ifdef WIN32
 TemporaryRef<DrawTarget>
 Factory::CreateDrawTargetForD3D10Texture(ID3D10Texture2D *aTexture, SurfaceFormat aFormat)
 {
   RefPtr<DrawTargetD2D> newTarget;
 
   newTarget = new DrawTargetD2D();
   if (newTarget->Init(aTexture, aFormat)) {
--- a/gfx/2d/Makefile.in
+++ b/gfx/2d/Makefile.in
@@ -64,17 +64,16 @@ EXPORTS_mozilla/gfx	= \
         Types.h \
         UserData.h \
 	$(NULL)
 
 CPPSRCS	= \
 	Factory.cpp \
         Matrix.cpp \
         DrawTargetCairo.cpp \
-        ScaledFontCairo.cpp \
         SourceSurfaceCairo.cpp \
         PathCairo.cpp \
         Blur.cpp \
         ScaledFontBase.cpp \
         $(NULL)
 
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 CPPSRCS	+= \
--- a/gfx/2d/ScaledFontBase.cpp
+++ b/gfx/2d/ScaledFontBase.cpp
@@ -31,67 +31,84 @@
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "ScaledFontBase.h"
+
+#include "gfxFont.h"
+
 #ifdef USE_SKIA
 #include "PathSkia.h"
 #include "skia/SkPaint.h"
 #include "skia/SkPath.h"
 #endif
+
+#ifdef USE_CAIRO
+#include "PathCairo.h"
+#endif
+
 #include <vector>
 #include <cmath>
+
 using namespace std;
-#include "gfxFont.h"
 
 namespace mozilla {
 namespace gfx {
+
 #ifdef USE_SKIA
-static SkTypeface::Style gfxFontStyleToSkia(const gfxFontStyle* aStyle)
+static SkTypeface::Style
+gfxFontStyleToSkia(const gfxFontStyle* aStyle)
 {
   if (aStyle->style == NS_FONT_STYLE_ITALIC) {
     if (aStyle->weight == NS_FONT_WEIGHT_BOLD) {
       return SkTypeface::kBoldItalic;
     }
     return SkTypeface::kItalic;
   }
   if (aStyle->weight == NS_FONT_WEIGHT_BOLD) {
     return SkTypeface::kBold;
   }
   return SkTypeface::kNormal;
 }
+#endif
 
+#ifdef USE_SKIA
 ScaledFontBase::ScaledFontBase(gfxFont* aFont, Float aSize)
   : mSize(aSize)
 {
   NS_LossyConvertUTF16toASCII name(aFont->GetName());
   mTypeface = SkTypeface::CreateFromName(name.get(), gfxFontStyleToSkia(aFont->GetStyle()));
 }
 #endif
 
 ScaledFontBase::~ScaledFontBase()
 {
 #ifdef USE_SKIA
   SkSafeUnref(mTypeface);
 #endif
+#ifdef USE_CAIRO
+  cairo_scaled_font_destroy(mScaledFont);
+#endif
 }
 
 ScaledFontBase::ScaledFontBase(Float aSize)
   : mSize(aSize)
 {
 #ifdef USE_SKIA
   mTypeface = NULL;
 #endif
+#ifdef USE_CAIRO
+  mScaledFont = NULL;
+#endif
 }
 
-
 TemporaryRef<Path>
 ScaledFontBase::GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget)
 {
 #ifdef USE_SKIA
   if (aTarget->GetType() == BACKEND_SKIA) {
     SkPaint paint;
     paint.setTypeface(GetSkTypeface());
     paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
@@ -108,13 +125,49 @@ ScaledFontBase::GetPathForGlyphs(const G
       offsets[i].fY = SkFloatToScalar(aBuffer.mGlyphs[i].mPosition.y);
     }
 
     SkPath path;
     paint.getPosTextPath(&indices.front(), aBuffer.mNumGlyphs*2, &offsets.front(), &path);
     return new PathSkia(path, FILL_WINDING);
   }
 #endif
+#ifdef USE_CAIRO
+  if (aTarget->GetType() == BACKEND_CAIRO) {
+    MOZ_ASSERT(mScaledFont);
+
+    RefPtr<PathBuilder> builder_iface = aTarget->CreatePathBuilder();
+    PathBuilderCairo* builder = static_cast<PathBuilderCairo*>(builder_iface.get());
+
+    // Manually build the path for the PathBuilder.
+    RefPtr<CairoPathContext> context = builder->GetPathContext();
+
+    cairo_set_scaled_font(*context, mScaledFont);
+
+    // Convert our GlyphBuffer into an array of Cairo glyphs.
+    std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs);
+    for (uint32_t i = 0; i < aBuffer.mNumGlyphs; ++i) {
+      glyphs[i].index = aBuffer.mGlyphs[i].mIndex;
+      glyphs[i].x = aBuffer.mGlyphs[i].mPosition.x;
+      glyphs[i].y = aBuffer.mGlyphs[i].mPosition.y;
+    }
+
+    cairo_glyph_path(*context, &glyphs[0], aBuffer.mNumGlyphs);
+
+    return builder->Finish();
+  }
+#endif
   return NULL;
 }
 
+#ifdef USE_CAIRO
+void
+ScaledFontBase::SetCairoScaledFont(cairo_scaled_font_t* font)
+{
+  MOZ_ASSERT(!mScaledFont);
+
+  mScaledFont = font;
+  cairo_scaled_font_reference(mScaledFont);
+}
+#endif
+
 }
 }
--- a/gfx/2d/ScaledFontBase.h
+++ b/gfx/2d/ScaledFontBase.h
@@ -34,42 +34,56 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #ifndef MOZILLA_GFX_SCALEDFONTBASE_H_
 #define MOZILLA_GFX_SCALEDFONTBASE_H_
 
 #include "2D.h"
+
 #ifdef USE_SKIA
 #include "skia/SkTypeface.h"
 #endif
+#ifdef USE_CAIRO
+#include "cairo.h"
+#endif
 
 class gfxFont;
 
 namespace mozilla {
 namespace gfx {
 
 class ScaledFontBase : public ScaledFont
 {
 public:
   ScaledFontBase(Float aSize);
   virtual ~ScaledFontBase();
 
   virtual TemporaryRef<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget);
 #ifdef USE_SKIA
   ScaledFontBase(gfxFont* aFont, Float aSize);
   virtual SkTypeface* GetSkTypeface() { return mTypeface; }
+#endif
+
+  // Not true, but required to instantiate a ScaledFontBase.
   virtual FontType GetType() const { return FONT_SKIA; }
+
+#ifdef USE_CAIRO
+  cairo_scaled_font_t* GetCairoScaledFont() { return mScaledFont; }
+  void SetCairoScaledFont(cairo_scaled_font_t* font);
 #endif
 
 protected:
   friend class DrawTargetSkia;
 #ifdef USE_SKIA
   SkTypeface* mTypeface;
 #endif
+#ifdef USE_CAIRO
+  cairo_scaled_font_t* mScaledFont;
+#endif
   Float mSize;
 };
 
 }
 }
 
 #endif /* MOZILLA_GFX_SCALEDFONTBASE_H_ */
deleted file mode 100644
--- a/gfx/2d/ScaledFontCairo.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Corporation code.
- *
- * The Initial Developer of the Original Code is Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2011
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "ScaledFontCairo.h"
-
-#include "cairo.h"
-
-#include "PathCairo.h"
-#include "gfxFont.h"
-
-#include <vector>
-
-using namespace std;
-
-namespace mozilla {
-namespace gfx {
-
-ScaledFontCairo::ScaledFontCairo(gfxFont* aFont)
-{
-  mScaledFont = aFont->GetCairoScaledFont();
-  cairo_scaled_font_reference(mScaledFont);
-}
-
-ScaledFontCairo::~ScaledFontCairo()
-{
-  cairo_scaled_font_destroy(mScaledFont);
-}
-
-TemporaryRef<Path>
-ScaledFontCairo::GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget)
-{
-  if (aTarget->GetType() != BACKEND_CAIRO) {
-    return NULL;
-  }
-
-  RefPtr<PathBuilder> builder_iface = aTarget->CreatePathBuilder();
-  PathBuilderCairo* builder = static_cast<PathBuilderCairo*>(builder_iface.get());
-
-  // Manually build the path for the PathBuilder.
-  RefPtr<CairoPathContext> context = builder->GetPathContext();
-
-  cairo_set_scaled_font(*context, mScaledFont);
-
-  // Convert our GlyphBuffer into an array of Cairo glyphs.
-  std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs);
-  for (uint32_t i = 0; i < aBuffer.mNumGlyphs; ++i) {
-    glyphs[i].index = aBuffer.mGlyphs[i].mIndex;
-    glyphs[i].x = aBuffer.mGlyphs[i].mPosition.x;
-    glyphs[i].y = aBuffer.mGlyphs[i].mPosition.y;
-  }
-
-  cairo_glyph_path(*context, &glyphs[0], aBuffer.mNumGlyphs);
-
-  return builder->Finish();
-}
-
-cairo_scaled_font_t*
-ScaledFontCairo::GetCairoScaledFont()
-{
-  return mScaledFont;
-}
-
-}
-}
deleted file mode 100644
--- a/gfx/2d/ScaledFontCairo.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Corporation code.
- *
- * The Initial Developer of the Original Code is Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2011
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef MOZILLA_GFX_SCALEDFONTCAIRO_H_
-#define MOZILLA_GFX_SCALEDFONTCAIRO_H_
-
-#include "2D.h"
-
-class gfxFont;
-typedef struct _cairo_scaled_font cairo_scaled_font_t;
-
-namespace mozilla {
-namespace gfx {
-
-class ScaledFontCairo : public ScaledFont
-{
-public:
-  ScaledFontCairo(gfxFont* aFont);
-  virtual ~ScaledFontCairo();
-
-  virtual FontType GetType() const { return FONT_CAIRO; }
-
-  virtual TemporaryRef<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget);
-
-  cairo_scaled_font_t* GetCairoScaledFont();
-
-private:
-  cairo_scaled_font_t* mScaledFont;
-};
-
-}
-}
-
-#endif /* MOZILLA_GFX_SCALEDFONTCAIRO_H_ */
--- a/gfx/thebes/gfxMacFont.cpp
+++ b/gfx/thebes/gfxMacFont.cpp
@@ -499,15 +499,14 @@ gfxMacFont::InitMetricsFromATSMetrics(AT
 
 RefPtr<ScaledFont>
 gfxMacFont::GetScaledFont()
 {
   if (!mAzureFont) {
     NativeFont nativeFont;
     nativeFont.mType = NATIVE_FONT_MAC_FONT_FACE;
     nativeFont.mFont = GetCGFontRef();
-    mAzureFont =
-      mozilla::gfx::Factory::CreateScaledFontForNativeFont(nativeFont, GetAdjustedSize());
+    mAzureFont = mozilla::gfx::Factory::CreateScaledFontWithCairo(nativeFont, GetAdjustedSize(), mScaledFont);
   }
 
   return mAzureFont;
 }