pjs/lib/liblayer/include/layers.h

582 строки
24 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
* layers.h - Compositing and layer related definitions and prototypes
*/
#ifndef _LAYERS_H_
#define _LAYERS_H_
#include "prtypes.h"
#include "fe_rgn.h"
#include "xp_rect.h"
#include "cl_types.h"
/******************Definitions and Types************/
/* Maximum and minimum permitted values for coordinates for layer
positions and bbox's.
Note: We don't use the extrema values of 32-bit integers.
Instead, we deliberately leave headroom to avoid overflow of the
coordinates as a result of translating the rect. */
#define CL_MAX_COORD ( 0x3fffffffL)
#define CL_MIN_COORD (-0x40000000L)
#define CL_MAX_RECT {CL_MIN_COORD, CL_MIN_COORD, CL_MAX_COORD, CL_MAX_COORD}
typedef struct CL_Color
{
uint8 red, green, blue;
} CL_Color;
typedef enum CL_LayerPosition {
CL_ABOVE,
CL_BELOW
} CL_LayerPosition;
/* A function that repaints a given region in a specified drawable. */
/* The region returned defines the area actually drawn. If this */
/* area is a complex region (it cannot be defined by the FE_Region */
/* primitive) and allow_transparency is FALSE (we are in the front- */
/* to-back phase of the compositor loop), this should return NULL. */
/* In this case, the painter function will be called again during */
/* the back-to-front phase. */
/* The update_region is specified in window coordinates. The layer */
/* is responsible for translating this into its own coordinate system */
/* The region passed back must also be in the window coordinate sys. */
typedef void (*CL_PainterFunc)(CL_Drawable *drawable,
CL_Layer *layer,
FE_Region update_region);
/*
* The painter_func returns a region that represents the area drawn.
* This function is called after the compositor uses the region.
*/
typedef void (*CL_RegionCleanupFunc)(CL_Layer *layer,
FE_Region drawn_region);
/* A function that handles events that relate directly to the layer */
/* A return value of TRUE indicates that the layer has accepted and */
/* dealt with the event. FALSE indicates that the event should be */
/* passed down to the next layer. */
typedef PRBool (*CL_EventHandlerFunc)(CL_Layer *layer,
CL_Event *event);
/* Function that's called when the layer is destroyed */
typedef void (*CL_DestroyFunc)(CL_Layer *layer);
/* Function that's called to retrieve user-defined data from layer */
typedef void *(*CL_GetClientDataFunc)(CL_Layer *layer);
/* Function that's called to set user-defined data for a layer */
typedef void (*CL_SetClientDataFunc)(CL_Layer *layer, void *client_data);
/* Function that's called when a layer is moved */
typedef void (*CL_PositionChangedFunc)(CL_Layer *layer,
int32 x_offset, int32 y_offset);
/* Function that's called when a layer's hidden state changes */
typedef void (*CL_VisibilityChangedFunc)(CL_Layer *layer, PRBool visible);
/* Function that's called when a layer's bounding box changes */
typedef void (*CL_BboxChangedFunc)(CL_Layer *layer, XP_Rect *new_bbox);
/*
* A C++-like vtable. These are virtual methods that CL_Layer
* sub-classes should override. I never thought I'd say this,
* but...I'd rather be using C++.
*/
typedef struct CL_LayerVTable
{
CL_PainterFunc painter_func;
CL_RegionCleanupFunc region_cleanup_func;
CL_EventHandlerFunc event_handler_func;
CL_DestroyFunc destroy_func;
CL_GetClientDataFunc get_client_data_func;
CL_SetClientDataFunc set_client_data_func;
CL_PositionChangedFunc position_changed_func;
CL_VisibilityChangedFunc visibility_changed_func;
CL_BboxChangedFunc bbox_changed_func;
} CL_LayerVTable;
/* Function called by CL_ForEachLayerInGroup() */
typedef PRBool (*CL_LayerInGroupFunc)(CL_Layer *layer, void *closure);
/* Function called by CL_ForEachChildOfLayer() */
typedef PRBool (*CL_ChildOfLayerFunc)(CL_Layer *layer, void *closure);
typedef enum
{
CL_EVENT_MOUSE_BUTTON_DOWN,
CL_EVENT_MOUSE_BUTTON_UP,
CL_EVENT_MOUSE_BUTTON_MULTI_CLICK,
CL_EVENT_MOUSE_MOVE,
CL_EVENT_KEY_DOWN,
CL_EVENT_KEY_UP,
CL_EVENT_MOUSE_ENTER,
CL_EVENT_MOUSE_LEAVE,
CL_EVENT_KEY_FOCUS_GAINED,
CL_EVENT_KEY_FOCUS_LOST
} CL_EventType;
typedef enum
{
CL_FOCUS_POLICY_CLICK, /* Layer gets keyboard focus when you click in it */
CL_FOCUS_POLICY_MOUSE_ENTER /* ...when you the mouse enters its bounds */
} CL_KeyboardFocusPolicy;
/*
* A generic event struct. I took the Mac toolbox model of having
* a single event structure encode all types of events. If we had
* more events (and this could happen in the near future), I'd go
* with the X model of having event-specific structures and a
* union of them that's passed around.
*/
struct CL_Event {
CL_EventType type; /* What type of event is this */
void *fe_event; /* FE-specific event information */
int32 fe_event_size; /* Size of FE-specific event info */
int32 x, y; /* The current position of the pointer */
uint32 which; /* For mouse events: which button is down
0 = none, 1 onwards starts from the left.
For key events: code for the key pressed */
uint32 modifiers; /* Modifiers currently in place e.g. shift key */
uint32 data; /* Other event specific information.
For multi-click events: the number of clicks */
};
#define CL_IS_MOUSE_EVENT(evnt) \
(((evnt)->type == CL_EVENT_MOUSE_BUTTON_DOWN) || \
((evnt)->type == CL_EVENT_MOUSE_BUTTON_MULTI_CLICK) || \
((evnt)->type == CL_EVENT_MOUSE_BUTTON_UP) || \
((evnt)->type == CL_EVENT_MOUSE_MOVE))
#define CL_IS_KEY_EVENT(evnt) \
(((evnt)->type == CL_EVENT_KEY_DOWN) || \
((evnt)->type == CL_EVENT_KEY_UP))
#define CL_IS_FOCUS_EVENT(evnt) \
(((evnt)->type == CL_EVENT_MOUSE_ENTER) || \
((evnt)->type == CL_EVENT_MOUSE_LEAVE) || \
((evnt)->type == CL_EVENT_KEY_FOCUS_GAINED) || \
((evnt)->type == CL_EVENT_KEY_FOCUS_LOST))
typedef enum CL_DrawableState {
CL_UNLOCK_DRAWABLE = 0x00,
CL_LOCK_DRAWABLE_FOR_READ = 0x01,
CL_LOCK_DRAWABLE_FOR_WRITE = 0x02,
CL_LOCK_DRAWABLE_FOR_READ_WRITE = 0x03
} CL_DrawableState;
/* Function that's called to insure that a drawable used as a backing
store can still be accessed and check that it has not been altered
since the last time the drawable was unlocked. This functions
permits a compositor client to purge its backing store when unlocked. */
typedef PRBool (*CL_LockDrawableFunc)(CL_Drawable *drawable,
CL_DrawableState state);
/* Function that's called when the drawable is destroyed */
typedef void (*CL_DestroyDrawableFunc)(CL_Drawable *drawable);
/* Function that's called to indicate that the drawable will be used.
* No other drawable calls will be made until we InitDrawable. */
typedef void (*CL_InitDrawableFunc)(CL_Drawable *drawable);
/* Function that's called to indicate that we're temporarily done with
* the drawable. The drawable won't be used until we call InitDrawable
* again. */
typedef void (*CL_RelinquishDrawableFunc)(CL_Drawable *drawable);
/* Function that's called to set coordinate origin of a drawable */
typedef void (*CL_SetDrawableOriginFunc)(CL_Drawable *drawable,
int32 x_offset, int32 y_offset);
typedef void (*CL_GetDrawableOriginFunc)(CL_Drawable *drawable,
int32 *x_offset, int32 *y_offset);
/* Function that's called to set drawing clip region for a drawable */
typedef void (*CL_SetDrawableClipFunc)(CL_Drawable *drawable,
FE_Region clip_region);
/* Function that's called to to restore drawing clip region to prior value */
typedef void (*CL_RestoreDrawableClipFunc)(CL_Drawable *drawable);
/* BLIT from one drawable to another */
typedef void (*CL_CopyPixelsFunc)(CL_Drawable *drawable_src,
CL_Drawable *drawable_dest,
FE_Region region);
/* Function that's called to set drawing clip region for a drawable */
typedef void (*CL_SetDrawableDimensionsFunc)(CL_Drawable *drawable,
uint32 width, uint32 height);
/*
* A C++-like vtable. These are virtual methods that CL_Layer
* sub-classes should override.
*/
typedef struct CL_DrawableVTable
{
CL_LockDrawableFunc lock_func;
CL_InitDrawableFunc init_func;
CL_RelinquishDrawableFunc relinquish_func;
CL_DestroyDrawableFunc destroy_func;
CL_SetDrawableOriginFunc set_origin_func;
CL_GetDrawableOriginFunc get_origin_func;
CL_SetDrawableClipFunc set_clip_func;
CL_RestoreDrawableClipFunc restore_clip_func;
CL_CopyPixelsFunc copy_pixels_func;
CL_SetDrawableDimensionsFunc set_dimensions_func;
} CL_DrawableVTable;
/* Bitmask for CL_CompositorTarget flags */
#define CL_WINDOW (0x00)
#define CL_OFFSCREEN (0x01)
#define CL_BACKING_STORE (0x02)
#define CL_PRINTER (0x03)
typedef enum
{
CL_DRAWING_METHOD_HYBRID, /* Combination of f-t-b and b-t-f */
CL_DRAWING_METHOD_BACK_TO_FRONT_ONLY /* Back-to-front drawing only */
} CL_DrawingMethod;
/*******************Prototypes**********************/
XP_BEGIN_PROTOS
/***************** LAYER METHODS *****************/
/* Values for flags argument to CL_NewLayer(), CL_SetFlags(), etc. */
#define CL_NO_FLAGS 0x0000
#define CL_HIDDEN 0x0001 /* Don't draw layer & children */
#define CL_PREFER_DRAW_ONSCREEN 0x0002 /* Prefer not to use backing store */
#define CL_PREFER_DRAW_OFFSCREEN 0x0004 /* Draw directly to pixmap ? */
#define CL_DONT_SCROLL_WITH_DOCUMENT 0x0008 /* Should this layer not scroll ? */
#define CL_CLIP_CHILD_LAYERS 0x0010 /* Clip drawing of descendents */
#define CL_DONT_CLIP_SELF 0x0020 /* Clip drawing of this layer ? */
#define CL_DONT_ENUMERATE 0x0040 /* Don't reflect into JavaScript*/
#define CL_OPAQUE 0x0080 /* Layer has no transparency */
#define CL_CUTOUT 0x0100 /* A layer drawn by somebody else */
#define CL_OVERRIDE_INHERIT_VISIBILITY 0x0200 /* Child visibility is independent
of parent's */
/* Allocate and free a layer */
extern CL_Layer *CL_NewLayer(char *name, int32 x_offset, int32 y_offset,
XP_Rect *bbox,
CL_LayerVTable *vtable,
uint32 flags, void *client_data);
extern uint32 CL_GetLayerFlags(CL_Layer *layer);
extern PRBool CL_ChangeLayerFlag(CL_Layer *layer, uint32 flag, PRBool value);
extern void CL_DestroyLayer(CL_Layer *layer);
/* Frees an entire sub-tree, rooted at the specified node */
extern void CL_DestroyLayerTree(CL_Layer *root);
/* Insert a layer into the layer tree as a child of the parent layer.
* If sibling is NULL, the layer is added as the topmost (in z-order) child
* if where==CL_ABOVE or the bottommost child if where==CL_BELOW.
* If sibling is non-NULL, the layer is added above or below (in z-order)
* sibling based on the value of where.
*/
extern void CL_InsertChild(CL_Layer *parent, CL_Layer *child,
CL_Layer *sibling, CL_LayerPosition where);
/*
* Alternate function for inserting a layer based on its relative z-order.
*/
extern void CL_InsertChildByZ(CL_Layer *parent, CL_Layer *child, int32 z_order);
/* Removes a layer from a parent's sub-tree */
extern void CL_RemoveChild(CL_Layer *parent, CL_Layer *child);
/* Call the function for each child layer of the layer */
extern PRBool CL_ForEachChildOfLayer(CL_Layer *parent,
CL_ChildOfLayerFunc func,
void *closure);
extern int32 CL_GetLayerZIndex(CL_Layer *layer);
/* Change the physical position or dimensions of a layer */
/* May trigger asynchronous drawing to update screen */
extern void CL_OffsetLayer(CL_Layer *layer, int32 x_offset, int32 y_offset);
extern void CL_MoveLayer(CL_Layer *layer, int32 x, int32 y);
extern void CL_ResizeLayer(CL_Layer *layer, int32 width, int32 height);
/* Setters and getters */
extern void CL_GetLayerBbox(CL_Layer *layer, XP_Rect *bbox);
extern void CL_SetLayerBbox(CL_Layer *layer, XP_Rect *bbox);
extern void CL_GetLayerBboxAbsolute(CL_Layer *layer, XP_Rect *bbox);
extern char *CL_GetLayerName(CL_Layer *layer);
extern void CL_SetLayerName(CL_Layer *layer, char *name);
/* Hide or show a layer. This may result in a redraw */
extern void CL_SetLayerHidden(CL_Layer *layer, PRBool hidden);
extern PRBool CL_GetLayerHidden(CL_Layer *layer);
extern void *CL_GetLayerClientData(CL_Layer *layer);
extern void CL_SetLayerClientData(CL_Layer *layer, void *client_data);
extern CL_Compositor *CL_GetLayerCompositor(CL_Layer *layer);
extern CL_Layer *CL_GetLayerAbove(CL_Layer *layer);
extern CL_Layer *CL_GetLayerBelow(CL_Layer *layer);
extern CL_Layer *CL_GetLayerSiblingAbove(CL_Layer *layer);
extern CL_Layer *CL_GetLayerSiblingBelow(CL_Layer *layer);
extern CL_Layer *CL_GetLayerChildByName(CL_Layer *layer, char *name);
extern CL_Layer *CL_GetLayerChildByIndex(CL_Layer *layer, uint index);
extern int CL_GetLayerChildCount(CL_Layer *layer);
extern int32 CL_GetLayerXOffset(CL_Layer *layer);
extern int32 CL_GetLayerYOffset(CL_Layer *layer);
extern int32 CL_GetLayerXOrigin(CL_Layer *layer);
extern int32 CL_GetLayerYOrigin(CL_Layer *layer);
extern void CL_GetLayerVTable(CL_Layer *layer, CL_LayerVTable *vtable);
extern void CL_SetLayerVTable(CL_Layer *layer, CL_LayerVTable *vtable);
extern CL_Layer *CL_GetLayerParent(CL_Layer *layer);
extern void CL_SetLayerUniformColor(CL_Layer *layer, CL_Color *color);
/***************** COMPOSITOR METHODS *****************/
/* Allocate and free a compositor */
extern CL_Compositor *CL_NewCompositor(CL_Drawable *primary,
CL_Drawable *backingstore,
int32 x_offset, int32 y_offset,
int32 width, int32 height,
uint32 frame_rate);
extern void CL_DestroyCompositor(CL_Compositor *compositor);
/*
* Called to indicate that the compositor's contents have changed. This
* is useful when we call into client code and need to confirm, on return,
* that the world hasn't changed around us.
*/
extern void CL_IncrementCompositorGeneration(CL_Compositor *compositor);
/* Find layer by name. This carries out a breadth-first search of the layer tree */
extern CL_Layer *CL_FindLayer(CL_Compositor *compositor, char *name);
/*
* Inform the compositor that some part of the window needs to be
* refreshed. The region to be refreshed is expressed in window
* coordinates.
*/
extern void CL_RefreshWindowRegion(CL_Compositor *compositor,
FE_Region refresh_region);
extern void CL_RefreshWindowRect(CL_Compositor *compositor,
XP_Rect *refresh_rect);
/*
* Inform the compositor that some part of a layer has changed and
* needs to be redrawn. The region to be updated is expressed in
* the layer's coordinate system. If update_now is TRUE, the
* composite is done synchronously. Otherwise, it is done at the
* next timer callback.
*/
void
CL_UpdateLayerRegion(CL_Compositor *compositor, CL_Layer *layer,
FE_Region update_region, PRBool update_now);
/*
* Version of CL_UpdateLayerRegion where the update region is
* expressed as a rectangle in the layer's coordinate system.
* Note that the rectangle can have 32-bit coordinates, whereas
* the corresponding region cannot.
*/
void
CL_UpdateLayerRect(CL_Compositor *compositor, CL_Layer *layer,
XP_Rect *update_rect, PRBool update_now);
/* Redraws all regions changed since last call to CL_CompositeNow().
* This is called by the timer callback. It can be called otherwise
* to force a synchronous composite. The cutoutp parameter determines
* whether to subtract out cutout layers while drawing.
*/
extern void CL_CompositeNow(CL_Compositor *compositor);
/* Indicates that the window the compositor is drawing to has been resized */
extern void CL_ResizeCompositorWindow(CL_Compositor *compositor,
int32 width, int32 height);
/*
* Indicates that the window the compositor is drawing to has been scrolled.
* x_origin and y_origin are the new offsets of the top-left of the window
* relative to the top-left of the document.
*/
extern void CL_ScrollCompositorWindow(CL_Compositor *compositor,
int32 x_origin, int32 y_origin);
/*
* Dispatch an event to the correct layer. The return value
* indicates whether the event was actually handled.
*/
extern PRBool CL_DispatchEvent(CL_Compositor *compositor, CL_Event *event);
/*
* All events go to the corresponding layer.
* A layer value of NULL releases the capture.
*/
extern PRBool CL_GrabMouseEvents(CL_Compositor *compositor, CL_Layer *layer);
extern PRBool CL_GrabKeyEvents(CL_Compositor *compositor, CL_Layer *layer);
/* Functions to determine whether a layer has grabbed mouse or key events. */
extern PRBool CL_IsMouseEventGrabber(CL_Compositor *compositor,
CL_Layer *layer);
extern PRBool CL_IsKeyEventGrabber(CL_Compositor *compositor, CL_Layer *layer);
/* Functions to determine which layer has grabbed key events. */
extern CL_Layer *CL_GetKeyEventGrabber(CL_Compositor *compositor);
/* Setters and getters */
/* Sets whether a compositor offscreen-drawing should occur or not
If enabled is PR_TRUE, the compositor will use offscreen
drawing if applicable. */
extern void CL_SetCompositorOffscreenDrawing(CL_Compositor *compositor,
CL_OffscreenMode mode);
extern CL_OffscreenMode CL_GetCompositorOffscreenDrawing(CL_Compositor *compositor);
/* Sets a compositor's enabled state. Disabling a compositor will */
/* stop timed composites (but will not prevent explicit composites */
/* from happening). Enabling a compositor restarts timed draws. */
extern PRBool CL_GetCompositorEnabled(CL_Compositor *compositor);
extern void CL_SetCompositorEnabled(CL_Compositor *compositor,
PRBool enabled);
extern CL_Drawable *CL_GetCompositorDrawable(CL_Compositor *compositor);
extern void CL_SetCompositorDrawable(CL_Compositor *compositor,
CL_Drawable *drawable);
extern CL_Layer *CL_GetCompositorRoot(CL_Compositor *compositor);
extern void CL_SetCompositorRoot(CL_Compositor *compositor, CL_Layer *root);
extern uint32 CL_GetCompositorFrameRate(CL_Compositor *compositor);
extern void CL_SetCompositorFrameRate(CL_Compositor *compositor,
uint32 frame_rate);
extern int32 CL_GetCompositorXOffset(CL_Compositor *compositor);
extern int32 CL_GetCompositorYOffset(CL_Compositor *compositor);
extern void CL_GetCompositorWindowSize(CL_Compositor *compositor,
XP_Rect *window_size);
/* Sets the default keyboard focus change policy */
extern void CL_SetKeyboardFocusPolicy(CL_Compositor *compositor,
CL_KeyboardFocusPolicy policy);
extern void CL_SetCompositorDrawingMethod(CL_Compositor *compositor,
CL_DrawingMethod method);
/***************** Group-related Compositor methods *****************/
/* Adds a layer to a group. Returns TRUE if a new group had to be created */
extern PRBool CL_AddLayerToGroup(CL_Compositor *compositor,
CL_Layer *layer,
char *name);
/* Remove a layer from a group */
extern void CL_RemoveLayerFromGroup(CL_Compositor *compositor,
CL_Layer *layer,
char *name);
/* Get rid of the layer group */
extern void CL_DestroyLayerGroup(CL_Compositor *compositor,
char *name);
/* Hide or unhide all layers in the group */
extern void CL_HideLayerGroup(CL_Compositor *compositor, char *name);
extern void CL_UnhideLayerGroup(CL_Compositor *compositor, char *name);
/* Move all the layers in a group */
extern void CL_OffsetLayerGroup(CL_Compositor *compositor, char *name,
int32 x_offset, int32 y_offset);
/* Execute function for each layer in the group */
extern PRBool CL_ForEachLayerInGroup(CL_Compositor *compositor,
char *name,
CL_LayerInGroupFunc func,
void *closure);
/***************** Utility Compositor methods *****************/
extern void CL_CreateDefaultLayers(CL_Compositor *compositor);
/* Convert rectangle from window to document coordinate system */
extern void CL_WindowToDocumentRect(CL_Compositor *compositor,
XP_Rect *rect);
/* Convert rectangle from document to window coordinate system */
extern void CL_DocumentToWindowRect(CL_Compositor *compositor,
XP_Rect *rect);
/*
* This is here temporarily. This is similar to CL_UpdateLayerRect,
* except the rectangle is specified in document coordinates. For
* now, it's a convenience function. In the future, the callers of
* this function should be able to provide a layer.
*/
extern void CL_UpdateDocumentRect(CL_Compositor *compositor,
XP_Rect *update_rect, PRBool update_now);
/* Convert a rect from window to layer coordinate system */
extern void CL_WindowToLayerRect(CL_Compositor *compositor, CL_Layer *layer,
XP_Rect *rect);
/* Convert a rect from layer to window coordinate system */
extern void CL_LayerToWindowRect(CL_Compositor *compositor, CL_Layer *layer,
XP_Rect *rect);
/* Convert a region from layer to window coordinate system */
extern void CL_LayerToWindowRegion(CL_Compositor *compositor, CL_Layer *layer,
FE_Region region);
/* Convert a region from window to layer coordinate system */
extern void CL_WindowToLayerRegion(CL_Compositor *compositor, CL_Layer *layer,
FE_Region region);
/***************** Drawable methods *****************/
extern CL_Drawable *CL_NewDrawable(uint width, uint height,
uint32 flags,
CL_DrawableVTable *vtable,
void *client_data);
extern void CL_DestroyDrawable(CL_Drawable *drawable);
extern void *CL_GetDrawableClientData(CL_Drawable *drawable);
extern CL_Color *CL_GetDrawableBgColor(CL_Drawable *drawable, XP_Rect *win_rect);
/************* Other utility functions **************/
extern float CL_RegionEntropy(FE_Region region);
extern void CL_ForEachRectCoveringRegion(FE_Region region, FE_RectInRegionFunc func,
void *closure);
XP_END_PROTOS
#endif /* _LAYERS_H_ */