static off_t PixelIndex(FloatPixMapRef pm, FPMPoint pt)
{
	FPM_INTERNAL_ASSERT(pm != NULL);
	FPM_INTERNAL_ASSERT(PointInRange(pm, pt));
	
	return pm->width * pt.y + pt.x;
}
static bool PointInRange(FloatPixMapRef pm, FPMPoint pt)
{
	FPM_INTERNAL_ASSERT(pm != NULL);
	
	return 0 <= pt.x && pt.x < pm->width &&
	0 <= pt.y && pt.y < pm->height;
}
static FloatPixMapRef MakeFPM(FPMSize size, FPMDimension rowCount, FPMColor *pixels, FloatPixMapRef master)
{
	FloatPixMapRef result = malloc(sizeof (FloatPixMap));
	if (result != NULL)
	{
		FPM_INTERNAL_ASSERT(FPMSizeArea(size) == 0 || pixels != NULL);
		FPM_INTERNAL_ASSERT(size.width <= rowCount);
		
		result->retainCount = 1;
		result->width = size.width;
		result->height = size.height;
		result->rowCount = rowCount;
		result->pixels = pixels;
		result->master = FPMRetain(master);
	}
	
	return result;
}
static void Destroy(FloatPixMapRef pm)
{
	FPM_INTERNAL_ASSERT(pm != NULL);
	
	// Only "masterless" FPMs own their pixels.
	if (pm->master == NULL)
	{
		free(pm->pixels);
	}
	else
	{
		FPMRelease(&pm->master);
	}
	
	free(pm);
}
Ejemplo n.º 5
0
static FloatPixMapRef ConvertPNGDataRGB16(FloatPixMapRef pm, uint8_t *data, size_t width, size_t height, size_t rowBytes)
{
    uint16_t			*src = NULL;
    float				*dst = NULL;
    size_t				x, y;

    for (y = 0; y < height; y++)
    {
        src = (uint16_t *)(data + rowBytes * y);
        dst = (float *)FPMGetPixelPointerC(pm, 0, y);
        FPM_INTERNAL_ASSERT(src != NULL && dst != NULL);

        for (x = 0; x < width * 3; x++)
        {
            *dst++ = (float)*src++ * 1.0f/65535.0f;
        }
    }

    return pm;
}
static size_t GetPixelCount(FloatPixMapRef pm)
{
	FPM_INTERNAL_ASSERT(pm != NULL);
	
	return pm->width * pm->height;
}