/*! * pixResizeImageData() * * Input: pixd (gets new uninitialized buffer for image data) * pixs (determines the size of the buffer; not changed) * Return: 0 if OK, 1 on error * * Notes: * (1) This removes any existing image data from pixd and * allocates an uninitialized buffer that will hold the * amount of image data that is in pixs. */ LEPTONICA_EXPORT l_int32 pixResizeImageData(PIX *pixd, PIX *pixs) { l_int32 w, h, d, wpl, bytes; l_uint32 *data; PROCNAME("pixResizeImageData"); if (!pixs) return ERROR_INT("pixs not defined", procName, 1); if (!pixd) return ERROR_INT("pixd not defined", procName, 1); if (pixSizesEqual(pixs, pixd)) /* nothing to do */ return 0; pixGetDimensions(pixs, &w, &h, &d); wpl = pixGetWpl(pixs); pixSetWidth(pixd, w); pixSetHeight(pixd, h); pixSetDepth(pixd, d); pixSetWpl(pixd, wpl); bytes = 4 * wpl * h; if ((data = pixGetData(pixd)) != NULL) { pix_free(data); pixd->data = NULL; } if ((data = (l_uint32 *)pix_malloc(bytes)) == NULL) return ERROR_INT("pix_malloc fail for data", procName, 1); pixSetData(pixd, data); return 0; }
/*! * pixFreeData() * * Notes: * (1) This frees the data and sets the pix data ptr to null. * It should be used before pixSetData() in the situation where * you want to free any existing data before doing * a subsequent assignment with pixSetData(). */ l_int32 pixFreeData(PIX *pix) { l_uint32 *data; PROCNAME("pixFreeData"); if (!pix) return ERROR_INT("pix not defined", procName, 1); if ((data = pixGetData(pix)) != NULL) { pix_free(data); pix->data = NULL; } return 0; }
/*! * pixFree() * * Input: pix * Return: void * * Notes: * (1) Decrements the ref count and, if 0, destroys the pix. */ static void pixFree(PIX *pix) { l_uint32 *data; char *text; if (!pix) return; pixChangeRefcount(pix, -1); if (pixGetRefcount(pix) <= 0) { if ((data = pixGetData(pix)) != NULL) pix_free(data); if ((text = pixGetText(pix)) != NULL) FREE(text); pixDestroyColormap(pix); FREE(pix); } return; }