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); }
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; }