openbsd-ports/graphics/xv/patches/patch-xvbmp_c
2001-03-13 20:27:56 +00:00

117 lines
3.6 KiB
Plaintext

$OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
--- xvbmp.c.orig Tue Mar 13 18:30:52 2001
+++ xvbmp.c Tue Mar 13 19:10:46 2001
@@ -18,7 +18,6 @@
not being able to malloc is a Fatal Error. The program is aborted. */
-
#define BI_RGB 0
#define BI_RLE8 1
#define BI_RLE4 2
@@ -32,6 +31,7 @@ static long filesize;
static int loadBMP1 PARM((FILE *, byte *, u_int, u_int));
static int loadBMP4 PARM((FILE *, byte *, u_int, u_int, u_int));
static int loadBMP8 PARM((FILE *, byte *, u_int, u_int, u_int));
+static int loadBMP16 PARM((FILE *, byte *, u_int, u_int));
static int loadBMP24 PARM((FILE *, byte *, u_int, u_int, u_int));
static u_int getshort PARM((FILE *));
static u_int getint PARM((FILE *));
@@ -128,7 +128,7 @@ int LoadBMP(fname, pinfo)
/* error checking */
if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 &&
- biBitCount!=24 && biBitCount!=32) ||
+ biBitCount!= 16 && biBitCount!=24 && biBitCount!=32) ||
biPlanes!=1 || biCompression>BI_RLE4) {
sprintf(buf,"Bogus BMP File! (bitCount=%d, Planes=%d, Compression=%d)",
@@ -138,7 +138,7 @@ int LoadBMP(fname, pinfo)
goto ERROR;
}
- if (((biBitCount==1 || biBitCount==24 || biBitCount==32)
+ if (((biBitCount==1 || biBitCount== 16 || biBitCount==24 || biBitCount==32)
&& biCompression != BI_RGB) ||
(biBitCount==4 && biCompression==BI_RLE8) ||
(biBitCount==8 && biCompression==BI_RLE4)) {
@@ -161,7 +161,7 @@ int LoadBMP(fname, pinfo)
}
/* load up colormap, if any */
- if (biBitCount!=24 && biBitCount!=32) {
+ if (biBitCount!=16 && biBitCount!=24 && biBitCount!=32) {
int i, cmaplen;
cmaplen = (biClrUsed) ? biClrUsed : 1 << biBitCount;
@@ -199,7 +199,7 @@ int LoadBMP(fname, pinfo)
/* create pic8 or pic24 */
- if (biBitCount==24 || biBitCount==32) {
+ if (biBitCount== 16 || biBitCount==24 || biBitCount==32) {
pic24 = (byte *) calloc((size_t) biWidth * biHeight * 3, (size_t) 1);
if (!pic24) return (bmpError(bname, "couldn't malloc 'pic24'"));
}
@@ -216,6 +216,7 @@ int LoadBMP(fname, pinfo)
biCompression);
else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight,
biCompression);
+ else if (biBitCount == 16) rv = loadBMP16(fp,pic24,biWidth,biHeight);
else rv = loadBMP24(fp,pic24,biWidth,biHeight,
biBitCount);
@@ -225,7 +226,7 @@ int LoadBMP(fname, pinfo)
fclose(fp);
- if (biBitCount == 24 || biBitCount == 32) {
+ if (biBitCount == 16 || biBitCount == 24 || biBitCount == 32) {
pinfo->pic = pic24;
pinfo->type = PIC24;
}
@@ -458,6 +459,43 @@ static int loadBMP8(fp, pic8, w, h, comp
}
+/*******************************************/
+static int loadBMP16(fp, pic24, w, h)
+ FILE *fp;
+ byte *pic24;
+ u_int w,h;
+{
+ int i,j,padb,rv;
+ byte *pp;
+
+ rv = 0;
+
+ padb = (4 - ((w*2) % 4)) & 0x03; /* # of pad bytes to read at EOscanline */
+
+ for (i=h-1; i>=0; i--) {
+ pp = pic24 + (i * w * 3);
+ if ((i&0x3f)==0) WaitCursor();
+
+ for (j=0; j<w; j++) {
+ byte byte1 = getc(fp);
+ byte byte2 = getc(fp);
+
+ /* 1 bit pad, 5 bits red, 5 bits green, 5 bits blue */
+
+ pp[0] = (byte2 & 0x7c) << 1;
+ pp[1] = ((byte2 & 0x03) << 6) | ((byte1 & 0xe0) >> 2); /* green */
+ pp[2] = (byte1 & 0x1f) << 3; /* blue */
+ pp += 3;
+ }
+
+ for (j=0; j<padb; j++) getc(fp);
+
+ rv = (FERROR(fp));
+ if (rv) break;
+ }
+
+ return rv;
+}
/*******************************************/
static int loadBMP24(fp, pic24, w, h, bits)