    indexing
    	description: "[
    				Abstraction for objects onto which graphical primitives may be applied.

    				Note: When line style is dashed and line width is bigger than one,
    				lines are not guaranteed to be dashed on all platforms.
    				All drawing operations are performed in the current
    				oreground color unless otherwise stated. i.e. clear_rectangle
    				uses the current background color.
    	]"
    	legal: "See notice at end of class."
    	status: "See notice at end of class."
    	keywords: "figure, primitive, drawing, line, point, ellipse"
    	date: "$Date: 2006-10-11 13:47:11 -0700 (Wed, 11 Oct 2006) $"
    	revision: "$Revision: 64308 $"

    deferred class interface
    	EV_DRAWABLE

    feature -- Access

    	background_color: EV_COLOR
    			-- Color displayed behind foreground features.
    			-- (from EV_COLORIZABLE)
    		require -- from EV_COLORIZABLE
    			not_destroyed: not is_destroyed
    		ensure -- from EV_COLORIZABLE
    			bridge_ok: Result.is_equal (implementation.background_color)

    	clip_area: EV_RECTANGLE
    			-- Rectangular area to apply clipping on.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			bridge_ok: (Result = Void) = (implementation.clip_area = Void)

    	dashed_line_style: BOOLEAN
    			-- Are lines drawn dashed?
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			bridge_ok: Result = implementation.dashed_line_style

    	data: ANY
    			-- Arbitrary user data may be stored here.
    			-- (from EV_ANY)

    	drawing_mode: INTEGER_32
    			-- Logical operation on pixels when drawing.
    			-- Default: drawing_mode_copy.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			bridge_ok: Result = implementation.drawing_mode

    	font: EV_FONT
    			-- Typeface appearance for `Current'.
    			-- (from EV_FONTABLE)
    		require -- from EV_FONTABLE
    			not_destroyed: not is_destroyed
    		ensure -- from EV_FONTABLE
    			not_void: Result /= Void
    			bridge_ok: Result.is_equal (implementation.font)

    	foreground_color: EV_COLOR
    			-- Color of foreground features like text.
    			-- (from EV_COLORIZABLE)
    		require -- from EV_COLORIZABLE
    			not_destroyed: not is_destroyed
    		ensure -- from EV_COLORIZABLE
    			bridge_ok: Result.is_equal (implementation.foreground_color)

    	generating_type: STRING_8
    			-- Name of current object's generating type
    			-- (type of which it is a direct instance)
    			-- (from ANY)

    	generator: STRING_8
    			-- Name of current object's generating class
    			-- (base class of the type of which it is a direct instance)
    			-- (from ANY)

    	line_width: INTEGER_32
    			-- Line thickness. Default: 1.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			bridge_ok: Result = implementation.line_width

    	tile: EV_PIXMAP
    			-- Pixmap that is used to draw filled primitives with
    			-- instead of foreground_color.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			bridge_ok: (Result = Void) = (implementation.tile = Void)

    feature -- Measurement

    	height: INTEGER_32
    			-- Vertical size in pixels.
    		require
    			not_destroyed: not is_destroyed

    	width: INTEGER_32
    			-- Horizontal size in pixels.
    		require
    			not_destroyed: not is_destroyed

    feature -- Comparison

    	frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void
    			-- or attached to isomorphic object structures?
    			-- (from ANY)
    		ensure -- from ANY
    			shallow_implies_deep: standard_equal (some, other) implies Result
    			both_or_none_void: (some = Void) implies (Result = (other = Void))
    			same_type: (Result and (some /= Void)) implies some.same_type (other)
    			symmetric: Result implies deep_equal (other, some)

    	frozen equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached
    			-- to objects considered equal?
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))

    	is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object considered
    			-- equal to current object?
    			-- (from ANY)
    		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

    	frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached to
    			-- field-by-field identical objects of the same type?
    			-- Always uses default object comparison criterion.
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))

    	frozen standard_is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object of the same type
    			-- as current object, and field-by-field identical to it?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			same_type: Result implies same_type (other)
    			symmetric: Result implies other.standard_is_equal (Current)

    feature -- Status report

    	conforms_to (other: ANY): BOOLEAN
    			-- Does type of current object conform to type
    			-- of `other' (as per Eiffel: The Language, chapter 13)?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void

    	same_type (other: ANY): BOOLEAN
    			-- Is type of current object identical to type of `other'?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			definition: Result = (conforms_to (other) and other.conforms_to (Current))

    feature -- Status setting

    	set_default_colors
    			-- Set foreground and background color to their default values.
    			-- (from EV_COLORIZABLE)
    		require -- from EV_COLORIZABLE
    			not_destroyed: not is_destroyed

    feature -- Element change

    	disable_dashed_line_style
    			-- Draw lines solid.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			dashed_line_style_disabled: not dashed_line_style

    	enable_dashed_line_style
    			-- Draw lines dashed.
    			-- See note at top.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			dashed_line_style_enabled: dashed_line_style

    	remove_clip_area
    			-- Do not apply any clipping.
    			-- Was declared in EV_DRAWABLE as synonym of remove_clipping.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			clip_area_void: clip_area = Void

    	remove_clipping
    			-- Do not apply any clipping.
    			-- Was declared in EV_DRAWABLE as synonym of remove_clip_area.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			clip_area_void: clip_area = Void

    	remove_tile
    			-- Do not apply a tile when filling.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			tile_void: tile = Void

    	set_background_color (a_color: like background_color)
    			-- Assign `a_color' to background_color.
    			-- (from EV_COLORIZABLE)
    		require -- from EV_COLORIZABLE
    			not_destroyed: not is_destroyed
    			a_color_not_void: a_color /= Void
    		ensure -- from EV_COLORIZABLE
    			background_color_assigned: background_color.is_equal (a_color)

    	set_clip_area (an_area: EV_RECTANGLE)
    			-- Set area which will be refreshed.
    		require
    			not_destroyed: not is_destroyed
    			an_area_not_void: an_area /= Void
    		ensure
    			clip_area_assigned: clip_area.is_equal (an_area)

    	set_clip_region (a_region: EV_REGION)
    			-- Set region which will be refreshed.
    		require
    			not_destroyed: not is_destroyed
    			a_region_not_void: a_region /= Void

    	set_data (some_data: like data)
    			-- Assign `some_data' to data.
    			-- (from EV_ANY)
    		require -- from EV_ANY
    			not_destroyed: not is_destroyed
    		ensure -- from EV_ANY
    			data_assigned: data = some_data

    	set_drawing_mode (a_mode: INTEGER_32)
    			-- Set drawing mode to `a_logical_mode'.
    		require
    			not_destroyed: not is_destroyed
    			a_mode_valid: valid_drawing_mode (a_mode)
    		ensure
    			drawing_mode_assigned: drawing_mode = a_mode

    	set_font (a_font: EV_FONT)
    			-- Assign `a_font' to font.
    			-- (from EV_FONTABLE)
    		require -- from EV_FONTABLE
    			not_destroyed: not is_destroyed
    			a_font_not_void: a_font /= Void
    		ensure -- from EV_FONTABLE
    			font_assigned: font.is_equal (a_font) and font /= a_font

    	set_foreground_color (a_color: like foreground_color)
    			-- Assign `a_color' to foreground_color.
    			-- (from EV_COLORIZABLE)
    		require -- from EV_COLORIZABLE
    			not_destroyed: not is_destroyed
    			a_color_not_void: a_color /= Void
    		ensure -- from EV_COLORIZABLE
    			foreground_color_assigned: foreground_color.is_equal (a_color)

    	set_line_width (a_width: INTEGER_32)
    			-- Assign `a_width' to line_width.
    			-- See note at top.
    		require
    			not_destroyed: not is_destroyed
    			a_width_positive_or_zero: a_width >= 0
    		ensure
    			line_width_assigned: line_width = a_width

    	set_tile (a_pixmap: EV_PIXMAP)
    			-- Set tile used to fill figures.
    			-- Set to Void to use background_color to fill.
    		require
    			not_destroyed: not is_destroyed
    			a_pixmap_not_void: a_pixmap /= Void
    		ensure
    			tile_assigned: tile /= Void

    feature -- Duplication

    	copy (other: like Current)
    			-- Update current object using fields of object attached
    			-- to `other', so as to yield equal objects.
    			-- (from EV_ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_equal: is_equal (other)

    	frozen deep_copy (other: like Current)
    			-- Effect equivalent to that of:
    			--		copy (`other' . deep_twin)
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, other)

    	frozen deep_twin: like Current
    			-- New object structure recursively duplicated from Current.
    			-- (from ANY)
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, Result)

    	frozen standard_copy (other: like Current)
    			-- Copy every field of `other' onto corresponding field
    			-- of current object.
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_standard_equal: standard_is_equal (other)

    	frozen standard_twin: like Current
    			-- New object field-by-field identical to `other'.
    			-- Always uses default copying semantics.
    			-- (from ANY)
    		ensure -- from ANY
    			standard_twin_not_void: Result /= Void
    			equal: standard_equal (Result, Current)

    	sub_pixmap (area: EV_RECTANGLE): EV_PIXMAP
    			-- Return a pixmap region of `Current' represented by rectangle `area'
    		require
    			not_destroyed: not is_destroyed
    			area_not_void: area /= Void
    		ensure
    			result_not_void: Result /= Void

    	frozen twin: like Current
    			-- New object equal to `Current'
    			-- twin calls copy; to change copying/twining semantics, redefine copy.
    			-- (from ANY)
    		ensure -- from ANY
    			twin_not_void: Result /= Void
    			is_equal: Result.is_equal (Current)

    feature -- Basic operations

    	frozen default: like Current
    			-- Default value of object's type
    			-- (from ANY)

    	frozen default_pointer: POINTER
    			-- Default value of type `POINTER'
    			-- (Avoid the need to write `p'.default for
    			-- some `p' of type `POINTER'.)
    			-- (from ANY)

    	default_rescue
    			-- Process exception for routines with no Rescue clause.
    			-- (Default: do nothing.)
    			-- (from ANY)

    	frozen do_nothing
    			-- Execute a null action.
    			-- (from ANY)

    feature -- Clearing operations

    	clear
    			-- Erase `Current' with background_color.
    		require
    			not_destroyed: not is_destroyed

    	clear_rectangle (x, y, a_width, a_height: INTEGER_32)
    			-- Draw rectangle with upper-left corner on (`x', `y')
    			-- with size `a_width' and `a_height' in background_color.
    		require
    			not_destroyed: not is_destroyed
    			a_width_positive_or_zero: a_width >= 0
    			a_height_positive_or_zero: a_height >= 0

    feature -- Command

    	destroy
    			-- Destroy underlying native toolkit object.
    			-- Render `Current' unusable.
    			-- (from EV_ANY)
    		ensure -- from EV_ANY
    			is_destroyed: is_destroyed

    feature {ANY} -- Contract support

    	valid_drawing_mode (a_mode: INTEGER_32): BOOLEAN
    			-- Is `a_mode' a valid drawing mode?
    			-- (from EV_DRAWABLE_CONSTANTS)

    feature -- Drawing mode setting

    	set_and_mode
    			-- Set drawing_mode to bitwise AND.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			drawing_mode_assigned: drawing_mode = drawing_mode_and

    	set_copy_mode
    			-- Set drawing_mode to normal.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			drawing_mode_assigned: drawing_mode = drawing_mode_copy

    	set_invert_mode
    			-- Set drawing_mode to bitwise invert.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			drawing_mode_assigned: drawing_mode = drawing_mode_invert

    	set_or_mode
    			-- Set drawing_mode to bitwise OR.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			drawing_mode_assigned: drawing_mode = drawing_mode_or

    	set_xor_mode
    			-- Set drawing_mode to bitwise XOR.
    		require
    			not_destroyed: not is_destroyed
    		ensure
    			drawing_mode_assigned: drawing_mode = drawing_mode_xor

    feature -- Drawing operations

    	draw_arc (x, y, a_bounding_width, a_bounding_height: INTEGER_32; a_start_angle, an_aperture: REAL_32)
    			-- Draw part of an ellipse defined by a rectangular area with an
    			-- upper left corner at `x',`y', width `a_bounding_width' and height
    			-- `a_bounding_height'.
    			-- Start at `a_start_angle' and stop at `a_start_angle' + `an_aperture'.
    			-- Angles are measured in radians, and go
    			-- counterclockwise from the 3 o'clock angle.
    		require
    			not_destroyed: not is_destroyed
    			a_bounding_width_positive_or_zero: a_bounding_width >= 0
    			a_bounding_height_positive_or_zero: a_bounding_width >= 0

    	draw_ellipse (x, y, a_bounding_width, a_bounding_height: INTEGER_32)
    			-- Draw an ellipse defined by a rectangular area with an
    			-- upper left corner at `x',`y', width `a_bounding_width' and height
    			-- `a_bounding_height'.
    		require
    			not_destroyed: not is_destroyed
    			a_bounding_width_positive_or_zero: a_bounding_width >= 0
    			a_bounding_height_positive_or_zero: a_bounding_height >= 0

    	draw_ellipsed_text (x, y: INTEGER_32; a_text: STRING_GENERAL; clipping_width: INTEGER_32)
    			-- Draw `a_text' with left of baseline at (`x', `y') using font.
    			-- Text is clipped to `clipping_width' in pixels and ellipses are displayed
    			-- to show truncated characters if any.
    		require
    			not_destroyed: not is_destroyed
    			a_text_not_void: a_text /= Void
    			clipping_width_positive: clipping_width >= 0

    	draw_ellipsed_text_top_left (x, y: INTEGER_32; a_text: STRING_GENERAL; clipping_width: INTEGER_32)
    			-- Draw `a_text' with top left corner at (`x', `y') using font.
    			-- Text is clipped to `clipping_width' in pixels and ellipses are displayed
    			-- to show truncated characters if any.
    		require
    			not_destroyed: not is_destroyed
    			a_text_not_void: a_text /= Void
    			clipping_width_positive: clipping_width >= 0

    	draw_pie_slice (x, y, a_bounding_width, a_bounding_height: INTEGER_32; a_start_angle, an_aperture: REAL_32)
    			-- Draw part of an ellipse defined by a rectangular area with an
    			-- upper left corner at `x',`y', width `a_bounding_width' and height
    			-- `a_bounding_height'.
    			-- Start at `a_start_angle' and stop at `a_start_angle' + `an_aperture'.
    			-- The arc is then closed by two segments through (`x', 'y').
    			-- Angles are measured in radians, start at the
    			-- 3 o'clock angle and grow counterclockwise.
    		require
    			not_destroyed: not is_destroyed
    			a_bounding_width_positive_or_zero: a_bounding_width >= 0
    			a_bounding_height_positive_or_zero: a_bounding_height >= 0

    	draw_pixmap (x, y: INTEGER_32; a_pixmap: EV_PIXMAP)
    			-- Draw `a_pixmap' with upper-left corner on (`x', `y').
    		require
    			not_destroyed: not is_destroyed
    			a_pixmap_not_void: a_pixmap /= Void

    	draw_point (x, y: INTEGER_32)
    			-- Draw point at (`x', `y').
    		require
    			not_destroyed: not is_destroyed

    	draw_polyline (points: ARRAY [EV_COORDINATE]; is_closed: BOOLEAN)
    			-- Draw line segments between subsequent points in
    			-- `points'. If `is_closed' draw line segment between first
    			-- and last point in `points'.
    		require
    			not_destroyed: not is_destroyed
    			points_not_void: points /= Void

    	draw_rectangle (x, y, a_width, a_height: INTEGER_32)
    			-- Draw rectangle with upper-left corner on (`x', `y')
    			-- with size `a_width' and `a_height'.
    		require
    			not_destroyed: not is_destroyed
    			a_width_positive_or_zero: a_width >= 0
    			a_height_positive_or_zero: a_height >= 0

    	draw_segment (x1, y1, x2, y2: INTEGER_32)
    			-- Draw line segment from (`x1', `y1') to (`x2', `y2').
    		require
    			not_destroyed: not is_destroyed

    	draw_straight_line (x1, y1, x2, y2: INTEGER_32)
    			-- Draw infinite straight line through (`x1', `y1') and
    			-- (`x2', `y2').
    		require
    			not_destroyed: not is_destroyed
    			points_not_equal: x1 /= x2 or y1 /= y2

    	draw_sub_pixmap (x, y: INTEGER_32; a_pixmap: EV_PIXMAP; area: EV_RECTANGLE)
    			-- Draw `area' of `a_pixmap' with upper-left corner on (`x', `y').
    		require
    			not_destroyed: not is_destroyed
    			a_pixmap_not_void: a_pixmap /= Void
    			area_not_void: area /= Void

    	draw_text (x, y: INTEGER_32; a_text: STRING_GENERAL)
    			-- Draw `a_text' with left of baseline at (`x', `y') using font.
    		require
    			not_destroyed: not is_destroyed
    			a_text_not_void: a_text /= Void

    	draw_text_top_left (x, y: INTEGER_32; a_text: STRING_GENERAL)
    			-- Draw `a_text' with top left corner at (`x', `y') using font.
    		require
    			not_destroyed: not is_destroyed
    			a_text_not_void: a_text /= Void

    feature -- Drawing operations (filled)

    	fill_ellipse (x, y, a_bounding_width, a_bounding_height: INTEGER_32)
    			-- Fill an ellipse defined by a rectangular area with an
    			-- upper left corner at `x',`y', width `a_bounding_width' and height
    			-- `a_bounding_height'.
    		require
    			not_destroyed: not is_destroyed
    			a_bounding_width_positive_or_zero: a_bounding_width >= 0
    			a_bounding_height_positive_or_zero: a_bounding_height >= 0

    	fill_pie_slice (x, y, a_bounding_width, a_bounding_height: INTEGER_32; a_start_angle, an_aperture: REAL_32)
    			-- Fill part of an ellipse defined by a rectangular area with an
    			-- upper left corner at `x',`y', width `a_bounding_width' and height
    			-- `a_bounding_height'.
    			-- Start at `a_start_angle' and stop at `a_start_angle' + `an_aperture'.
    			-- The arc is then closed by two segments through (`x', `y').
    			-- Angles are measured in radians, start at the 3
    			-- o'clock angle and grow counterclockwise.
    		require
    			not_destroyed: not is_destroyed
    			a_bounding_width_positive_or_zero: a_bounding_width >= 0
    			a_bounding_height_positive_or_zero: a_bounding_height >= 0

    	fill_polygon (points: ARRAY [EV_COORDINATE])
    			-- Draw filled polygon between subsequent points in `points'.
    		require
    			not_destroyed: not is_destroyed
    			points_not_void: points /= Void

    	fill_rectangle (x, y, a_width, a_height: INTEGER_32)
    			-- Draw filled rectangle with upper-left corner on (`x', `y')
    			-- with size `a_width' and `a_height'.
    		require
    			not_destroyed: not is_destroyed
    			a_width_positive_or_zero: a_width >= 0
    			a_height_positive_or_zero: a_height >= 0

    feature -- Output

    	io: STD_FILES
    			-- Handle to standard file setup
    			-- (from ANY)

    	out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of tagged_out.
    			-- (from ANY)

    	print (some: ANY)
    			-- Write terse external representation of `some'
    			-- on standard output.
    			-- (from ANY)

    	frozen tagged_out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of out.
    			-- (from ANY)

    feature -- Platform

    	operating_environment: OPERATING_ENVIRONMENT
    			-- Objects available from the operating system
    			-- (from ANY)

    feature -- Status Report

    	is_destroyed: BOOLEAN
    			-- Is `Current' no longer usable?
    			-- (from EV_ANY)
    		ensure -- from EV_ANY
    			bridge_ok: Result = implementation.is_destroyed

    invariant
    	line_width_positive_or_zero: is_usable implies line_width >= 0
    	drawing_mode_valid: is_usable implies valid_drawing_mode (drawing_mode)

    		-- from EV_COLORIZABLE
    	background_color_not_void: is_usable implies background_color /= Void
    	foreground_color_not_void: is_usable implies foreground_color /= Void

    		-- from EV_ANY
    	is_initialized: is_initialized
    	is_coupled: implementation /= Void and then implementation.interface = Current
    	default_create_called: default_create_called

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

    indexing
    	copyright: "Copyright (c) 1984-2006, Eiffel Software and others"
    	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
    	source: "[
    		Eiffel Software
    		356 Storke Road, Goleta, CA 93117 USA
    		Telephone 805-685-1006, Fax 805-685-6869
    		Website http://www.eiffel.com
    		Customer support http://support.eiffel.com
    	]"

    end -- class EV_DRAWABLE