Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

529 lines
16 KiB

/*
$Log: S:\oiwh\filing\fiotga.c_v $
*
* Rev 1.5 22 Aug 1995 15:38:32 RWR
* Change _fmemset() to memset() for Windows 95
*
* Rev 1.4 12 Jul 1995 16:57:18 RWR
* Switch from \include\oiutil.h to (private) \filing\fileutil.h
*
* Rev 1.3 23 Jun 1995 10:40:14 RWR
* Change "wiisfio2.h" include file to "filing.h"
*
* Rev 1.2 24 Apr 1995 15:41:44 JCW
* Removed the oiuidll.h.
* Rename wiissubs.h to oiutil.h.
*
* Rev 1.1 14 Apr 1995 22:13:46 JAR
* made compile in windows 95
*
* Rev 1.0 06 Apr 1995 13:55:52 JAR
* Initial entry
*/
#include "abridge.h"
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <memory.h>
#include "wic.h"
#include "filing.h"
#include "fileutil.h"
#include "oierror.h"
#define pixels2bytes(n) ((n+7)/8)
#define RGB_SIZE 3
typedef struct
{
char imagetype;
unsigned int width;
unsigned int depth;
char bits;
char descriptor;
} TGAHEAD;
typedef struct
{
char far *tgasrc;
char far *tgasrcptr;
unsigned int tgalinewidth;
unsigned int tgapagedepth;
long left_in_buf;
long left_in_file;
long start_byte;
long strip_size;
HWND hWindow;
} TGA_DATA, FAR *LP_TGA_DATA;
int tgagetc (LP_FIO_DATA pdata, LP_TGA_DATA lpTgaData)
{
int temp;
int errcode = 0;
if (lpTgaData->left_in_buf <= 0)
{
if (lpTgaData->left_in_file <= 0)
return((int) -1);
if ((lpTgaData->left_in_buf = wgfsread(lpTgaData->hWindow, (int) pdata->filedes, (char far *)lpTgaData->tgasrc,
(long) lpTgaData->start_byte, lpTgaData->strip_size,
&(lpTgaData->left_in_file), 1, &errcode)) <= 0)
{
return((int) -1);
}
else
{
lpTgaData->start_byte += lpTgaData->left_in_buf;
lpTgaData->strip_size = min(lpTgaData->strip_size, lpTgaData->left_in_file);
}
lpTgaData->tgasrcptr = lpTgaData->tgasrc;
}
temp = ((unsigned char)*(lpTgaData->tgasrcptr));
++(lpTgaData->tgasrcptr);
--(lpTgaData->left_in_buf);
return(temp);
}
unsigned int tgaread(char far *dest, unsigned int count, LP_FIO_DATA pdata,
LP_TGA_DATA lpTgaData)
{
int errcode = 0;
unsigned int i;
unsigned int total_count;
char far *dptr;
char far *sptr;
dptr = dest;
total_count = count;
if ((long) count > lpTgaData->left_in_buf)
{
if (lpTgaData->left_in_file <= 0)
return(0);
sptr = lpTgaData->tgasrcptr;
for (i = 0; (long) i < lpTgaData->left_in_buf; ++i)
{
*dptr = *sptr;
++dptr;
++sptr;
}
count -= ((unsigned int) lpTgaData->left_in_buf);
if ((lpTgaData->left_in_buf = wgfsread(lpTgaData->hWindow, (int) pdata->filedes, (char far *) lpTgaData->tgasrc,
(long) lpTgaData->start_byte, lpTgaData->strip_size,
&(lpTgaData->left_in_file), 1, &errcode)) <= 0)
{
return(0);
}
else
{
lpTgaData->start_byte += lpTgaData->left_in_buf;
lpTgaData->strip_size = min(lpTgaData->strip_size, lpTgaData->left_in_file);
}
lpTgaData->tgasrcptr = lpTgaData->tgasrc;
}
sptr = lpTgaData->tgasrcptr;
for (i = 0; i < count; ++i)
{
*dptr = *sptr;
++dptr;
++sptr;
}
lpTgaData->tgasrcptr += count;
lpTgaData->left_in_buf -= count;
return (total_count);
}
#define tgagetw(pdata, lpTgaData) (tgagetc(pdata, lpTgaData) + (tgagetc(pdata, lpTgaData) << 8))
// 9504.13 jar no huge Hugo!
//int tgaputline(char far *p, char huge * pl, unsigned int n, char upsidedown, LP_TGA_DATA lpTgaData)
int tgaputline(char far *p, char * pl, unsigned int n, char upsidedown, LP_TGA_DATA lpTgaData)
{
// 9504.13 jar no huge Hugo!
//char huge *pr;
char *pr;
unsigned int i;
if(pl != NULL)
{
if (upsidedown)
pr=pl+(long)lpTgaData->tgalinewidth*(long)(n);
else
pr=pl+(long)lpTgaData->tgalinewidth*(long)(lpTgaData->tgapagedepth-n-1);
for(i=0;i<lpTgaData->tgalinewidth;++i)
*pr++=*p++;
}
return(0);
}
int TGAReadLine(char far *, TGAHEAD far *, LP_FIO_DATA, LP_TGA_DATA);
void TGAReverse(char far *, TGAHEAD far *);
WORD ReadTga(HWND hWnd, lp_INFO lpGFSInfo, LP_FIO_DATA pdata,
LPSTR lpDest, LPSTR lpSrc, LPINT read_from_line, LPINT this_many_lines)
{
char first = 0;
char upsidedown = 0;
int i;
int linewidth;
int lines = 0;
int errcode = 0;
long bytestoget;
long size;
TGAHEAD tga;
char far *linebuffer;
// 9504.13 jar no huge Hugo!
//static char huge *lpTempDest;
//char huge *tempptr;
char *tempptr;
TGA_DATA TgaData;
// _fmemset((char FAR *) &tga, 0, sizeof(tga));
memset((char FAR *) &tga, 0, sizeof(tga));
tga.imagetype = lpGFSInfo->_file.fmt.tga.imagetype;
tga.width = (unsigned int) lpGFSInfo->horiz_size;
tga.depth = (unsigned int) lpGFSInfo->vert_size;
tga.bits = lpGFSInfo->_file.fmt.tga.bits;
tga.descriptor = lpGFSInfo->_file.fmt.tga.descriptor;
if(tga.bits == 1)
linewidth = pixels2bytes(tga.width);
else if(tga.bits > 1 && tga.bits <= 4)
linewidth = pixels2bytes(tga.width) << 2;
else if(tga.bits > 4 && tga.bits <= 8)
linewidth = tga.width;
else
linewidth = tga.width * RGB_SIZE;
if (linewidth & 0x0003)
linewidth = (linewidth | 3) + 1;
size = (long) linewidth * (long) (tga.depth + 1);
TgaData.tgalinewidth = linewidth;
TgaData.tgapagedepth = tga.depth;
if(tga.descriptor & 0x20)
upsidedown = 1;
if (*read_from_line == 0)
first = 1;
while (lines != *this_many_lines)
{
if (first)
{
if((linebuffer = (char far *) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
max(tga.width, (unsigned) TgaData.tgalinewidth))) == NULL)
{
return(FIO_GLOBAL_ALLOC_FAILED);
}
TgaData.tgasrc = lpSrc;
TgaData.tgasrcptr = TgaData.tgasrc;
TgaData.strip_size = (unsigned long) pdata->CmpBuffersize;
TgaData.start_byte = 0;
TgaData.left_in_file = 0;
TgaData.left_in_buf = 0;
TgaData.hWindow = hWnd;
if ((TgaData.left_in_buf = wgfsread(hWnd, (int)pdata->filedes, (char far *)lpSrc,
(long)TgaData.start_byte, TgaData.strip_size,
&(TgaData.left_in_file),
(unsigned short)pdata->pgnum, &errcode)) <= 0)
{
GlobalFreePtr((char far *) linebuffer);
return errcode;
}
else
{
TgaData.start_byte += TgaData.left_in_buf;
TgaData.strip_size = min(TgaData.strip_size, TgaData.left_in_file);
}
// 9504.13 jar no huge Hugo!
//if((lpTempDest = (char huge *) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
// 9504.14 jar get this pointer from pdata!
//if((lpTempDest = (char *) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
if((pdata->lpTempDest = (char *) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
size)) == NULL)
{
GlobalFreePtr((char far *) linebuffer);
return(FIO_GLOBAL_ALLOC_FAILED);
}
for (i = 0; (unsigned) i < tga.depth; ++i)
{
if (TGAReadLine(linebuffer, &tga, pdata, &TgaData) < 0)
{
GlobalFreePtr((char far *) linebuffer);
// 9504.14 jar get this pointer from pdata!
//GlobalFreePtr((char far *) lpTempDest);
GlobalFreePtr((char far *) pdata->lpTempDest);
return (FIO_READ_ERROR);
}
TGAReverse(linebuffer, &tga);
// 9504.14 jar get this pointer from pdata!
//if(tgaputline(linebuffer, lpTempDest, i, upsidedown, &TgaData))
if(tgaputline(linebuffer, pdata->lpTempDest, i, upsidedown,
&TgaData))
{
GlobalFreePtr((char far *) linebuffer);
// 9504.14 jar get this pointer from pdata!
//GlobalFreePtr((char far *) lpTempDest);
GlobalFreePtr((char far *) pdata->lpTempDest);
return (FIO_READ_ERROR);
}
}
GlobalFreePtr((char far *) linebuffer);
}
bytestoget = (long) ((long) *this_many_lines * (long) linewidth);
// 9504.14 jar get this pointer from pdata!
//tempptr = (lpTempDest + (long) ((long) *read_from_line * (long) linewidth));
tempptr = (pdata->lpTempDest + (long) ((long) *read_from_line *
(long) linewidth));
while (bytestoget--)
{
*lpDest++ = *tempptr++;
}
lines = *this_many_lines;
*read_from_line += *this_many_lines;
}
if (*read_from_line == (int) lpGFSInfo->vert_size)
{
// 9504.13 jar no huge Hugo!
//GlobalFreePtr((char huge *) lpTempDest);
// 9504.14 jar get this pointer from pdata!
//GlobalFreePtr((char *) lpTempDest);
GlobalFreePtr((char *) pdata->lpTempDest);
}
return (0);
}
void TGAReverse(char far *p,TGAHEAD far *tga)
{
char far *pr;
unsigned int i;
if (!(tga->descriptor & 0x10))
return;
pr = (char far *) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
tga->width);
if (pr != NULL)
{
for(i = 0; i < tga->width; ++i)
pr[i] = p[tga->width - 1 - i];
lstrncpy(p, pr, tga->width);
GlobalFreePtr((char far *) pr);
}
}
int TGAReadLine(char far *p, TGAHEAD far *tga, LP_FIO_DATA pdata, LP_TGA_DATA lpTgaData)
{
int c,d,e,i,n=0,size;
int r,g,b,linesize;
if (tga->bits ==1 )
linesize = pixels2bytes(tga->width);
else
linesize=tga->width;
/* handle uncompressed lines */
if(tga->imagetype==0x01 ||
tga->imagetype==0x02 ||
tga->imagetype==0x03)
{
switch(tga->bits)
{
case 1:
if (tgaread(p, pixels2bytes(tga->width), pdata, lpTgaData) != pixels2bytes(tga->width))
return(-1);
break;
case 8:
if(tgaread(p,tga->width,pdata, lpTgaData) != tga->width)
return(-1);
break;
case 15:
case 16:
for (i = 0; (unsigned) i < tga->width; ++i)
{
d = tgagetc(pdata, lpTgaData);
e = tgagetc(pdata, lpTgaData);
c = d + (e << 8);
//c = tgagetw(pdata);
r = ((c >> 10) & 0x1f) << 3;
g = ((c >> 5) & 0x1f) << 3;
b = (c & 0x1f) << 3;
*p++=b;
*p++=g;
*p++=r;
}
break;
case 24:
for (i = 0; (unsigned) i < tga->width; ++i)
{
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
*p++=b;
*p++=g;
*p++=r;
}
break;
case 32:
for (i = 0; (unsigned) i < tga->width; ++i)
{
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
*p++=b;
*p++=g;
*p++=r;
}
break;
}
}
/* handle compressed lines */
else {
do {
if((c = tgagetc(pdata, lpTgaData)) == EOF)
return(-1);
size=(c & 0x7f)+1;
n+=size;
if(c & 0x80) {
switch(tga->bits) {
case 1:
case 8:
if((c = tgagetc(pdata, lpTgaData)) == EOF)
return(-1);
for(i=0;i<size;++i)
*p++=c;
break;
case 15:
case 16:
d = tgagetc(pdata, lpTgaData);
e = tgagetc(pdata, lpTgaData);
c = d + (e << 8);
//c = tgagetw(pdata);
r=((c >> 10) & 0x1f) << 3;
g=((c >> 5) & 0x1f) << 3;
b=(c & 0x1f) << 3;
for(i=0;i<size;++i) {
*p++=b;
*p++=g;
*p++=r;
}
break;
case 24:
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
for(i=0;i<size;++i) {
*p++=b;
*p++=g;
*p++=r;
}
break;
case 32:
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
for(i=0;i<size;++i) {
*p++=b;
*p++=g;
*p++=r;
}
break;
}
}
else {
switch(tga->bits) {
case 1:
case 8:
for(i=0;i<size;++i)
*p++ = tgagetc(pdata, lpTgaData);
break;
case 15:
case 16:
for(i=0;i<size;++i) {
d = tgagetc(pdata, lpTgaData);
e = tgagetc(pdata, lpTgaData);
c = d + (e << 8);
//c = tgagetw(pdata);
r=((c >> 10) & 0x1f) << 3;
g=((c >> 5) & 0x1f) << 3;
b=(c & 0x1f) << 3;
*p++=b;
*p++=g;
*p++=r;
}
break;
case 24:
for(i=0;i<size;++i) {
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
*p++=b;
*p++=g;
*p++=r;
}
break;
case 32:
for(i=0;i<size;++i) {
b = tgagetc(pdata, lpTgaData);
g = tgagetc(pdata, lpTgaData);
r = tgagetc(pdata, lpTgaData);
tgagetc(pdata, lpTgaData);
if(r==EOF || g==EOF || b==EOF)
return(-1);
*p++=b;
*p++=g;
*p++=r;
}
break;
}
}
} while(n < linesize);
}
return(0);
}