You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

312 lines
8.4 KiB

#ifndef _COMPIZ_ANIMATION_H
#define _COMPIZ_ANIMATION_H
#define ANIMATION_ABIVERSION 20081221
typedef enum
{
WindowEventOpen = 0,
WindowEventClose,
WindowEventMinimize,
WindowEventUnminimize,
WindowEventShade,
WindowEventUnshade,
WindowEventFocus,
WindowEventNum,
WindowEventNone
} WindowEvent;
typedef enum
{
AnimEventOpen = 0,
AnimEventClose,
AnimEventMinimize,
AnimEventShade,
AnimEventFocus,
AnimEventNum
} AnimEvent;
typedef struct _AnimEffectProperties
{
void (*updateWindowAttribFunc) (CompWindow *,
WindowPaintAttrib *);
void (*prePaintWindowFunc) (CompWindow *);
void (*postPaintWindowFunc) (CompWindow *);
void (*animStepFunc) (CompWindow *, float time);
Bool (*initFunc) (CompWindow *);
void (*initGridFunc) (CompWindow *, int *, int *);
void (*addCustomGeometryFunc) (CompWindow *, int, Box *,
int, CompMatrix *);
void (*drawCustomGeometryFunc) (CompWindow *);
Bool (*letOthersDrawGeomsFunc) (CompWindow *);
void (*updateWinTransformFunc) (CompWindow *,
CompTransform *);
Bool (*prePrepPaintScreenFunc) (CompWindow *, int msSinceLastPaint);
void (*postPrepPaintScreenFunc) (CompWindow *);
void (*updateBBFunc) (CompOutput *, CompWindow *, Box *);
void (*cleanupFunc) (CompWindow *);
void (*refreshFunc) (CompWindow *, Bool animInitialized);
Bool (*zoomToIconFunc) (CompWindow *);
Bool modelAnimIs3D; // TRUE if anim uses model and 3d coords
Bool useQTexCoord; // TRUE if effect needs Q texture coordinates
void *extraProperties;
} AnimEffectProperties;
typedef struct _AnimEffectInfo
{
char *name; // name of the animation effect, e.g. "animationpack:Implode"
// to be set to TRUE for the window event animation list(s) that
// the new animation (value) should be added to
// (0: open, 1: close, 2: minimize, 3: shade, 4: focus)
Bool usedForEvents[AnimEventNum];
AnimEffectProperties properties;
} AnimEffectInfo;
typedef const AnimEffectInfo * AnimEffect;
typedef struct _ExtensionPluginInfo
{
unsigned int nEffects;
AnimEffect *effects;
// Plugin options to be used in "effect options" strings
unsigned int nEffectOptions;
CompOption *effectOptions;
// Non-window functions
void (*prePaintOutputFunc) (CompScreen *s, CompOutput *output);
} ExtensionPluginInfo;
typedef struct _xy_pair
{
float x, y;
} Point, Vector;
typedef struct
{
float x1, x2, y1, y2;
} Boxf;
typedef struct _xyz_tuple
{
float x, y, z;
} Point3d, Vector3d;
typedef struct _Object
{
Point gridPosition; // position on window in [0,1] range
Point3d position; // position on screen
// Texture x, y coordinates will be offset by given amounts
// for quads that fall after and before this object in x and y directions.
// Currently only y offset can be used.
Point offsetTexCoordForQuadBefore;
Point offsetTexCoordForQuadAfter;
} Object;
typedef struct _Model
{
Object *objects;
int numObjects;
int gridWidth;
int gridHeight;
int winWidth; // keeps win. size when model was created
int winHeight;
Vector scale;
Point scaleOrigin;
WindowEvent forWindowEvent;
float topHeight;
float bottomHeight;
} Model;
// Window properties common to multiple animation effects
typedef struct _AnimWindowCommon
{
float animTotalTime;
float animRemainingTime;
float timestep; // to be used in updateWindowAttribFunc
int animOverrideProgressDir; // 0: default dir, 1: forward, 2: backward
WindowEvent curWindowEvent;
AnimEffect curAnimEffect;
FragmentAttrib curPaintAttrib;
Region drawRegion;
Bool useDrawRegion;
XRectangle icon;
GLushort storedOpacity;
CompTransform transform;
Bool usingTransform; // whether transform matrix is used for the current effect
float transformStartProgress;
float transformProgress;
Model *model; // for grid engine
} AnimWindowCommon;
typedef enum
{
AnimDirectionDown = 0,
AnimDirectionUp,
AnimDirectionLeft,
AnimDirectionRight,
AnimDirectionRandom,
AnimDirectionAuto
} AnimDirection;
#define LAST_ANIM_DIRECTION 5
typedef void
(*UpdateBBProc) (CompOutput *output,
CompWindow * w,
Box *BB);
// Base functions for extension plugins to call
typedef struct _AnimBaseFunctions {
void (*addExtension) (CompScreen *s,
ExtensionPluginInfo *extensionPluginInfo);
void (*removeExtension) (CompScreen *s,
ExtensionPluginInfo *extensionPluginInfo);
CompOptionValue * (*getPluginOptVal)
(CompWindow *w, ExtensionPluginInfo *extensionPluginInfo, int optionId);
Bool (*getMousePointerXY) (CompScreen *s, short *x, short *y);
UpdateBBProc updateBBScreen;
UpdateBBProc updateBBWindow;
UpdateBBProc modelUpdateBB;
UpdateBBProc compTransformUpdateBB;
Bool (*defaultAnimInit) (CompWindow * w);
void (*defaultAnimStep) (CompWindow * w, float time);
void (*defaultUpdateWindowTransform) (CompWindow *w,
CompTransform *wTransform);
float (*getProgressAndCenter) (CompWindow *w,
Point *center);
float (*defaultAnimProgress) (CompWindow *w);
float (*sigmoidAnimProgress) (CompWindow *w);
float (*decelerateProgressCustom) (float progress,
float minx,
float maxx);
float (*decelerateProgress) (float progress);
AnimDirection (*getActualAnimDirection) (CompWindow * w,
AnimDirection dir,
Bool openDir);
void (*expandBoxWithBox) (Box *target, Box *source);
void (*expandBoxWithPoint) (Box *target, float fx, float fy);
void (*prepareTransform) (CompScreen *s,
CompOutput *output,
CompTransform *resultTransform,
CompTransform *transform);
AnimWindowCommon * (*getAnimWindowCommon) (CompWindow *w);
Bool (*returnTrue) (CompWindow *w);
void (*postAnimationCleanup) (CompWindow *w);
void (*fxZoomUpdateWindowAttrib) (CompWindow * w,
WindowPaintAttrib * wAttrib);
} AnimBaseFunctions;
#define OPTION_GETTERS(extensionBaseFunctions, \
extensionPluginInfo, firstEffectOption) \
static inline CompOptionValue * \
animGetOptVal (CompWindow *w, \
int optionId) \
{ \
return (extensionBaseFunctions)->getPluginOptVal \
(w, (extensionPluginInfo), optionId - (firstEffectOption)); \
} \
\
inline Bool \
animGetB (CompWindow *w, \
int optionId) \
{ \
return animGetOptVal (w, optionId)->b; \
} \
\
inline int \
animGetI (CompWindow *w, \
int optionId) \
{ \
return animGetOptVal (w, optionId)->i; \
} \
\
inline float \
animGetF (CompWindow *w, \
int optionId) \
{ \
return animGetOptVal (w, optionId)->f; \
} \
\
inline char * \
animGetS (CompWindow *w, \
int optionId) \
{ \
return animGetOptVal (w, optionId)->s; \
} \
\
inline unsigned short * \
animGetC (CompWindow *w, \
int optionId) \
{ \
return animGetOptVal (w, optionId)->c; \
}
#define OPTION_GETTERS_HDR \
\
inline Bool \
animGetB (CompWindow *w, \
int optionId); \
\
inline int \
animGetI (CompWindow *w, \
int optionId); \
\
inline float \
animGetF (CompWindow *w, \
int optionId); \
\
inline char * \
animGetS (CompWindow *w, \
int optionId); \
\
inline unsigned short * \
animGetC (CompWindow *w, \
int optionId);
#define WIN_X(w) ((w)->attrib.x - (w)->output.left)
#define WIN_Y(w) ((w)->attrib.y - (w)->output.top)
#define WIN_W(w) ((w)->width + (w)->output.left + (w)->output.right)
#define WIN_H(w) ((w)->height + (w)->output.top + (w)->output.bottom)
#define BORDER_X(w) ((w)->attrib.x - (w)->input.left)
#define BORDER_Y(w) ((w)->attrib.y - (w)->input.top)
#define BORDER_W(w) ((w)->width + (w)->input.left + (w)->input.right)
#define BORDER_H(w) ((w)->height + (w)->input.top + (w)->input.bottom)
#define RAND_FLOAT() ((float)rand() / RAND_MAX)
#define sigmoid(fx) (1.0f/(1.0f+exp(-5.0f*2*((fx)-0.5))))
#define sigmoid2(fx, s) (1.0f/(1.0f+exp(-(s)*2*((fx)-0.5))))
#define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption))
// ratio of perceived length of animation compared to real duration
// to make it appear to have the same speed with other animation effects
#define SPRINGY_ZOOM_PERCEIVED_T 0.55f
#define NONSPRINGY_ZOOM_PERCEIVED_T 0.6f
#define ZOOM_PERCEIVED_T 0.75f
#endif