Speed up ContainsPoint with an early reject test.

This commit is contained in:
tor%cs.brown.edu 2005-01-20 04:44:50 +00:00
parent c74041372b
commit f2efad8755
4 changed files with 99 additions and 2 deletions

View File

@ -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__

View File

@ -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<nsISVGCairoRegion> region = do_QueryInterface(mCoveredRegion);
if (!region->Contains(x,y))
return NS_OK;
}
/* get the metrics */
nsCOMPtr<nsISVGCairoGlyphMetrics> metrics;
{

View File

@ -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<nsISVGCairoRegion> region = do_QueryInterface(mCoveredRegion);
if (!region->Contains(x,y))
return NS_OK;
}
cairo_t *ctx = cairo_create();
GeneratePath(ctx);

View File

@ -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: