diff --git a/layout/svg/renderer/src/cairo/nsISVGCairoRegion.h b/layout/svg/renderer/src/cairo/nsISVGCairoRegion.h new file mode 100644 index 000000000000..71bd6bfadc52 --- /dev/null +++ b/layout/svg/renderer/src/cairo/nsISVGCairoRegion.h @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 2; 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 the Mozilla SVG project. + * + * The Initial Developer of the Original Code is IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either of 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 __NS_ISVGCAIRO_REGION_H__ +#define __NS_ISVGCAIRO_REGION_H__ + +#include "nsISVGRendererRegion.h" + +#define NS_ISVGCAIROREGION_IID \ +{ 0x92a3f5de, 0x694c, 0x4af1, { 0x81, 0x95, 0x23, 0xc7, 0xdb, 0x68, 0xc5, 0x17 } } + +/** + * \addtogroup cairo_renderer Cairo Rendering Engine + * @{ + */ + +/** + * 'Private' rendering engine interface + */ +class nsISVGCairoRegion : public nsISVGRendererRegion +{ +public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISVGCAIROREGION_IID) + + NS_IMETHOD_(PRBool) Contains(float x, float y) = 0; +}; + +/** @} */ + +#endif //__NS_ISVGCAIRO_REGION_H__ diff --git a/layout/svg/renderer/src/cairo/nsSVGCairoGlyphGeometry.cpp b/layout/svg/renderer/src/cairo/nsSVGCairoGlyphGeometry.cpp index 484d71dd957d..4ddf39a6d8b0 100644 --- a/layout/svg/renderer/src/cairo/nsSVGCairoGlyphGeometry.cpp +++ b/layout/svg/renderer/src/cairo/nsSVGCairoGlyphGeometry.cpp @@ -45,6 +45,7 @@ #include "nsISVGCairoCanvas.h" #include "nsIDOMSVGMatrix.h" #include "nsSVGCairoRegion.h" +#include "nsISVGCairoRegion.h" #include "nsISVGRendererRegion.h" #include "nsISVGGlyphGeometrySource.h" #include "nsPromiseFlatString.h" @@ -462,6 +463,13 @@ nsSVGCairoGlyphGeometry::ContainsPoint(float x, float y, PRBool *_retval) { *_retval = PR_FALSE; + // early reject test + if (mCoveredRegion) { + nsCOMPtr region = do_QueryInterface(mCoveredRegion); + if (!region->Contains(x,y)) + return NS_OK; + } + /* get the metrics */ nsCOMPtr metrics; { diff --git a/layout/svg/renderer/src/cairo/nsSVGCairoPathGeometry.cpp b/layout/svg/renderer/src/cairo/nsSVGCairoPathGeometry.cpp index 483cf74cda64..787b8a5a02f5 100644 --- a/layout/svg/renderer/src/cairo/nsSVGCairoPathGeometry.cpp +++ b/layout/svg/renderer/src/cairo/nsSVGCairoPathGeometry.cpp @@ -44,6 +44,7 @@ #include "nsSVGCairoPathGeometry.h" #include "nsISVGRendererPathGeometry.h" #include "nsISVGCairoCanvas.h" +#include "nsISVGCairoRegion.h" #include "nsIDOMSVGMatrix.h" #include "nsISVGRendererRegion.h" #include "nsISVGPathGeometrySource.h" @@ -442,6 +443,13 @@ nsSVGCairoPathGeometry::ContainsPoint(float x, float y, PRBool *_retval) { *_retval = PR_FALSE; + // early reject test + if (mCoveredRegion) { + nsCOMPtr region = do_QueryInterface(mCoveredRegion); + if (!region->Contains(x,y)) + return NS_OK; + } + cairo_t *ctx = cairo_create(); GeneratePath(ctx); diff --git a/layout/svg/renderer/src/cairo/nsSVGCairoRegion.cpp b/layout/svg/renderer/src/cairo/nsSVGCairoRegion.cpp index 91346d2e8a57..3800d73d19a4 100644 --- a/layout/svg/renderer/src/cairo/nsSVGCairoRegion.cpp +++ b/layout/svg/renderer/src/cairo/nsSVGCairoRegion.cpp @@ -35,11 +35,11 @@ * ***** END LICENSE BLOCK ***** */ #include "nsCOMPtr.h" -#include "nsISVGRendererRegion.h" +#include "nsISVGCairoRegion.h" #include "nsISVGRectangleSink.h" #include "nsSVGCairoRegion.h" -class nsSVGCairoRectRegion : public nsISVGRendererRegion +class nsSVGCairoRectRegion : public nsISVGCairoRegion { protected: friend nsresult NS_NewSVGCairoRectRegion(nsISVGRendererRegion** result, @@ -51,6 +51,9 @@ public: // nsISupports interface: NS_DECL_ISUPPORTS + // nsISVGCairoRegion interface: + NS_IMETHOD_(PRBool) Contains(float x, float y); + // nsISVGRendererRegion interface: NS_DECL_NSISVGRENDERERREGION @@ -85,10 +88,25 @@ NS_IMPL_ADDREF(nsSVGCairoRectRegion) NS_IMPL_RELEASE(nsSVGCairoRectRegion) NS_INTERFACE_MAP_BEGIN(nsSVGCairoRectRegion) + NS_INTERFACE_MAP_ENTRY(nsISVGCairoRegion) NS_INTERFACE_MAP_ENTRY(nsISVGRendererRegion) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END +//---------------------------------------------------------------------- +// nsISVGCairoRegion methods: + +NS_IMETHODIMP_(PRBool) +nsSVGCairoRectRegion::Contains(float x, float y) +{ + if (x >= mX && + x <= mX + mWidth && + y >= mY && + y <= mY + mHeight) + return PR_TRUE; + return PR_FALSE; +} + //---------------------------------------------------------------------- // nsISVGRendererRegion methods: