Now that the pressure curve contains 65K points it takes up quite a bit
of memory, especially considering that the pressure curve may not need
to exist for some devices (e.g. pads) and may just be the default linear
curve even for those where it should exist. To reduce the amount of
memory used, we now lazily allocate space for the pressure curve tables
only when they are set to a non-default curve.

Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
Changes from v2:
 * Use affirmative (instead of negating) check for default (0,0,100,100)
   case.
 * Shuffle code to reduce duplication.
 * Log warning in case of memory allocation failure.
 * Be even lazier (don't go through a free/calloc cycle if pPressCurve is
   already allocated).

Peter:
 I'm not totally happy with leaving the nPressCtrl points set to the wrong
 value if a memory allocation failure happens. I suppose strict correctness
 is probably moot in this situation since the server probably isn't long
 for this world once we can't allocate a few hundred KB, but still... :/

 I've re-shuffled things to try and minimize the amount of repeating of
 myself -- let me know if its any better.

 src/wcmCommon.c     |  5 ++++-
 src/wcmFilter.c     | 38 +++++++++++++++++++++++++-------------
 src/xf86WacomDefs.h |  3 +--
 3 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/wcmCommon.c b/src/wcmCommon.c
index 0ba0304..28e5488 100644
--- a/src/wcmCommon.c
+++ b/src/wcmCommon.c
@@ -1395,7 +1395,10 @@ static int applyPressureCurve(WacomDevicePtr pDev, const 
WacomDeviceStatePtr pSt
        p = min(FILTER_PRESSURE_RES, p);
 
        /* apply pressure curve function */
-       return pDev->pPressCurve[p];
+       if (pDev->pPressCurve == NULL)
+               return p;
+       else
+               return pDev->pPressCurve[p];
 }
 
 /*****************************************************************************
diff --git a/src/wcmFilter.c b/src/wcmFilter.c
index e55ef0f..aca5cd9 100644
--- a/src/wcmFilter.c
+++ b/src/wcmFilter.c
@@ -54,23 +54,35 @@ int wcmCheckPressureCurveValues(int x0, int y0, int x1, int 
y1)
 void wcmSetPressureCurve(WacomDevicePtr pDev, int x0, int y0,
        int x1, int y1)
 {
-       int i;
-
        /* sanity check values */
        if (!wcmCheckPressureCurveValues(x0, y0, x1, y1))
                return;
 
-       /* linear by default */
-       for (i=0; i<=FILTER_PRESSURE_RES; ++i)
-               pDev->pPressCurve[i] = i;
-
-       /* draw bezier line from bottom-left to top-right using ctrl points */
-       filterCurveToLine(pDev->pPressCurve,
-               FILTER_PRESSURE_RES,
-               0.0, 0.0,               /* bottom left  */
-               x0/100.0, y0/100.0,     /* control point 1 */
-               x1/100.0, y1/100.0,     /* control point 2 */
-               1.0, 1.0);              /* top right */
+       /* A NULL pPressCurve indicates the (default) linear curve */
+       if (x0 == 0 && y0 == 0 && x1 == 100 && y1 == 100) {
+               free(pDev->pPressCurve);
+               pDev->pPressCurve = NULL;
+       }
+       else if (!pDev->pPressCurve) {
+               pDev->pPressCurve = calloc(FILTER_PRESSURE_RES+1, 
sizeof(*pDev->pPressCurve));
+
+               if (!pDev->pPressCurve) {
+                       LogMessageVerbSigSafe(X_WARNING, 0,
+                                             "Unable to allocate memory for 
pressure curve; using default.\n");
+                       x0 = 0;
+                       y0 = 0;
+                       x1 = 100;
+                       y1 = 100;
+               }
+       }
+
+       if (pDev->pPressCurve)
+               filterCurveToLine(pDev->pPressCurve,
+                               FILTER_PRESSURE_RES,
+                               0.0, 0.0,               /* bottom left  */
+                               x0/100.0, y0/100.0,     /* control point 1 */
+                               x1/100.0, y1/100.0,     /* control point 2 */
+                               1.0, 1.0);              /* top right */
 
        pDev->nPressCtrl[0] = x0;
        pDev->nPressCtrl[1] = y0;
diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
index 3961545..b10a114 100644
--- a/src/xf86WacomDefs.h
+++ b/src/xf86WacomDefs.h
@@ -285,8 +285,7 @@ struct _WacomDeviceRec
        struct _WacomDeviceState oldState; /* previous state information */
        int oldCursorHwProx;    /* previous cursor hardware proximity */
 
-       /* JEJ - filters */
-       int pPressCurve[FILTER_PRESSURE_RES + 1]; /* pressure curve */
+       int *pPressCurve;       /* pressure curve */
        int nPressCtrl[4];      /* control points for curve */
        int minPressure;        /* the minimum pressure a pen may hold */
        int oldMinPressure;     /* to record the last minPressure before going 
out of proximity */
-- 
2.10.1


------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to