зеркало из https://github.com/mozilla/pjs.git
Speed up ContainsPoint with an early reject test.
This commit is contained in:
Родитель
39c3a636af
Коммит
7e6f1ce252
|
@ -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__
|
|
@ -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;
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче