summaryrefslogtreecommitdiff
path: root/drv/drv_damage.c
blob: d95ae1f44ed1407f9a2b2d3118addb83db0d8aea (plain)
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));
}