Applies a symmetric piecewise gamma function to a Planar16Q12 image.


func vImageSymmetricPiecewiseGamma_Planar16Q12(_ src: UnsafePointer<vImage_Buffer>, _ dest: UnsafePointer<vImage_Buffer>, _ exponentialCoeffs: UnsafePointer<Float>, _ gamma: Float, _ linearCoeffs: UnsafePointer<Float>, _ boundary: Pixel_16S, _ flags: vImage_Flags) -> vImage_Error



A pointer to a vImage buffer structure that contains the source image.


A pointer to a vImage buffer data structure. You're responsible for filling out the height, width, and rowBytes fields of this structure, and for allocating a data buffer of the appropriate size. On return, the data buffer this structure points to contains the destination image data. When you no longer need the data buffer, you must deallocate the memory.


An array of three floating-point coefficients for the gamma curve.


The exponent of a power function for calculating gamma correction.


An array of two floating-point coefficients for the linear curve.


The boundary value for switching from linear to gamma curve.


The options to use when performing the operation. If you plan to perform your own tiling or use multithreading, pass kvImageDoNotTile.

Return Value

kvImageNoError; otherwise, one of the error codes described in Data Types and Constants.


The symmetric piecewise gamma calculation combines a linear and an exponential (gamma) curve on two regions of the input interval, separated by a specified boundary value. When the input magnitude is greater than or equal to the boundary value, the gamma curve is used to generate the output. Otherwise, the linear curve is used. The result is clamped to [0, FMT_MAX] and assigned the sign of the input value. This creates a curve which is symmetric about the origin, with discontinuities flattened to the x-axis.

For each pixel, given that x is the value of the source pixel, the operation can be described as:

y = fabsf(x)
if y < boundary:
    t = linearCoeffs[0]*y + linearCoeffs[1]
    s = exponentialCoeffs[0]*y + exponentialCoeffs[1]
    t = pow(t, gamma) + exponentialCoeffs[2]

r = MAX(t, 0) * copysignf(1.0f, x)
output pixel value = r

This function will work in place, provided that src->data = dest->data and src->rowBytes = dest->rowBytes.

See Also

Correcting Gamma

func vImageDestroyGammaFunction(GammaFunction!)

Destroys a gamma function object created.