Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
153 lines
3.2 KiB
C
153 lines
3.2 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// ImageLib Sources
|
|
// Copyright (C) 2000-2002 by Denton Woods
|
|
// Last modified: 05/25/2001 <--Y2K Compliant! =]
|
|
//
|
|
// Filename: src-IL/src/il_bits.c
|
|
//
|
|
// Description: Implements a file class that reads/writes bits directly.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#include "il_internal.h"
|
|
#include "il_bits.h"
|
|
|
|
|
|
// Opens a BITFILE just like fopen opens a FILE.
|
|
/*BITFILE *bopen(const char *FileName, const char *Mode)
|
|
{
|
|
BITFILE *ToReturn = NULL;
|
|
|
|
if (FileName != NULL) {
|
|
ToReturn = (BITFILE*)ialloc(sizeof(BITFILE));
|
|
if (ToReturn != NULL) {
|
|
iopenr((char*)FileName);
|
|
ToReturn->File = iGetFile();
|
|
ToReturn->BitPos = 0;
|
|
ToReturn->ByteBitOff = 8;
|
|
ToReturn->Buff = 0;
|
|
}
|
|
}
|
|
|
|
return ToReturn;
|
|
}*/
|
|
|
|
|
|
// Converts a FILE to a BITFILE.
|
|
BITFILE *bfile(ILHANDLE File)
|
|
{
|
|
BITFILE *ToReturn = NULL;
|
|
|
|
if (File != NULL) {
|
|
ToReturn = (BITFILE*)ialloc(sizeof(BITFILE));
|
|
if (ToReturn != NULL) {
|
|
ToReturn->File = File;
|
|
ToReturn->BitPos = itell() << 3;
|
|
ToReturn->ByteBitOff = 8;
|
|
ToReturn->Buff = 0;
|
|
}
|
|
}
|
|
|
|
return ToReturn;
|
|
}
|
|
|
|
|
|
// Closes an open BITFILE and frees memory for it.
|
|
ILint bclose(BITFILE *BitFile)
|
|
{
|
|
if (BitFile == NULL || BitFile->File == NULL)
|
|
return IL_EOF;
|
|
|
|
icloser(BitFile->File);
|
|
ifree(BitFile);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// Returns the current bit position of a BITFILE.
|
|
ILint btell(BITFILE *BitFile)
|
|
{
|
|
return BitFile->BitPos;
|
|
}
|
|
|
|
|
|
// Seeks in a BITFILE just like fseek for FILE.
|
|
ILint bseek(BITFILE *BitFile, ILuint Offset, ILuint Mode)
|
|
{
|
|
ILint KeepPos, Len;
|
|
|
|
if (BitFile == NULL || BitFile->File == NULL)
|
|
return 1;
|
|
|
|
switch (Mode)
|
|
{
|
|
case IL_SEEK_SET:
|
|
if (iseek(Offset >> 3, Mode)) {
|
|
BitFile->BitPos = Offset;
|
|
BitFile->ByteBitOff = BitFile->BitPos % 8;
|
|
}
|
|
break;
|
|
case IL_SEEK_CUR:
|
|
if (iseek(Offset >> 3, Mode)) {
|
|
BitFile->BitPos += Offset;
|
|
BitFile->ByteBitOff = BitFile->BitPos % 8;
|
|
}
|
|
break;
|
|
case IL_SEEK_END:
|
|
KeepPos = itell();
|
|
iseek(0, IL_SEEK_END);
|
|
Len = itell();
|
|
iseek(0, IL_SEEK_SET);
|
|
|
|
if (iseek(Offset >> 3, Mode)) {
|
|
BitFile->BitPos = (Len << 3) + Offset;
|
|
BitFile->ByteBitOff = BitFile->BitPos % 8;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// hehe, "bread". It reads data into Buffer from the BITFILE, just like fread for FILE.
|
|
ILint bread(ILvoid *Buffer, ILuint Size, ILuint Number, BITFILE *BitFile)
|
|
{
|
|
|
|
//Note that this function is somewhat useless: In binary image
|
|
|
|
//formats, there are some pad bits after each scanline. This
|
|
|
|
//function does not take that into account, so...
|
|
|
|
|
|
ILuint BuffPos = 0, Count = Size * Number;
|
|
|
|
while (BuffPos < Count) {
|
|
if (BitFile->ByteBitOff < 0 || BitFile->ByteBitOff > 7) {
|
|
BitFile->ByteBitOff = 7;
|
|
if (iread(&BitFile->Buff, 1, 1) != 1) // Reached eof or error...
|
|
return BuffPos;
|
|
}
|
|
|
|
*((ILubyte*)(Buffer) + BuffPos) = (ILubyte)!!(BitFile->Buff & (1 << BitFile->ByteBitOff));
|
|
|
|
BuffPos++;
|
|
BitFile->ByteBitOff--;
|
|
}
|
|
|
|
return BuffPos;
|
|
}
|
|
|
|
|
|
// Not implemented yet.
|
|
/*ILint bwrite(ILvoid *Buffer, ILuint Size, ILuint Number, BITFILE *BitFile)
|
|
{
|
|
|
|
|
|
return 0;
|
|
}*/
|