/*
 * Copyright (c) 1987, 1988, 1989, 1990, 1991 Stanford University
 * Copyright (c) 1991 Silicon Graphics, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software and 
 * its documentation for any purpose is hereby granted without fee, provided
 * that (i) the above copyright notices and this permission notice appear in
 * all copies of the software and related documentation, and (ii) the names of
 * Stanford and Silicon Graphics may not be used in any advertising or
 * publicity relating to the software without the specific, prior written
 * permission of Stanford and Silicon Graphics.
 * 
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * IN NO EVENT SHALL STANFORD OR SILICON GRAPHICS BE LIABLE FOR
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
 * OF THIS SOFTWARE.
 */

#ifndef iv_xcanvas_h
#define iv_xcanvas_h

#include <InterViews/canvas.h>
#include <IV-X11/Xlib.h>
#include <IV-X11/Xutil.h>

#include <InterViews/_enter.h>

class ClippingStack;
class Display;
class TransformerStack;

class CanvasDamage {
public:
#ifdef _DELTA_EXTENSIONS
#pragma __static_class
#endif
    Coord left;
    Coord bottom;
    Coord right;
    Coord top;
};

class TextRenderInfo {
public:
#ifdef _DELTA_EXTENSIONS
#pragma __static_class
#endif
    CanvasRep* canvas_;
    GC drawgc_;
    int x0_;
    int y0_;
    Coord width_;
    Coord curx_;
    Coord cury_;
    char* text_;
    char* cur_text_;
    int spaces_;
    XTextItem* items_;
};

class PathRenderInfo {
public:
#ifdef _DELTA_EXTENSIONS
#pragma __static_class
#endif
    Coord curx_;
    Coord cury_;
    XPoint* point_;
    XPoint* cur_point_;
    XPoint* end_point_;
};

class CanvasRep {
public:
#ifdef _DELTA_EXTENSIONS
#pragma __static_class
#endif
    Display* display_;
    Window* window_;
    XDrawable xdrawable_;
    Coord width_;
    Coord height_;
    PixelCoord pwidth_;
    PixelCoord pheight_;

    bool damaged_ : 1;
    bool on_damage_list_ : 1;
    bool repairing_ : 1;
    CanvasDamage damage_;

    XDrawable drawbuffer_;
    XDrawable copybuffer_;
    XRectangle clip_;
    const Brush* brush_;
    const Color* color_;
    const Font* font_;
    Region clipping_;
    Region empty_;
    GC drawgc_;
    GC copygc_;
    int op_;
    Pixmap stipple_;
    unsigned long pixel_;
    int brush_width_;
    char* dash_list_;
    int dash_count_;
    XFontStruct* xfont_;
    bool text_twobyte_;
    bool text_reencode_;
    bool font_is_scaled_;
    bool transformed_;
    TransformerStack* transformers_;
    ClippingStack* clippers_;

    static TextRenderInfo text_;
    static PathRenderInfo path_;

    enum { unbound = 0 };

    XDisplay* dpy() const;
    Transformer& matrix() const;

    void flush();
    void swapbuffers();
    void brush(const Brush*);
    void color(const Color*);
    void font(const Font*);

    void new_damage();
    void clear_damage();
    bool start_repair();
    void finish_repair();

    void bind(bool double_buffered);
    void unbind();

    /* for backward compability */
public:
    CanvasLocation status_;

    void wait_for_copy();
};

#include <InterViews/_leave.h>

#endif
