Section Header

    + name := AREA;

    - comment := "Window Clipping. (Algorithm by Benoit Sonntag)";

    - version := 5;

Section Inherit

    - parent_video:ABSTRACT_BITMAP :=

    - parent_inbox:INBOX :=

Section INTERFACE

    - set_video_support bmp:ABSTRACT_BITMAP <-

Section Public

Redefine BITMAP.

Size zone.

    + height:INTEGER;

    + width :INTEGER;

    - x_min:INTEGER :=

    - y_min:INTEGER :=

    - x_max:INTEGER <-

    - y_max:INTEGER <-
Simple clipping.

    + clip_x0:INTEGER;

    + clip_y0:INTEGER;

    + clip_x1:INTEGER;

    + clip_y1:INTEGER;
Current position.

    + spot_x:INTEGER;

    + spot_y:INTEGER;
Current color.
Slave display.

    - slave_pixel_hard (x,y:INTEGER) color col:UINTEGER_32;

    - slave_line_h_hard (x1,y:INTEGER) until x2:INTEGER color col:UINTEGER_32;

    - slave_line_h_hard (x1,y:INTEGER) until x2:INTEGER image line:ABSTRACT_BMP_LINE offset ofs:INTEGER;
Master / Normal display.

    - pixel_hard (x,y:INTEGER) color col:UINTEGER_32 <-

    - line_h_hard (x0,y0:INTEGER) until x1:INTEGER color col:UINTEGER_32 <-

    - line_h_hard (x0,y0:INTEGER) until x1:INTEGER image line:ABSTRACT_BMP_LINE offset ofs:INTEGER <-

Section Public
Window links.

    + parent:AREA;
        Englobe window.

    + child :AREA;
        First children.

    + prev :AREA;
        Previous window.

    + next :AREA;
        Next window.
+-parent---------------------+
| +-self-----------|
| +-next---| |
| | | +-child--+ |
| | | | | |
| | | +--------+ |
| | | +-prev--------|
| | +--| |
| +-----------| |
| | |
+----------------------------+

    + plan:PLAN;

    + clip:CLIP;
        Cash clip zone.
Current window absolute position.

    + x_window:INTEGER;

    + y_window:INTEGER;

    - set_next new:AREA <-

    - set_prev new:AREA <-

    - set_child new:AREA <-

Section Public

    - debug_display <-

Section Public

    - get_x_window:INTEGER <-

    - get_y_window:INTEGER <-

New window


    - make father:AREA from (x0,y0:INTEGER) size (w,h:INTEGER) <-

    - create (x,y:INTEGER) size (w,h:INTEGER) :AREA <-

Delete window


    - delete <-

Moving window


    - update father:AREA from (x0,y0:INTEGER) size (w,h:INTEGER) <-

    - move (x,y:INTEGER) <-

    - set_position (x,y:INTEGER) <-

Resize window.


    - resize (lx,ly:INTEGER) <-
        Resize window.

First window


    - first <-
        put first plan window.

    - get_window (x,y:INTEGER) :AREA <-
        Get object pointer by (X,Y).
////////////////////////////////////////////////////////////
AREA //
////////////////////////////////////////////////////////////

Section AREA

    - list_plan:PLAN;

    - list_x:LIMIT_X;

    - list_y:LIMIT_Y;

    - display_list_x <-
list_plan={plan1,plan2}

.
plan1+---------------Y---------+
| . |
| plan2+----Y-----------------+
| | . : |
| | . : |
| | . : |
.....X..........X..............X.......X.....list_x
| | . : |
| | . : |
| +----Y-----------------+
| . |
+---------------Y---------+
.
list_y

    - stack_plan:FAST_ARRAY[PLAN]:=

    - last_clip :CLIP;

    - first_clip:CLIP;

    - top_clip :CLIP;
| |
| top_clip |
| |
+-----------+
+------------+ +-----------+ +-----------+
| | | | | |
| first_clip | ... | last_clip | | NEW |
| | | | | |
+------------+ +-----------+ +-----------+

    - add_clip win:AREA from (xmin,ymin:INTEGER) to (xmax,ymax:INTEGER) <-

    - remove_plan <-

    - append_plan <-

    - update_plan <-

    - creat_clip <-

    - clip_next_child <-

    - clip_type1 <-

    - sub_delete <-

    - sub_move (x,y:INTEGER) <-

    - sub_resize <-
get_clip x,y :

[clip]
X#####+-------++-------+
| #| || |
| #| || |
+----#######--++-------+
+---------+#-----------+
| |# |
| |####>X(x,y) |
| || |
+---------++-----------+

    - debug:BOOLEAN;

    - get_clip (x,y:INTEGER) :CLIP <-
        Find clip `(x,y)', begin search is `clip'.

Section Public

    - margin_clip_x0:INTEGER;

    - margin_clip_y0:INTEGER;

    - margin_clip_x1:INTEGER;

    - margin_clip_y1:INTEGER;

    - redraw (x0,y0:INTEGER) to (x1,y1:INTEGER) <-

    - draw (x0,y0:INTEGER) to (x1,y1:INTEGER) <-

    - refresh <-

    - get_object (x,y:INTEGER) :AREA <-

    - receive msg:EVENT <-
        Default.