stratagus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Stratagus-CVS] stratagus/src include/video.h video/sprite.c


From: address@hidden
Subject: [Stratagus-CVS] stratagus/src include/video.h video/sprite.c
Date: 16 Dec 2003 22:02:23 +1100

CVSROOT:        /home/strat
Module name:    stratagus
Changes by:      <address@hidden>       03/12/16 22:02:23

Modified files:
        src/include    : video.h 
        src/video      : sprite.c 

Log message:
        Added support for 50 % translucide functions

Patches:
Index: stratagus/src/include/video.h
diff -u stratagus/src/include/video.h:1.103 stratagus/src/include/video.h:1.104
--- stratagus/src/include/video.h:1.103 Sun Dec 14 07:54:16 2003
+++ stratagus/src/include/video.h       Tue Dec 16 22:02:22 2003
@@ -26,7 +26,7 @@
 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //      02111-1307, USA.
 //
-//     $Id: video.h,v 1.103 2003/12/13 20:54:16 jsalmon3 Exp $
+//     $Id: video.h,v 1.104 2003/12/16 11:02:22 mohydine Exp $
 
 #ifndef __VIDEO_H__
 #define __VIDEO_H__
@@ -106,6 +106,17 @@
     void (*DrawClip)(const Graphic* o, unsigned f, int x, int y);
        ///     Draw the object clipped and flipped in X direction.
     void (*DrawClipX)(const Graphic* o, unsigned f, int x, int y);
+
+       ///50% Translucide functions
+       ///     Draw the object unclipped.
+    void (*DrawTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object unclipped and flipped in X direction.
+    void (*DrawXTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object clipped to the current clipping.
+    void (*DrawClipTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object clipped and flipped in X direction.
+    void (*DrawClipXTrans50)(const Graphic* o, unsigned f, int x, int y);
+
        ///     Draw the shadow object clipped to the current clipping.
     void (*DrawShadowClip)(const Graphic* o, unsigned f, int x, int y);
        ///     Draw the shadow object clipped and flipped in X direction.
@@ -676,6 +687,16 @@
     void (*DrawClip)(const Graphic* o, unsigned f, int x, int y);
        ///     Draw the object clipped and flipped in X direction.
     void (*DrawClipX)(const Graphic* o, unsigned f, int x, int y);
+       
+       ///50% Translucide functions
+       void (*DrawTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object unclipped and flipped in X direction.
+    void (*DrawXTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object clipped to the current clipping.
+    void (*DrawClipTrans50)(const Graphic* o, unsigned f, int x, int y);
+       ///     Draw the object clipped and flipped in X direction.
+    void (*DrawClipXTrans50)(const Graphic* o, unsigned f, int x, int y);
+       
        ///     Draw the shadow object clipped to the current clipping.
     void (*DrawShadowClip)(const Graphic* o, unsigned f, int x, int y);
        ///     Draw the shadow object clipped and flipped in X direction.
@@ -1117,6 +1138,18 @@
     ///        Draw a graphic object clipped and flipped in X direction.
 #define VideoDrawClipX(o, f, x, y)     ((o)->Type->DrawClipX)((o), (f), (x), 
(y))
     ///        Draw a shadow graphic object clipped to the current clipping.
+
+       ///Translucide Functions
+   /// Draw a graphic object unclipped.
+#define VideoDrawTrans50(o, f, x, y)   ((o)->Type->DrawTrans50)((o), (f), (x), 
(y))
+    ///        Draw a graphic object unclipped and flipped in X direction.
+#define VideoDrawXTrans50(o, f, x, y)  ((o)->Type->DrawXTrans50)((o), (f), 
(x), (y))
+    ///        Draw a graphic object clipped to the current clipping.
+#define VideoDrawClipTrans50(o, f, x, y)       
((o)->Type->DrawClipTrans50)((o), (f), (x), (y))
+    ///        Draw a graphic object clipped and flipped in X direction.
+#define VideoDrawClipXTrans50(o, f, x, y)      
((o)->Type->DrawClipXTrans50)((o), (f), (x), (y))
+    ///        Draw a shadow graphic object clipped to the current clipping.
+
 #define VideoDrawShadowClip(o, f, x, y)        
((o)->Type->DrawShadowClip)((o),(f),(x),(y))
     ///        Draw a shadow graphic object clipped and flipped in X direction.
 #define VideoDrawShadowClipX(o, f, x, y)    
((o)->Type->DrawShadowClipX)((o),(f),(x),(y))
Index: stratagus/src/video/sprite.c
diff -u stratagus/src/video/sprite.c:1.55 stratagus/src/video/sprite.c:1.56
--- stratagus/src/video/sprite.c:1.55   Sun Dec 14 07:54:18 2003
+++ stratagus/src/video/sprite.c        Tue Dec 16 22:02:22 2003
@@ -27,7 +27,7 @@
 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //      02111-1307, USA.
 //
-//     $Id: sprite.c,v 1.55 2003/12/13 20:54:18 jsalmon3 Exp $
+//     $Id: sprite.c,v 1.56 2003/12/16 11:02:22 mohydine Exp $
 
 //@{
 
@@ -1734,6 +1734,1291 @@
        }
     }
 }
+/// 
*******************************************************************************************
+/// Begining of 50% Transparent functions
+/// 
*******************************************************************************************
+/**
+**     Draw 8bit graphic object unclipped and flipped in X direction
+**     into 8 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to8XTrans50(const Graphic* sprite, unsigned frame, int x, 
int y)
+{
+    const unsigned char* sp;
+    unsigned w;
+    VMemType8* dp;
+    const VMemType8* lp;
+    const VMemType8* ep;
+    const VMemType8* pp;
+    const VMemType8* pixels;
+    unsigned da;
+
+    pixels = (VMemType8*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+    w = sprite->Width;
+    dp = VideoMemory8 + x + y * VideoWidth + w - 1;
+    da = VideoWidth + w;
+    ep = dp + VideoWidth * sprite->Height;
+    do {
+       lp = dp - w;
+       do {                            // 1 line
+           dp -= *sp++;                        // transparent
+           pp = dp + 1 - *sp++;                // opaque
+           while (dp > pp) {           // unrolled
+               *dp-- = pixels[*sp++];
+               *dp-- = pixels[*sp++];
+           }
+           if (dp >= pp) {
+               *dp-- = pixels[*sp++];
+           }
+       } while (dp > lp);
+       dp += da;
+    } while (dp < ep);                 // all lines
+}
+
+/**
+**     Draw 8bit graphic object unclipped and flipped in X direction
+**     into 16 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to16XTrans50(const Graphic* sprite, unsigned frame, int 
x, int y)
+{
+    const unsigned char* sp;
+    unsigned w;
+    VMemType16* dp;
+    const VMemType16* lp;
+    const VMemType16* ep;
+    const VMemType16* pp;
+    const VMemType16* pixels;
+    unsigned da;
+
+    pixels = (VMemType16*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+    w = sprite->Width;
+    dp = VideoMemory16 + x + y * VideoWidth + w - 1;
+    da = VideoWidth + w;
+    ep = dp + VideoWidth * sprite->Height;
+
+    do {
+       lp = dp - w;
+       do {                            // 1 line
+           dp -= *sp++;                        // transparent
+           pp = dp + 1 - *sp++;                // opaque
+           while (dp > pp) {           // unrolled
+               *dp-- = pixels[*sp++];
+               *dp-- = pixels[*sp++];
+           }
+           if (dp >= pp) {
+               *dp-- = pixels[*sp++];
+           }
+       } while (dp > lp);
+       dp += da;
+    } while (dp < ep);                 // all lines
+}
+
+/**
+**     Draw 8bit graphic object unclipped and flipped in X direction
+**     into 24 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to24XTrans50(const Graphic* sprite, unsigned frame, int 
x, int y)
+{
+    const unsigned char* sp;
+    unsigned w;
+    VMemType24* dp;
+    const VMemType24* lp;
+    const VMemType24* ep;
+    const VMemType24* pp;
+    const VMemType24* pixels;
+    unsigned da;
+
+    pixels = (VMemType24*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+    w = sprite->Width;
+    dp = VideoMemory24 + x + y * VideoWidth + w - 1;
+    da = VideoWidth + w;
+    ep = dp + VideoWidth * sprite->Height;
+
+    do {
+       lp = dp - w;
+       do {                            // 1 line
+           dp -= *sp++;                        // transparent
+           pp = dp + 1 - *sp++;                // opaque
+           while (dp > pp) {           // unrolled
+               *dp-- = pixels[*sp++];
+               *dp-- = pixels[*sp++];
+           }
+           if (dp >= pp) {
+               *dp-- = pixels[*sp++];
+           }
+       } while (dp > lp);
+       dp += da;
+    } while (dp < ep);                 // all lines
+}
+
+/**
+**     Draw 8bit graphic object unclipped and flipped in X direction
+**     into 32 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to32XTrans50(const Graphic* sprite, unsigned frame, int 
x, int y)
+{
+    const unsigned char* sp;
+    unsigned w;
+    VMemType32* dp;
+    const VMemType32* lp;
+    const VMemType32* ep;
+    const VMemType32* pp;
+    const VMemType32* pixels;
+    unsigned da;
+
+    pixels = (VMemType32*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+    w = sprite->Width;
+    dp = VideoMemory32 + x + y * VideoWidth + w - 1;
+    da = VideoWidth + w;
+    ep = dp + VideoWidth * sprite->Height;
+
+    do {
+       lp = dp - w;
+       do {                            // 1 line
+           dp -= *sp++;                        // transparent
+           pp = dp + 1 - *sp++;                // opaque
+           while (dp > pp) {           // unrolled
+               *dp-- = pixels[*sp++];
+               *dp-- = pixels[*sp++];
+           }
+           if (dp >= pp) {
+               *dp-- = pixels[*sp++];
+           }
+       } while (dp > lp);
+       dp += da;
+    } while (dp < ep);                 // all lines
+}
+
+
+/**
+**     Draw 8bit graphic object clipped into 8 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to8ClipTrans50(const Graphic* sprite, unsigned frame, int 
x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType8* dp;
+    const VMemType8* lp;
+    const VMemType8* ep;
+    VMemType8* pp;
+    const VMemType8* pixels;
+    int da;
+
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType8*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines, if needed.
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth - sw;
+    dp = VideoMemory8 + x + y * VideoWidth;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       do {
+           lp = dp + sw;
+           do {                        // 1 line
+               dp += *sp++;            // transparent
+               pp = dp - 1 + *sp++;            // opaque
+               while (dp < pp) {       // unroll
+                   *dp++ = pixels[*sp++];
+                   *dp++ = pixels[*sp++];
+               }
+               if (dp <= pp) {
+                   *dp++ = pixels[*sp++];
+               }
+           } while (dp < lp);
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    } else {                           // Clip horizontal
+
+       da += ox;
+       do {
+           lp = dp + w;
+           //
+           //  Clip left
+           //
+           pp = dp - ox;
+           for (;;) {
+               pp += *sp++;            // transparent
+               if (pp >= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp += *sp;              // opaque
+               if (pp >= dp) {
+                   sp += *sp - (pp - dp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp += *sp++;            // transparent
+middle_trans:
+               if (dp >= lp) {
+                   lp += sw - w - ox;
+                   goto right_trans;
+               }
+               pp = dp + *sp++;                // opaque
+middle_pixel:
+               if (pp < lp) {
+                   while (dp < pp) {
+                       *dp++ = pixels[*sp++];
+                   }
+                   continue;
+               }
+               while (dp < lp) {
+                   *dp++ = pixels[*sp++];
+               }
+               sp += pp - dp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip right
+           //
+           lp += sw - w - ox;
+           while (dp < lp) {
+               dp += *sp++;            // transparent
+right_trans:
+               dp += *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped into 16 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to16ClipTrans50(const Graphic* sprite, unsigned frame, 
int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType16* dp;
+    const VMemType16* lp;
+    const VMemType16* ep;
+    VMemType16* pp;
+    const VMemType16* pixels;
+    int da;
+    
+//Added by Mohydine
+
+    VMemType16* p;
+    p = VideoMemory16 + y * VideoWidth + x;
+
+//Added by Mohydine
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType16*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines, if needed.
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth - sw;
+    dp = VideoMemory16 + x + y * VideoWidth;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       do {
+           lp = dp + sw;
+           do {                        // 1 line
+               dp += *sp++;            // transparent
+               pp = dp - 1 + *sp++;            // opaque
+               while (dp < pp) {       // unroll
+                   *dp++ =  ((*dp >> 1) & 0x7BEF)  +((pixels[*sp++] >> 1) & 
0x7BEF);
+                   *dp++ =  ((*dp >> 1) & 0x7BEF)  +((pixels[*sp++] >> 1) & 
0x7BEF);
+                       //*dp++ =  ((*dp >> 2) & 0x79E7) + ((pixels[*sp] >> 2) 
& 0x79E7) +((pixels[*sp++] >> 1) & 0x7BEF);
+                   //*dp++ =  ((*dp >> 2) & 0x79E7) + ((pixels[*sp] >> 2) & 
0x79E7) +((pixels[*sp++] >> 1) & 0x7BEF);
+               }
+               if (dp <= pp) {
+                   *dp++ =  ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) & 
0x7BEF);
+               }
+           } while (dp < lp);
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    } else {                           // Clip horizontal
+
+       da += ox;
+       do {
+           lp = dp + w;
+           //
+           //  Clip left
+           //
+           pp = dp - ox;
+           for (;;) {
+               pp += *sp++;            // transparent
+               if (pp >= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp += *sp;              // opaque
+               if (pp >= dp) {
+                   sp += *sp - (pp - dp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp += *sp++;            // transparent
+middle_trans:
+               if (dp >= lp) {
+                   lp += sw - w - ox;
+                   goto right_trans;
+               }
+               pp = dp + *sp++;                // opaque
+middle_pixel:
+               if (pp < lp) {
+                   while (dp < pp) {
+                       *dp++ =  ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) 
& 0x7BEF);
+                   }
+                   continue;
+               }
+               while (dp < lp) {
+                   *dp++ =  ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) & 
0x7BEF);
+               }
+               sp += pp - dp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip right
+           //
+           lp += sw - w - ox;
+           while (dp < lp) {
+               dp += *sp++;            // transparent
+right_trans:
+               dp += *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped into 24 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to24ClipTrans50(const Graphic* sprite, unsigned frame, 
int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType24* dp;
+    const VMemType24* lp;
+    const VMemType24* ep;
+    VMemType24* pp;
+    const VMemType24* pixels;
+    int da;
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType24*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines, if needed.
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth - sw;
+    dp = VideoMemory24 + x + y * VideoWidth;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       do {
+           lp = dp + sw;
+           do {                        // 1 line
+               dp += *sp++;            // transparent
+               pp = dp - 1 + *sp++;            // opaque
+               while (dp < pp) {       // unroll
+                   *dp++ = pixels[*sp++];
+                   *dp++ = pixels[*sp++];
+               }
+               if (dp <= pp) {
+                   *dp++ = pixels[*sp++];
+               }
+           } while (dp < lp);
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    } else {                           // Clip horizontal
+
+       da += ox;
+       do {
+           lp = dp + w;
+           //
+           //  Clip left
+           //
+           pp = dp - ox;
+           for (;;) {
+               pp += *sp++;            // transparent
+               if (pp >= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp += *sp;              // opaque
+               if (pp >= dp) {
+                   sp += *sp - (pp - dp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp += *sp++;            // transparent
+middle_trans:
+               if (dp >= lp) {
+                   lp += sw - w - ox;
+                   goto right_trans;
+               }
+               pp = dp + *sp++;                // opaque
+middle_pixel:
+               if (pp < lp) {
+                   while (dp < pp) {
+                       *dp++ = pixels[*sp++];
+                   }
+                   continue;
+               }
+               while (dp < lp) {
+                   *dp++ = pixels[*sp++];
+               }
+               sp += pp - dp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip right
+           //
+           lp += sw - w - ox;
+           while (dp < lp) {
+               dp += *sp++;            // transparent
+right_trans:
+               dp += *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped into 32 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to32ClipTrans50(const Graphic* sprite, unsigned frame, 
int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType32* dp;
+    const VMemType32* lp;
+    const VMemType32* ep;
+    VMemType32* pp;
+    const VMemType32* pixels;
+    int da;
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType32*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines, if needed.
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth - sw;
+    dp = VideoMemory32 + x + y * VideoWidth;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       do {
+           lp = dp + sw;
+           do {                        // 1 line
+               dp += *sp++;            // transparent
+               pp = dp - 1 + *sp++;            // opaque
+               while (dp < pp) {       // unroll
+                   *dp++ =  ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) 
& 0x7F7F7F7F) ;
+                   *dp++ =  ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) 
& 0x7F7F7F7F) ;
+               }
+               if (dp <= pp) {
+                   *dp++ = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) & 
0x7F7F7F7F);
+               }
+           } while (dp < lp);
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    } else {                           // Clip horizontal
+
+       da += ox;
+       do {
+           lp = dp + w;
+           //
+           //  Clip left
+           //
+           pp = dp - ox;
+           for (;;) {
+               pp += *sp++;            // transparent
+               if (pp >= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp += *sp;              // opaque
+               if (pp >= dp) {
+                   sp += *sp - (pp - dp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp += *sp++;            // transparent
+middle_trans:
+               if (dp >= lp) {
+                   lp += sw - w - ox;
+                   goto right_trans;
+               }
+               pp = dp + *sp++;                // opaque
+middle_pixel:
+               if (pp < lp) {
+                   while (dp < pp) {
+                       *dp++ = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 
1) & 0x7F7F7F7F);
+                   }
+                   continue;
+               }
+               while (dp < lp) {
+                   *dp++ = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) & 
0x7F7F7F7F);
+               }
+               sp += pp - dp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip right
+           //
+           lp += sw - w - ox;
+           while (dp < lp) {
+               dp += *sp++;            // transparent
+right_trans:
+               dp += *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+       } while (dp < ep);              // all lines
+
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped and flipped in X direction
+**     into 8 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to8ClipXTrans50(const Graphic* sprite, unsigned frame, 
int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType8* dp;
+    const VMemType8* lp;
+    const VMemType8* ep;
+    VMemType8* pp;
+    const VMemType8* pixels;
+    int da;
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType8*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth + sw;
+    dp = VideoMemory8 + x + y * VideoWidth + w - 1;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           do {                        // 1 line
+               dp -= *sp++;            // transparent
+               pp = dp + 1 - *sp++;            // opaque
+               while (dp > pp) {
+                   *dp-- = pixels[*sp++];
+                   *dp-- = pixels[*sp++];
+               }
+               if (dp >= pp) {
+                   *dp-- = pixels[*sp++];
+               }
+           } while (dp > lp);
+           dp += da;
+       }
+
+    } else {                           // Clip horizontal
+
+       da -= sw - w - ox;
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           //
+           //  Clip right side
+           //
+           pp = dp + sw - w - ox;
+           for (;;) {
+               pp -= *sp++;            // transparent
+               if (pp <= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp -= *sp;              // opaque
+               if (pp <= dp) {
+                   sp += *sp - (dp - pp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp -= *sp++;            // transparent
+middle_trans:
+               if (dp <= lp) {
+                   lp -= ox;
+                   goto right_trans;
+               }
+               pp = dp - *sp++;                // opaque
+middle_pixel:
+               if (pp > lp) {
+                   while (dp > pp) {
+                       *dp-- = pixels[*sp++];
+                   }
+                   continue;
+               }
+               while (dp > lp) {
+                   *dp-- = pixels[*sp++];
+               }
+               sp += dp - pp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip left side
+           //
+           lp -= ox;
+           while (dp > lp) {
+               dp -= *sp++;            // transparent
+right_trans:
+               dp -= *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+
+       }
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped and flipped in X direction
+**     into 16 bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to16ClipXTrans50(const Graphic* sprite, unsigned frame,
+    int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType16* dp;
+    const VMemType16* lp;
+    const VMemType16* ep;
+    VMemType16* pp;
+    const VMemType16* pixels;
+    int da;
+
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType16*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth + sw;
+    dp = VideoMemory16 + x + y * VideoWidth + w - 1;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           do {                        // 1 line
+               dp -= *sp++;            // transparent
+               pp = dp + 1 - *sp++;            // opaque
+               while (dp > pp) {
+                   *dp-- = ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) & 
0x7BEF);
+                   *dp-- = ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) & 
0x7BEF);
+               }
+               if (dp >= pp) {
+                   *dp-- = ((*dp >> 1) & 0x7BEF) + ((pixels[*sp++] >> 1) & 
0x7BEF);
+               }
+           } while (dp > lp);
+           dp += da;
+       }
+
+    } else {                           // Clip horizontal
+
+       da -= sw - w - ox;
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           //
+           //  Clip right side
+           //
+           pp = dp + sw - w - ox;
+           for (;;) {
+               pp -= *sp++;            // transparent
+               if (pp <= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp -= *sp;              // opaque
+               if (pp <= dp) {
+                   sp += *sp - (dp - pp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp -= *sp++;            // transparent
+middle_trans:
+               if (dp <= lp) {
+                   lp -= ox;
+                   goto right_trans;
+               }
+               pp = dp - *sp++;                // opaque
+middle_pixel:
+               if (pp > lp) {
+                   while (dp > pp) {
+                       *dp-- = pixels[*sp++];
+                   }
+                   continue;
+               }
+               while (dp > lp) {
+                   *dp-- = pixels[*sp++];
+               }
+               sp += dp - pp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip left side
+           //
+           lp -= ox;
+           while (dp > lp) {
+               dp -= *sp++;            // transparent
+right_trans:
+               dp -= *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+
+       }
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped and flipped in X direction
+**     into 24bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to24ClipXTrans50(const Graphic* sprite, unsigned frame,
+    int x, int y)
+{
+    int ox;
+    int ex;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType24* dp;
+    const VMemType24* lp;
+    const VMemType24* ep;
+    VMemType24* pp;
+    const VMemType24* pixels;
+    int da;
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType24*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth + sw;
+    dp = VideoMemory24 + x + y * VideoWidth + w - 1;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           do {                        // 1 line
+               dp -= *sp++;            // transparent
+               pp = dp + 1 - *sp++;            // opaque
+               while (dp > pp) {
+                   *dp-- = pixels[*sp++];
+                   *dp-- = pixels[*sp++];
+               }
+               if (dp >= pp) {
+                   *dp-- = pixels[*sp++];
+               }
+           } while (dp > lp);
+           dp += da;
+       }
+
+    } else {                           // Clip horizontal
+
+       da -= sw - w - ox;
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           //
+           //  Clip right side
+           //
+           pp = dp + sw - w - ox;
+           for (;;) {
+               pp -= *sp++;            // transparent
+               if (pp <= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp -= *sp;              // opaque
+               if (pp <= dp) {
+                   sp += *sp - (dp - pp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp -= *sp++;            // transparent
+middle_trans:
+               if (dp <= lp) {
+                   lp -= ox;
+                   goto right_trans;
+               }
+               pp = dp - *sp++;                // opaque
+middle_pixel:
+               if (pp > lp) {
+                   while (dp > pp) {
+                       *dp-- = pixels[*sp++];
+                   }
+                   continue;
+               }
+               while (dp > lp) {
+                   *dp-- = pixels[*sp++];
+               }
+               sp += dp - pp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip left side
+           //
+           lp -= ox;
+           while (dp > lp) {
+               dp -= *sp++;            // transparent
+right_trans:
+               dp -= *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+
+       }
+    }
+}
+
+/**
+**     Draw 8bit graphic object clipped and flipped in X direction
+**     into 32bit framebuffer.
+**
+**     @param sprite   pointer to object
+**     @param frame    number of frame (object index)
+**     @param x        x coordinate on the screen
+**     @param y        y coordinate on the screen
+*/
+local void VideoDraw8to32ClipXTrans50(const Graphic* sprite, unsigned frame
+       , int x, int y)
+{
+    int ex;
+    int ox;
+    int oy;
+    int w;
+    int h;
+    const unsigned char* sp;
+    int sw;
+    VMemType32* dp;
+    const VMemType32* lp;
+    const VMemType32* ep;
+    VMemType32* pp;
+    const VMemType32* pixels;
+    int da;
+
+    //
+    // reduce to visible range
+    //
+    sw = w = sprite->Width;
+    h = sprite->Height;
+    CLIP_RECTANGLE_OFS(x, y, w, h, ox, oy, ex);
+
+    //
+    // Draw the clipped sprite
+    //
+    pixels = (VMemType32*)sprite->Pixels;
+    sp = ((unsigned char**)sprite->Frames)[frame];
+
+    //
+    // Skip top lines
+    //
+    while (oy--) {
+       da = 0;
+       do {
+           da += *sp++;                        // transparent
+           da += *sp;                  // opaque
+           sp += *sp + 1;
+       } while (da < sw);
+    }
+
+    da = VideoWidth + sw;
+    dp = VideoMemory32 + x + y * VideoWidth + w - 1;
+    ep = dp + VideoWidth * h;
+
+    if (w == sw) {                     // Unclipped horizontal
+
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           do {                        // 1 line
+               dp -= *sp++;            // transparent
+               pp = dp + 1 - *sp++;            // opaque
+               while (dp > pp) {
+                   *dp-- = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) & 
0x7F7F7F7F);
+                   *dp-- = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) & 
0x7F7F7F7F);
+               }
+               if (dp >= pp) {
+                   *dp-- = pixels[*sp++];
+               }
+           } while (dp > lp);
+           dp += da;
+       }
+
+    } else {                           // Clip horizontal
+
+       da -= ex;
+       while (dp < ep) {               // all lines
+           lp = dp - w;
+           //
+           //  Clip right side
+           //
+           pp = dp + ex;
+           for (;;) {
+               pp -= *sp++;            // transparent
+               if (pp <= dp) {
+                   dp = pp;
+                   goto middle_trans;
+               }
+               pp -= *sp;              // opaque
+               if (pp <= dp) {
+                   sp += *sp - (dp - pp) + 1;
+                   goto middle_pixel;
+               }
+               sp += *sp + 1;
+           }
+
+           //
+           //  Draw middle
+           //
+           for (;;) {
+               dp -= *sp++;            // transparent
+middle_trans:
+               if (dp <= lp) {
+                   lp -= ox;
+                   goto right_trans;
+               }
+               pp = dp - *sp++;                // opaque
+middle_pixel:
+               if (pp > lp) {
+                   while (dp > pp) {
+                       *dp-- = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 
1) & 0x7F7F7F7F);
+                   }
+                   continue;
+               }
+               while (dp > lp) {
+                   *dp-- = ((*dp >> 1) & 0x7F7F7F7F) + ((pixels[*sp++] >> 1) & 
0x7F7F7F7F);
+               }
+               sp += dp - pp;
+               dp = pp;
+               break;
+           }
+
+           //
+           //  Clip left side
+           //
+           lp -= ox;
+           while (dp > lp) {
+               dp -= *sp++;            // transparent
+right_trans:
+               dp -= *sp;              // opaque
+               sp += *sp + 1;
+           }
+           dp += da;
+
+       }
+    }
+}
+// End Of 50% Transparent functions
 #endif
 
 /**




reply via email to

[Prev in Thread] Current Thread [Next in Thread]