indexing
	description: "A region is a rectangle, polygon, or ellipse (or a combination of two or more of these shapes) that can be filled, painted, inverted, framed, and used to perform hit testing."
	status: "See notice at end of class."
	date: "$Date$"
	revision: "$Revision$"

class interface
	WEL_REGION

create 

	make_empty
			-- Make an empty rectangle region

	make_elliptic (left, top, right, bottom: INTEGER)
			-- Make an elliptical region specified by the
			-- bounding rectangle left, top, right, bottom

	make_elliptic_indirect (rect: WEL_RECT)
			-- Make an elliptical region specified by
			-- the bounding rectangle rect
		require
			rect_not_void: rect /= void

	make_polygon_alternate (points: ARRAY [INTEGER])
			-- Make a polygonal region specified by points
			-- using alternate mode. Fills area between
			-- odd-numbered and even-numbered polygon sides
			-- on each scan line.
		require
			points_not_void: points /= void
			points_count: points.count \\ 2 = 0

	make_polygon_winding (points: ARRAY [INTEGER])
			-- Make a polygonal region specified by points
			-- using winding mode. Fills any region with a nonzero
			-- winding value.
		require
			points_not_void: points /= void
			points_count: points.count \\ 2 = 0

	make_rect (left, top, right, bottom: INTEGER)
			-- Make a rectangle region specified by
			-- left, top, right, bottom.

	make_rect_indirect (rect: WEL_RECT)
			-- Make a rectangle region specified by
			-- the rectangle rect.
		require
			rect_not_void: rect /= void

	make_by_pointer (a_pointer: POINTER)
			-- Set item with a_pointer.
			-- Since item is shared, it does not need
			-- to be freed.
			-- Caution: a_pointer must be a pointer
			-- coming from Windows.
			-- (from WEL_GDI_ANY)
		ensure -- from WEL_ANY
			item_set: item = a_pointer
			shared: shared

feature -- Access

	gdi_objects_count: INTEGER
			-- Number of GDI object currently allocated by the
			-- program.
			--
			-- Note: debug option "WEL_GDI_COUNT" should be enabled, otherwise
			-- this function will return zero.
			-- (from WEL_GDI_ANY)

	item: POINTER
			-- Generic Windows handle or structure pointer.
			-- Can be a HWND, HICON, RECT *, WNDCLASS *, etc...
			-- (from WEL_ANY)
	
feature -- Comparison

	is_equal (other: like Current): BOOLEAN
			-- Is Current equal to other?
		require -- from ANY
			other_not_void: other /= void
		ensure -- from ANY
			symmetric: Result implies other.is_equal (Current)
			consistent: standard_is_equal (other) implies Result
	
feature -- Status report

	exists: BOOLEAN
			-- Does the item exist?
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = (item /= default_pointer)

	point_in (x, y: INTEGER): BOOLEAN
			-- Is the point x, y is in the region?
		require
			exists: exists

	rect_in (rect: WEL_RECT): BOOLEAN
			-- Is any part of the rectangle rect is within
			-- the boundaries of the region?
		require
			exists: exists
			rect_not_void: rect /= void

	shared: BOOLEAN
			-- Is item shared by another object?
			-- If False (by default), item will
			-- be destroyed by destroy_item.
			-- If True, item will not be destroyed.
			-- (from WEL_ANY)
	
feature -- Status setting

	set_shared
			-- Set shared to True.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			shared: shared

	set_unshared
			-- Set shared to False.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			unshared: not shared
	
feature -- Element change

	set_item (an_item: POINTER)
			-- Set item with an_item
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			item_set: item = an_item
	
feature -- Removal

	delete
			-- Destroy the inner structure of Current.
			--
			-- Call this function when Current is no more needed
			-- (from WEL_REFERENCE_TRACKABLE)
		require -- from WEL_REFERENCE_TRACKABLE
			reference_not_tracked: not reference_tracked
		ensure -- from WEL_REFERENCE_TRACKABLE
			destroyed: not shared implies not exists

	dispose
			-- Destroy the inner structure of Current.
			--
			-- This function is called by the GC when the
			-- object is collected, the developer should
			-- use delete.
			-- (from WEL_REFERENCE_TRACKABLE)
	
feature -- Conversion

	to_integer: INTEGER
			-- Converts item to an integer.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = cwel_pointer_to_integer (item)
	
feature -- Basic operations

	combine (region: WEL_REGION; mode: INTEGER): WEL_REGION
			-- Combine region with the current one using mode.
			-- See class WEL_RGN_CONSTANTS for mode values.
		require
			exists: exists
			region_not_void: region /= void
			region_exists: region.exists
		ensure
			result_not_void: Result /= void

	offset (x_offset, y_offset: INTEGER)
			-- Move the region by the specified offsets
			-- x_offset and y_offset
		require
			exists: exists

	set_rect (left, top, right, bottom: INTEGER)
			-- Change the region to a rectangle region specified
			-- by left, top, right, bottom
		require
			exists: exists
	
feature -- Status Report

	reference_tracked: BOOLEAN
			-- Are the number references of Current tracked?
			-- (from WEL_REFERENCE_TRACKABLE)

	references_count: INTEGER
			-- Number of object referring this object.
			-- (from WEL_REFERENCE_TRACKABLE)
	
feature -- Status Setting

	decrement_reference
			-- Decrement the number of references to this object.
			--
			-- When the number of references reach zero,
			-- delete is called if the object is not protected.
			-- (from WEL_REFERENCE_TRACKABLE)
		require -- from WEL_REFERENCE_TRACKABLE
			exists: exists
			tracking_references_started: reference_tracked

	enable_reference_tracking
			-- Set references_tracked to True.
			--
			-- (from WEL_REFERENCE_TRACKABLE)
		require -- from WEL_REFERENCE_TRACKABLE
			exists: exists
			tracking_reference_not_started: not reference_tracked

	increment_reference
			-- Increment the number of references to this object.
			-- (from WEL_REFERENCE_TRACKABLE)
		require -- from WEL_REFERENCE_TRACKABLE
			exists: exists
			tracking_references_started: reference_tracked

	object_id: INTEGER
			-- Runtime Id of Current.
			-- (from WEL_REFERENCE_TRACKABLE)
	
invariant

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class WEL_REGION