Index: [thread] [date] [subject] [author]
  From: mongoose@ms241739.users.mindspring.com
  To  : ggi-develop@eskimo.com
  Date: Sun, 4 Jul 1999 00:46:46 -0400 (EDT)

ggi buffer format

Hey guys!

I have translucent and transparent drawing done.  I can draw jpgs and ppms
with masks too.  One problem...  I have to convert the ggi buffer from get
box to *my image buffer format to use it correctly ( and faster ).

// Here's my translucent pixel Draw ( this works pretty good )
// I'm using C++ as a graphics lib wrapper ( makes it more portable )
// _vis is a ggi visual and _color a ggi color
void Gfx::update_pen(int r, int g, int b)
{
    _color.r = r;
    _color.g = g;
    _color.b = b;


    ggiSetGCForeground(_vis, ggiMapColor(_vis, &_color));
}

void Gfx::TranslucentDrawPixel(int x, int y)
{
    ggi_pixel funky_pixel;
    ggi_color tmp_color;

    
    // Get the ggi_pixel at P(x,y) in visual _vis
    ggiGetPixel(_vis, x, y, &funky_pixel);

    //ggiUnmapPixel gets the ggi_color associated with the gg_pixel
    ggiUnmapPixel(_vis, funky_pixel, &tmp_color);

    // Hhhmmm...  account for mtk_pixel_t alpha values later (slow)
    tmp_color.r = (_color.r + tmp_color.r) >> 1;// >> _color.a;
    tmp_color.b = (_color.b + tmp_color.b) >> 1;// >> _color.a;
    tmp_color.g = (_color.g + tmp_color.g) >> 1;// >> _color.a;

    // update pen ( this is faster than calling update_pen()
    ggiSetGCForeground(_vis, ggiMapColor(_vis, &tmp_color));

    // Draw "translucent" pixel
    ggiDrawPixel(_vis, x, y);
}


Well here's the part I have trouble with, I can't convert ggi buffers to
my mtk buffers.  I have to have all imges using masking and translucent
draws in my mtk buffer format.  ( I also use a simple compression
technique to reduce memory usage without quality loss. ) 


Here's the ascii output of the masks below.  I made a Image of the word
quit in black on a blue field.  I done this to remove the added complexity
of my masking code.  This pseudo "mask" example draws X if the pixel isn't
black. 


>From the ppm image loader:

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X       X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X             X X X X X X X X X X X X X X X X X X X X X 
X X X X     X X X     X X X X X X X X X X X X X X X X X X X X X 
X X X       X X X       X X X X X X X X X X X X X X X X X X X X 
X X X     X X X X X     X X X X X X X X X X X X X X X X X X X X 
X X X     X X X X X     X X X X X X X X X     X X   X X X X X X 
X X X     X X X X X     X X X X X X X X X     X X     X X X X X 
X X X     X X X X X     X X X X X X X X X X X X X     X X X X X 
X X X     X X X X X     X X     X X     X     X         X X X X 
X X X     X X X X X     X X     X X     X     X         X X X X 
X X X     X X X X X     X X     X X     X     X X     X X X X X 
X X X X     X X X     X X X     X X     X     X X     X X X X X 
X X X X                 X X     X X     X     X X     X X X X X 
X X X X X X       X       X             X     X X     X X X X X 
X X X X X X X X X X X     X X         X X     X X       X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 


I tried code something like this, where old image is cast as ggi_pixel*:

void Gfx::ExtractColor(ggi_pixel *pixel, int *r, int *b, int *g)
{
     ggi_color tmp_color;

     ggiUnmapPixel(_vis, *pixel, &tmp_color);

     *r = tmp_color.r;   
     *b = tmp_color.b;   
     *g = tmp_color.g;   
}

   n = 0;

   for (i = 0; i < _h; i++,printf("\n"))
   {
       for (j = 0; j < _w; j++)
       {

          gui->ExtractColor(&old_image[n], &r, &b, &g);

                #ifdef DEBUG
            
                // I only want to draw black in this case 
                if (r == 0 && b == 0 && g == 0)
                    printf(" ");

                // any other color
                else
                    printf("X"); 

                    // account for width of letters being 1/2 hieght
                    printf(" ");
                #endif

          n++;
       }
   }



[WARNING] Image->mtkConvertBuffer(): experimental
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X     X X X X X X X X X X X 
X X X       X X X X X X X X X X X X   X X   X X X X X X X X X X 
X X   X X   X X X X X X X X X X X X   X X   X X X X X X X X X X 
X X   X X   X X X X X   X X X X X X   X X   X X X X X   X   X X 
X X   X X   X X X X X X X   X X X X   X X   X   X   X       X X 
X X   X X   X   X   X       X X X X   X X   X   X   X   X   X X 
X X   X X   X   X   X   X   X X X X         X   X   X   X   X X 
X X X               X   X   X X X X X X X X   X     X   X   X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X 
  X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X 
X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X 
X   X X X X   X X X X   X X X X   X X   X   X X   X   X X   X   
X X   X   X X   X   X X   X   X X   X   X X   X   X X X X   X X 
X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X 
  X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X 
X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X 
X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   
X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X 
X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X 
  X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X 
X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X 
X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   
X X X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X 
X X   X X X X   X X X X   X X X X   X X X X   X X X X   X X X X 
Image->mtkConvertBuffer(): 0% compressed (1024|1024/1024) 4096bytes
 

Then I tried it with _w / 2, then drew the pixel out twice.  It *almost
works.  I get a deformed image that looks like the first "quit"... I tried
reading the buffer as a matrix too.  I'm stumped...



Sorry about the huge images, but you have to see.  =)


later,
Terry ( the other Mongoose on the list )


 ---------------------------------------------------
| BotShop     http://www.planetquake.com/botshop    |
| Personal    http://www.westga.edu.com/~stu7440    |
|                                                   |
|    Alita is running linux 2.2.9 w/ DoS fix        |

Index: [thread] [date] [subject] [author]