1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/* damage layer to interface for drivers */
/* needs to call up and register damage in the impedance layer against the main object */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "mi.h"
#include "regionstr.h"
#include "globals.h"
#include "gcstruct.h"
#include "pixmapstr.h"
#include "damagestr.h"
#include "drv_damage.h"
#include "drv_damagestr.h"
#include "drv_scrnintstr.h"
#include "drv_pixmapstr.h"
#include "drv_types.h"
static void
drv_damage_report(DamagePtr pDamage, RegionPtr pRegion, void *closure)
{
DrvDamagePtr pDrvDamage = closure;
pDrvDamage->damageReport(pDrvDamage, pRegion, pDrvDamage->closure);
}
DrvDamagePtr
DrvDamageCreate (DrvDamageReportFunc damageReport,
DrvDamageDestroyFunc damageDestroy,
DamageReportLevel damageLevel,
Bool isInternal,
DrvScreenPtr pScreen,
void *closure)
{
DrvDamagePtr pDamage;
pDamage = dixAllocateObjectWithPrivates(DrvDamageRec, PRIVATE_DRV_DAMAGE);
if (!pDamage)
return 0;
pDamage->damageReport = damageReport;
pDamage->damageDestroy = damageDestroy;
pDamage->closure = closure;
/* have to register highlevel damage reporting function
how to link back which pixmap to report damage on though
*/
pDamage->pParent = DamageCreate(drv_damage_report, NULL, damageLevel,
isInternal, pScreen->pScreen, pDamage);
return pDamage;
}
void
DrvDamageRegister (DrvPixmapPtr pPixmap,
DrvDamagePtr pDamage)
{
if (!pPixmap || !pPixmap->protoPixmap)
return;
DamageRegister(&(pPixmap->protoPixmap->drawable), pDamage->pParent);
}
void
DrvDamageUnregister (DrvPixmapPtr pPixmap,
DrvDamagePtr pDamage)
{
DamageUnregister(&(pPixmap->protoPixmap->drawable), pDamage->pParent);
}
void
DrvDamageDestroy (DrvDamagePtr pDamage)
{
DamageDestroy(pDamage->pParent);
dixFreeObjectWithPrivates(pDamage, PRIVATE_DRV_DAMAGE);
}
void
DrvDamageSetReportAfterOp (DrvDamagePtr pDamage, Bool reportAfter)
{
pDamage->pParent->reportAfter = reportAfter;
}
extern _X_EXPORT void
DrvDamageRegionAppend (DrvPixmapPtr pPixmap, RegionPtr pRegion)
{
if (pPixmap->protoPixmap)
return DamageRegionAppend(&(pPixmap->protoPixmap->drawable), pRegion);
}
RegionPtr
DrvDamagePendingRegion (DrvDamagePtr pDamage)
{
return DamagePendingRegion(pDamage->pParent);
}
RegionPtr
DrvDamageRegion (DrvDamagePtr pDamage)
{
return DamageRegion(pDamage->pParent);
}
void
DrvDamageEmpty (DrvDamagePtr pDamage)
{
DamageEmpty(pDamage->pParent);
}
void
DrvDamageRegionProcessPending (DrvPixmapPtr pPixmap)
{
if (pPixmap->protoPixmap)
DamageRegionProcessPending(&(pPixmap->protoPixmap->drawable));
}
|