public static void Expand(CompressionHeader *header, VoidPtr dstAddress, int dstLen) { uint total = 0; VoidPtr ceil = dstAddress + dstLen; if (header->Parameter != 1) { byte *pSrc = (byte *)header->Data; byte *pDst = (byte *)dstAddress; do { total += *pSrc++; *pDst++ = (byte)total; }while (pSrc < (byte *)ceil); } else { bushort *pSrc = (bushort *)header->Data; bushort *pDst = (bushort *)dstAddress; do { total += *pSrc++; *pDst++ = (ushort)total; }while ((byte *)pSrc < (byte *)ceil); } }
public Bitmap GetImage() { var b = new Bitmap(96, 32, PixelFormat.Format16bppArgb1555); BitmapData data = b.LockBits(new Rectangle(0, 0, 96, 32), ImageLockMode.ReadWrite, PixelFormat.Format16bppArgb1555); bushort *pixels = imageData; for (int colblock = 0; colblock < 8; colblock++) { ushort *row0 = (ushort *)data.Scan0 + 384 * colblock; ushort *row1 = row0 + 96; ushort *row2 = row1 + 96; ushort *row3 = row2 + 96; for (int rowblock = 0; rowblock < 24; rowblock++) { for (int i = 0; i < 4; i++) { *row0++ = *pixels++; } for (int i = 0; i < 4; i++) { *row1++ = *pixels++; } for (int i = 0; i < 4; i++) { *row2++ = *pixels++; } for (int i = 0; i < 4; i++) { *row3++ = *pixels++; } } } b.UnlockBits(data); return(b); }
private static void DecodeFrames(KeyframeCollection kf, void *dataAddr, AnimDataFormat format, params int[] arrays) { int fCount; float vStep, vBase; switch (format) { case AnimDataFormat.I4: { I4Header *header = (I4Header *)dataAddr; fCount = header->_entries; vStep = header->_step; vBase = header->_base; foreach (int x in arrays) { I4Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(x, entry->FrameIndex, vBase + entry->Step * vStep, true)._tangent = entry->Tangent; } } break; } case AnimDataFormat.I6: { I6Header *header = (I6Header *)dataAddr; fCount = header->_numFrames; vStep = header->_step; vBase = header->_base; foreach (int x in arrays) { I6Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(x, entry->FrameIndex, vBase + entry->_step * vStep, true)._tangent = entry->Tangent; } } break; } case AnimDataFormat.I12: { I12Header *header = (I12Header *)dataAddr; fCount = header->_numFrames; foreach (int x in arrays) { I12Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(x, (int)entry->_index, entry->_value, true)._tangent = entry->_tangent; } } break; } case AnimDataFormat.L1: { L1Header *header = (L1Header *)dataAddr; vStep = header->_step; vBase = header->_base; foreach (int x in arrays) { byte *sPtr = header->Data; for (int i = 0; i < kf.FrameLimit; i++) { kf.SetFrameValue(x, i, vBase + *sPtr++ *vStep, true).GenerateTangent(); } } break; } case AnimDataFormat.L2: { L1Header *header = (L1Header *)dataAddr; vStep = header->_step; vBase = header->_base; foreach (int x in arrays) { bushort *sPtr = (bushort *)header->Data; for (int i = 0; i < kf.FrameLimit; i++) { kf.SetFrameValue(x, i, vBase + *sPtr++ *vStep, true).GenerateTangent(); } } break; } case AnimDataFormat.L4: { foreach (int x in arrays) { bfloat *sPtr = (bfloat *)dataAddr; for (int i = 0; i < kf.FrameLimit; i++) { kf.SetFrameValue(x, i, *sPtr++, true).GenerateTangent(); } } break; } } }
private static void DecodeCHR0Frames(KeyframeCollection kf, void *dataAddr, AnimDataFormat format, KeyFrameMode mode) { int fCount; float vStep, vBase; switch (format) { case AnimDataFormat.I4: { I4Header *header = (I4Header *)dataAddr; fCount = header->_entries; vStep = header->_step; vBase = header->_base; I4Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->Step * vStep))._tangent = entry->Tangent; } break; } case AnimDataFormat.I6: { I6Header *header = (I6Header *)dataAddr; fCount = header->_numFrames; vStep = header->_step; vBase = header->_base; I6Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->_step * vStep))._tangent = entry->Tangent; } break; } case AnimDataFormat.I12: { I12Header *header = (I12Header *)dataAddr; fCount = header->_numFrames; I12Entry *entry = header->Data; for (int i = 0; i < fCount; i++, entry++) { kf.SetFrameValue(mode, (int)entry->_index, entry->_value)._tangent = entry->_tangent; } break; } case AnimDataFormat.L1: { L1Header *header = (L1Header *)dataAddr; vStep = header->_step; vBase = header->_base; byte *sPtr = header->Data; for (int i = 0; i < kf.FrameCount; i++) { kf[mode, i] = vBase + (*sPtr++ *vStep); } KeyframeEntry root = kf._keyRoots[(int)mode & 0xF]; for (KeyframeEntry entry = root._next; entry != root; entry = entry._next) { entry.GenerateTangent(); } break; } case AnimDataFormat.L2: { L1Header *header = (L1Header *)dataAddr; vStep = header->_step; vBase = header->_base; bushort *sPtr = (bushort *)header->Data; for (int i = 0; i < kf.FrameCount; i++) { kf[mode, i] = vBase + (*sPtr++ *vStep); } KeyframeEntry root = kf._keyRoots[(int)mode & 0xF]; for (KeyframeEntry entry = root._next; entry != root; entry = entry._next) { entry.GenerateTangent(); } break; } case AnimDataFormat.L4: { bfloat *sPtr = (bfloat *)dataAddr; for (int i = 0; i < kf.FrameCount; i++) { kf[mode, i] = *sPtr++; } KeyframeEntry root = kf._keyRoots[(int)mode & 0xF]; for (KeyframeEntry entry = root._next; entry != root; entry = entry._next) { entry.GenerateTangent(); } break; } } }