diff libvo/vo_svga.c @ 6456:f0b64210ce97

1bpp support
author michael
date Mon, 17 Jun 2002 12:40:40 +0000
parents 7f06ef0d58a6
children 6850df500b8c
line wrap: on
line diff
--- a/libvo/vo_svga.c	Mon Jun 17 08:18:45 2002 +0000
+++ b/libvo/vo_svga.c	Mon Jun 17 12:40:40 2002 +0000
@@ -423,7 +423,11 @@
   WIDTH=vga_getxdim();
   HEIGHT=vga_getydim();
   BYTESPERPIXEL=(bpp+4)>>3;
-  LINEWIDTH=WIDTH*BYTESPERPIXEL;
+  if(bpp==1)
+    LINEWIDTH=(WIDTH+7)/8;
+  else
+    LINEWIDTH=WIDTH*BYTESPERPIXEL;
+
   vga_setlinearaddressing();
   if(oldmethod) {
      buffer=malloc(HEIGHT*LINEWIDTH);
@@ -453,7 +457,11 @@
   
   if (pformat == IMGFMT_YV12) {
     yuv2rgb_init(bpp, MODE_RGB);
-    yuvbuf = malloc(maxw * maxh * BYTESPERPIXEL);
+    if(bpp==1)
+      yuvbuf = malloc((maxw+7)/8 * maxh);
+    else
+      yuvbuf = malloc(maxw * maxh * BYTESPERPIXEL);
+
     if (yuvbuf == NULL) {
       printf("vo_svga: yuvbuf -> Not enough memory for buffering!\n");
       uninit();
@@ -476,7 +484,10 @@
 
 static uint32_t draw_frame(uint8_t *src[]) {
   if (pformat == IMGFMT_YV12) {
-    yuv2rgb(yuvbuf, src[0], src[1], src[2], orig_w, orig_h, orig_w * BYTESPERPIXEL, orig_w, orig_w / 2);
+    if(bpp==1)
+      yuv2rgb(yuvbuf, src[0], src[1], src[2], orig_w, orig_h, (orig_w+7)/8, orig_w, orig_w / 2);
+    else
+      yuv2rgb(yuvbuf, src[0], src[1], src[2], orig_w, orig_h, orig_w * BYTESPERPIXEL, orig_w, orig_w / 2);
     src[0] = yuvbuf;
   }
   if (bpp_conv) {
@@ -509,8 +520,11 @@
                            int w, int h, int x, int y) {
   uint8_t *src = yuvbuf;
   uint32_t sw, sh;
-  
-  yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, orig_w * BYTESPERPIXEL, stride[0], stride[1]);
+  if(bpp==1)
+    yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, (orig_w+7)/8, stride[0], stride[1]);
+  else
+    yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, orig_w * BYTESPERPIXEL, stride[0], stride[1]);
+
   putbox(x + x_pos, y + y_pos, w, h, src, 1);
 
   return (0);
@@ -699,15 +713,21 @@
 
 static void putbox(int x, int y, int w, int h, uint8_t *buf, int prog) {
     int base, add, wid;
+    if(bpp==1)
+      wid=(w+7)/8;
+    else
+      wid=w*BYTESPERPIXEL;
+
     if(oldmethod) {
-        wid=w*BYTESPERPIXEL;
         add=wid*prog;
         while( (h--) > 0 ) {
-            memcpy(buffer+x*BYTESPERPIXEL+(y++)*LINEWIDTH, buf, wid);
+            if(bpp==1)
+              memcpy(buffer+(x+7)/8+(y++)*LINEWIDTH, buf, wid);
+            else
+              memcpy(buffer+x*BYTESPERPIXEL+(y++)*LINEWIDTH, buf, wid);
             buf+=add;
         }
     } else {
-        wid=w*BYTESPERPIXEL;
         add=wid*prog;
         base=frame*HEIGHT;
         while( (h--) > 0 ) {