diff --git a/src/sys/graphics/main.cpp b/src/sys/graphics/main.cpp index 54a1e1d..3f13f9d 100755 --- a/src/sys/graphics/main.cpp +++ b/src/sys/graphics/main.cpp @@ -24,7 +24,7 @@ buf = new TGfx0(); buf2 = new TGfx0(); font = new TDPFont(buf); - buf->create(400,400,def_pixfmt_16bpp); + buf->create(400,400,def_pixfmt_32bpp); // buf2->create(400,400,def_pixfmt_15bpp); // buf2->alias(*buf,0,3,8,8); buf2->clone(*buf); @@ -35,8 +35,7 @@ font->SetColor(1); font->PutText(0,0," World"); // buf->copyBuf(0,0,*buf,40,0,79,8); - for (foo=-10; foo<1255; foo++) - buf->hLine(foo,foo*2,foo,1); + buf->rectangle(0,0,15,7,1); for (r=0; r<8; r++) { for (g=0; g<80; g++) if (buf->getPixel(g,r)==1) printf("*"); else printf(" "); diff --git a/src/sys/graphics/objgfx30.cpp b/src/sys/graphics/objgfx30.cpp index f25b883..d83f155 100755 --- a/src/sys/graphics/objgfx30.cpp +++ b/src/sys/graphics/objgfx30.cpp @@ -653,8 +653,42 @@ ); break; case 24: + asm( + " sub %%ebx, %%ecx \n" // sub ecx, ebx + " add %%esi, %%edi \n" // add edi, esi + " add %%ebx, %%ebx \n" // add ebx, ebx - pix size + " inc %%ecx \n" // inc ecx + " add %%edx, %%ebx \n" // add ebx, edx - pix size + " add %%ebx, %%edi \n" // add edi, ebx + " mov %%eax, %%ebx \n" // mov ebx, eax + " shr $16, %%ebx \n" // shr ebx, 16 + "hLlop24: \n" + " mov %%ax, (%%edi) \n" // mov [edi], ax + " mov %%bl, 2(%%edi)\n" // mov [edi+2], bl + " add $3, %%edi \n" // add edi, 3 + " dec %%ecx \n" // dec ecx + " jnz hLlop24 \n" + : + : "D" (Buffer), "S" (LineOfs[y]), // %0, %1 + "a" (colour), "b" (x1), // %2, %3 + "c" (x2), "d" (x1) // %4, %5 + ); break; case 32: + asm( + " sub %%ebx, %%ecx \n" // sub ecx, ebx + " add %%esi, %%edi \n" // add edi, esi + " inc %%ecx \n" + " shl $2, %%ebx \n" // shl ebx, 2 + " add %%ebx, %%edi \n" // add edi, ebx + " rep \n" + " stosl \n" + : + : "D" (Buffer), "S" (LineOfs[y]), // %0, %1 + "a" (colour), "b" (x1), // %2, %3 + "c" (x2) // %4 + ); + break; } // switch } // TGfx0::hLine @@ -851,6 +885,15 @@ return; } // TGfx0::setRGBPalette +void +TGfx0::rectangle(Int32 x1, Int32 y1, Int32 x2, Int32 y2, UInt32 colour) { + hLine(x1,x2,y1,colour); // Horizline has built in clipping + vLine(x2,y1,y2,colour); // vertline has built in clipping too + vLine(x1,y1,y2,colour); + hLine(x1,x2,y2,colour); + return; +} // TGfx0::rectangle + void TGfx0::unpackRGB(UInt32 colour, UInt8& red, UInt8& green, UInt8& blue) { switch (BPP) { @@ -887,13 +930,115 @@ blue = 0; } return; -} // TGfx0:unpackRGB +} // TGfx0::unpackRGB void TGfx0::vFlip(void) { return; } // TGfx0::vFlip +void +TGfx0::vLine(Int32 x, Int32 y1, Int32 y2, UInt32 colour) { + Int32 tmp; + if ((Buffer==NULL) || (LineOfs==NULL)) return; + if ((UInt32)x>MaxX) return; + if (y1>y2) { + tmp= y1; + y1 = y2; + y2 = tmp; + } // if + if (y1<0) y1 = 0; + if (y2>(Int32)MaxY) y2 = MaxY; + if (y2