/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"

%{C++
class nsIntRegion;
%}

native nsIntRegion(nsIntRegion);


[scriptable, uuid(a5f44cc7-2820-489b-b817-ae8a08506ff6)]
interface nsIScriptableRegion : nsISupports
{
  void init ( ) ;

  /**
  * copy operator equivalent that takes another region
  *
  * @param      region to copy
  * @return     void
  *
  **/

  void setToRegion ( in nsIScriptableRegion aRegion );

  /**
  * copy operator equivalent that takes a rect
  *
  * @param      aX xoffset of rect to set region to
  * @param      aY yoffset of rect to set region to
  * @param      aWidth width of rect to set region to
  * @param      aHeight height of rect to set region to
  * @return     void
  *
  **/

  void setToRect ( in long aX, in long aY, in long aWidth, in long aHeight );

  /**
  * destructively intersect another region with this one
  *
  * @param      region to intersect
  * @return     void
  *
  **/

  void intersectRegion ( in nsIScriptableRegion aRegion ) ;

  /**
  * destructively intersect a rect with this region
  *
  * @param      aX xoffset of rect to intersect with region
  * @param      aY yoffset of rect to intersect with region
  * @param      aWidth width of rect to intersect with region
  * @param      aHeight height of rect to intersect with region
  * @return     void
  *
  **/

  void intersectRect ( in long aX, in long aY, in long aWidth, in long aHeight ) ;

  /**
  * destructively union another region with this one
  *
  * @param      region to union
  * @return     void
  *
  **/

  void unionRegion ( in nsIScriptableRegion aRegion ) ;

  /**
  * destructively union a rect with this region
  *
  * @param      aX xoffset of rect to union with region
  * @param      aY yoffset of rect to union with region
  * @param      aWidth width of rect to union with region
  * @param      aHeight height of rect to union with region
  * @return     void
  *
  **/

  void unionRect ( in long aX, in long aY, in long aWidth, in long aHeight ) ;

  /**
  * destructively subtract another region with this one
  *
  * @param      region to subtract
  * @return     void
  *
  **/

  void subtractRegion ( in nsIScriptableRegion aRegion ) ;

  /**
  * destructively subtract a rect from this region
  *
  * @param      aX xoffset of rect to subtract with region
  * @param      aY yoffset of rect to subtract with region
  * @param      aWidth width of rect to subtract with region
  * @param      aHeight height of rect to subtract with region
  * @return     void
  *
  **/

  void subtractRect ( in long aX, in long aY, in long aWidth, in long aHeight ) ;
  
  /**
  * is this region empty? i.e. does it contain any pixels
  *
  * @param      none
  * @return     returns whether the region is empty
  *
  **/

  boolean isEmpty ( ) ;

  /**
  * == operator equivalent i.e. do the regions contain exactly
  * the same pixels
  *
  * @param      region to compare
  * @return     whether the regions are identical
  *
  **/

  boolean isEqualRegion ( in nsIScriptableRegion aRegion ) ;

  /**
  * returns the bounding box of the region i.e. the smallest
  * rectangle that completely contains the region.        
  *
  * @param      aX out parameter for xoffset of bounding rect for region
  * @param      aY out parameter for yoffset of bounding rect for region
  * @param      aWidth out parameter for width of bounding rect for region
  * @param      aHeight out parameter for height of bounding rect for region
  * @return     void
  *
  **/
  void getBoundingBox ( out long aX, out long aY, out long aWidth, out long aHeight ) ;

  /**
  * offsets the region in x and y
  *
  * @param  xoffset  pixel offset in x
  * @param  yoffset  pixel offset in y
  * @return          void
  *
  **/
  void offset ( in long aXOffset, in long aYOffset ) ;

  /**
   * @return null if there are no rects,
   * @return flat array of rects,ie [x1,y1,width1,height1,x2...].
   * The result will contain bogus data if values don't fit in 31 bit
   **/
  [implicit_jscontext] jsval getRects();

  /**
  * does the region intersect the rectangle?
  *
  * @param      rect to check for containment
  * @return     true if the region intersects the rect
  *
  **/

  boolean containsRect ( in long aX, in long aY, in long aWidth, in long aHeight ) ;
  
  [noscript] readonly attribute nsIntRegion region;
  
};
