// not an icns file...
return NULL;
}
-
+
FetchPixelSize = IconSize;
for (;;) {
DataPtr = NULL;
DataLen = 0;
MaskPtr = NULL;
MaskLen = 0;
-
+
Ptr = FileData + 8;
BufferEnd = FileData + FileDataLength;
// iterate over tagged blocks in the file
BlockLen = ((UINT32)Ptr[4] << 24) + ((UINT32)Ptr[5] << 16) + ((UINT32)Ptr[6] << 8) + (UINT32)Ptr[7];
if (Ptr + BlockLen > BufferEnd) // block continues beyond end of file
break;
-
+
// extract the appropriate blocks for each pixel size
if (FetchPixelSize == 128) {
if (Ptr[0] == 'i' && Ptr[1] == 't' && Ptr[2] == '3' && Ptr[3] == '2') {
MaskPtr = Ptr + 8;
MaskLen = BlockLen - 8;
}
-
+
} else if (FetchPixelSize == 48) {
if (Ptr[0] == 'i' && Ptr[1] == 'h' && Ptr[2] == '3' && Ptr[3] == '2') {
DataPtr = Ptr + 8;
MaskPtr = Ptr + 8;
MaskLen = BlockLen - 8;
}
-
+
} else if (FetchPixelSize == 32) {
if (Ptr[0] == 'i' && Ptr[1] == 'l' && Ptr[2] == '3' && Ptr[3] == '2') {
DataPtr = Ptr + 8;
MaskPtr = Ptr + 8;
MaskLen = BlockLen - 8;
}
-
+
} else if (FetchPixelSize == 16) {
if (Ptr[0] == 'i' && Ptr[1] == 's' && Ptr[2] == '3' && Ptr[3] == '2') {
DataPtr = Ptr + 8;
MaskPtr = Ptr + 8;
MaskLen = BlockLen - 8;
}
-
+
}
-
+
Ptr += BlockLen;
}
-
+
/* FUTURE: try to load a different size and scale it later
if (DataPtr == NULL && FetchPixelSize == 32) {
FetchPixelSize = 128;
*/
break;
}
-
+
if (DataPtr == NULL)
return NULL; // no image found
-
+
// allocate image structure and buffer
NewImage = egCreateImage(FetchPixelSize, FetchPixelSize, WantAlpha);
if (NewImage == NULL)
return NULL;
PixelCount = FetchPixelSize * FetchPixelSize;
-
+
if (DataLen < PixelCount * 3) {
-
+
// pixel data is compressed, RGB planar
CompData = DataPtr;
CompLen = DataLen;
if (CompLen > 0) {
Print(L" egLoadICNSIcon: %d bytes of compressed data left\n", CompLen);
}
-
+
} else {
-
+
// pixel data is uncompressed, RGB interleaved
SrcPtr = DataPtr;
DestPtr = NewImage->PixelData;
DestPtr->g = *SrcPtr++;
DestPtr->b = *SrcPtr++;
}
-
+
}
-
+
// add/set alpha plane
if (MaskPtr != NULL && MaskLen >= PixelCount && WantAlpha)
egInsertPlane(MaskPtr, PLPTR(NewImage, a), PixelCount);
else
egSetPlane(PLPTR(NewImage, a), WantAlpha ? 255 : 0, PixelCount);
-
+
// FUTURE: scale to originally requested size if we had to load another size
-
+
return NewImage;
}