void SplashInitFrameShape(Splash * splash, int imageIndex) { ImageRect maskRect; XRectangle *rects; SplashImage *frame = splash->frames + imageIndex; frame->rects = NULL; frame->numRects = 0; if (!splash->maskRequired) return; if (!shapeSupported) return; initRect(&maskRect, 0, 0, splash->width, splash->height, 1, splash->width * splash->imageFormat.depthBytes, splash->frames[imageIndex].bitmapBits, &splash->imageFormat); if (!IS_SAFE_SIZE_MUL(splash->width / 2 + 1, splash->height)) { return; } rects = SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(XRectangle), (splash->width / 2 + 1) * splash->height); if (!rects) { return; } frame->numRects = BitmapToYXBandedRectangles(&maskRect, rects); frame->rects = SAFE_SIZE_ARRAY_ALLOC(malloc, frame->numRects, sizeof(XRectangle)); if (frame->rects) { // handle the error after the if(){} memcpy(frame->rects, rects, frame->numRects * sizeof(XRectangle)); } free(rects); }
void SplashInitFrameShape(Splash * splash, int imageIndex) { RGNDATA *pRgnData; RGNDATAHEADER *pRgnHdr; ImageRect maskRect; if (!splash->maskRequired) return; /* reserving memory for the worst case */ if (!IS_SAFE_SIZE_MUL(splash->width / 2 + 1, splash->height)) { return; } pRgnData = (RGNDATA *) SAFE_SIZE_STRUCT_ALLOC(malloc, sizeof(RGNDATAHEADER), sizeof(RECT), (splash->width / 2 + 1) * splash->height); if (!pRgnData) { return; } pRgnHdr = (RGNDATAHEADER *) pRgnData; initRect(&maskRect, 0, 0, splash->width, splash->height, 1, splash->width * splash->imageFormat.depthBytes, splash->frames[imageIndex].bitmapBits, &splash->imageFormat); pRgnHdr->dwSize = sizeof(RGNDATAHEADER); pRgnHdr->iType = RDH_RECTANGLES; pRgnHdr->nRgnSize = 0; pRgnHdr->rcBound.top = 0; pRgnHdr->rcBound.left = 0; pRgnHdr->rcBound.bottom = splash->height; pRgnHdr->rcBound.right = splash->width; pRgnHdr->nCount = BitmapToYXBandedRectangles(&maskRect, (RECT *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER))); splash->frames[imageIndex].hRgn = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + sizeof(RECT) * pRgnHdr->nCount, pRgnData); free(pRgnData); }
void SplashInitFrameShape(Splash * splash, int imageIndex) { ImageRect maskRect; XRectangle *rects; SplashImage *frame = splash->frames + imageIndex; frame->rects = NULL; frame->numRects = 0; if (!splash->maskRequired) return; if (!shapeSupported) return; initRect(&maskRect, 0, 0, splash->width, splash->height, 1, splash->width * splash->imageFormat.depthBytes, splash->frames[imageIndex].bitmapBits, &splash->imageFormat); rects = malloc(sizeof(XRectangle) * (splash->width / 2 + 1) * splash->height); frame->numRects = BitmapToYXBandedRectangles(&maskRect, rects); frame->rects = malloc(frame->numRects * sizeof(XRectangle)); memcpy(frame->rects, rects, frame->numRects * sizeof(XRectangle)); free(rects); }