From 75e6f69da6ebc736717a39a371a8d0ce340c3f86 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Tue, 10 Jan 2012 13:26:59 -0500 Subject: [PATCH] Bug 715513 - Implement text in the new 2D API's Cairo backend. r=jrmuizel --HG-- extra : rebase_source : 75350d02ec31e60c356b1d9f05bf14b2b2dee9f4 --- gfx/2d/DrawTargetCairo.cpp | 21 +++++++++ gfx/2d/Factory.cpp | 5 ++ gfx/2d/Makefile.in | 1 + gfx/2d/ScaledFontCairo.cpp | 97 ++++++++++++++++++++++++++++++++++++++ gfx/2d/ScaledFontCairo.h | 67 ++++++++++++++++++++++++++ gfx/2d/Types.h | 6 ++- gfx/thebes/gfxFont.h | 2 + gfx/thebes/gfxPlatform.cpp | 8 +++- 8 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 gfx/2d/ScaledFontCairo.cpp create mode 100644 gfx/2d/ScaledFontCairo.h diff --git a/gfx/2d/DrawTargetCairo.cpp b/gfx/2d/DrawTargetCairo.cpp index ae629bf2fee..623fa58b2ef 100644 --- a/gfx/2d/DrawTargetCairo.cpp +++ b/gfx/2d/DrawTargetCairo.cpp @@ -39,6 +39,7 @@ #include "SourceSurfaceCairo.h" #include "PathCairo.h" #include "HelpersCairo.h" +#include "ScaledFontCairo.h" #include "cairo.h" @@ -589,6 +590,26 @@ DrawTargetCairo::FillGlyphs(ScaledFont *aFont, const DrawOptions &aOptions) { AutoPrepareForDrawing prep(this, mContext); + + if (aFont->GetType() != FONT_CAIRO) + return; + + ScaledFontCairo* scaledFont = static_cast(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 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_show_glyphs(mContext, &glyphs[0], aBuffer.mNumGlyphs); } void diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp index 6d0bb4ecd24..e3e5def12c3 100644 --- a/gfx/2d/Factory.cpp +++ b/gfx/2d/Factory.cpp @@ -39,6 +39,7 @@ #ifdef USE_CAIRO #include "DrawTargetCairo.h" +#include "ScaledFontCairo.h" #endif #ifdef USE_SKIA @@ -139,6 +140,10 @@ Factory::CreateScaledFontForNativeFont(const NativeFont &aNativeFont, Float aSiz return new ScaledFontSkia(static_cast(aNativeFont.mFont), aSize); } #endif + case NATIVE_FONT_CAIRO_FONT_FACE: + { + return new ScaledFontCairo(static_cast(aNativeFont.mFont)); + } default: gfxWarning() << "Invalid native font type specified."; return NULL; diff --git a/gfx/2d/Makefile.in b/gfx/2d/Makefile.in index efe616ff371..b3afd83fab8 100644 --- a/gfx/2d/Makefile.in +++ b/gfx/2d/Makefile.in @@ -68,6 +68,7 @@ CPPSRCS = \ Factory.cpp \ Matrix.cpp \ DrawTargetCairo.cpp \ + ScaledFontCairo.cpp \ SourceSurfaceCairo.cpp \ PathCairo.cpp \ Blur.cpp \ diff --git a/gfx/2d/ScaledFontCairo.cpp b/gfx/2d/ScaledFontCairo.cpp new file mode 100644 index 00000000000..eba48807b92 --- /dev/null +++ b/gfx/2d/ScaledFontCairo.cpp @@ -0,0 +1,97 @@ +/* -*- 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 + +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 +ScaledFontCairo::GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget) +{ + if (aTarget->GetType() != BACKEND_CAIRO) { + return NULL; + } + + RefPtr builder_iface = aTarget->CreatePathBuilder(); + PathBuilderCairo* builder = static_cast(builder_iface.get()); + + // Manually build the path for the PathBuilder. + RefPtr context = builder->GetPathContext(); + + cairo_set_scaled_font(*context, mScaledFont); + + // Convert our GlyphBuffer into an array of Cairo glyphs. + std::vector 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; +} + +} +} diff --git a/gfx/2d/ScaledFontCairo.h b/gfx/2d/ScaledFontCairo.h new file mode 100644 index 00000000000..d9691addc5b --- /dev/null +++ b/gfx/2d/ScaledFontCairo.h @@ -0,0 +1,67 @@ +/* -*- 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 GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget); + + cairo_scaled_font_t* GetCairoScaledFont(); + +private: + cairo_scaled_font_t* mScaledFont; +}; + +} +} + +#endif /* MOZILLA_GFX_SCALEDFONTCAIRO_H_ */ diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 23fbfc11985..cc8c80468ec 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -79,7 +79,8 @@ enum FontType FONT_DWRITE, FONT_GDI, FONT_MAC, - FONT_SKIA + FONT_SKIA, + FONT_CAIRO }; enum NativeSurfaceType @@ -93,7 +94,8 @@ enum NativeFontType NATIVE_FONT_DWRITE_FONT_FACE, NATIVE_FONT_GDI_FONT_FACE, NATIVE_FONT_MAC_FONT_FACE, - NATIVE_FONT_SKIA_FONT_FACE + NATIVE_FONT_SKIA_FONT_FACE, + NATIVE_FONT_CAIRO_FONT_FACE }; enum CompositionOp { OP_OVER, OP_ADD, OP_ATOP, OP_OUT, OP_IN, OP_SOURCE, OP_DEST_IN, OP_DEST_OUT, OP_DEST_OVER, OP_DEST_ATOP, OP_XOR, OP_COUNT }; diff --git a/gfx/thebes/gfxFont.h b/gfx/thebes/gfxFont.h index 4c0ec06a168..65139b69ba4 100644 --- a/gfx/thebes/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -1128,6 +1128,8 @@ public: const nsString& GetName() const { return mFontEntry->Name(); } const gfxFontStyle *GetStyle() const { return &mStyle; } + cairo_scaled_font_t* GetCairoScaledFont() { return mScaledFont; } + virtual gfxFont* CopyWithAntialiasOption(AntialiasOption anAAOption) { // platforms where this actually matters should override return nsnull; diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 085e4147973..d01f26e4c1c 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -516,7 +516,13 @@ gfxPlatform::GetSourceSurfaceForSurface(DrawTarget *aTarget, gfxASurface *aSurfa RefPtr gfxPlatform::GetScaledFontForFont(gfxFont *aFont) { - return NULL; + NativeFont nativeFont; + nativeFont.mType = NATIVE_FONT_CAIRO_FONT_FACE; + nativeFont.mFont = aFont; + RefPtr scaledFont = + Factory::CreateScaledFontForNativeFont(nativeFont, + aFont->GetAdjustedSize()); + return scaledFont; } cairo_user_data_key_t kDrawSourceSurface;