diff --git a/src/sys/graphics/main.cpp b/src/sys/graphics/main.cpp index 0764258..fd04d74 100755 --- a/src/sys/graphics/main.cpp +++ b/src/sys/graphics/main.cpp @@ -9,7 +9,7 @@ #include int main() { -// UInt32 foo; + UInt32 foo; UInt8 r, g, b; r=0; g=0; @@ -18,11 +18,11 @@ TGfx0* buf2=0; buf = new TGfx0(); buf2 = new TGfx0(); - buf->create(400,400,(TPixelFmt *)&def_pixfmt_8bpp); - buf2->create(400,400,(TPixelFmt *)&def_pixfmt_8bpp); - buf->putpixel(10,10,69); - r=buf->getpixel(10,10); - printf("%d\n",r); + buf->create(400,400,(TPixelFmt *)&def_pixfmt_32bpp); + buf2->create(400,400,(TPixelFmt *)&def_pixfmt_15bpp); + buf->putpixel(11,10,10169); + foo=buf->getpixel(11,10); + printf("%d\n",(int)foo); if (buf) delete buf; if (buf2) delete buf2; return(0); diff --git a/src/sys/graphics/objgfx30.cpp b/src/sys/graphics/objgfx30.cpp index f4cea3f..4774adf 100755 --- a/src/sys/graphics/objgfx30.cpp +++ b/src/sys/graphics/objgfx30.cpp @@ -123,13 +123,58 @@ " add (%%esi,%%ebx,4), %%edi \n" // add edi, [esi + ebx*4] " add %%ecx, %%edi \n" // add edi, ecx " movzbl (%%edi),%%eax \n" // edx,byte ptr [edi] - " mov %%eax, %4 \n" // mov result, eax + " mov %%eax, %4 \n" // mov result, eax : : "D" (Buffer), "S" (LineOfs), // %0, %1 "c" (x), "b" (y), // %2, %3 "m" (result) // %4 ); break; + case 15: + case 16: + asm( + " add %%ecx, %%ecx \n" // add ecx, ecx {adjust for pixel size} + " add (%%esi,%%ebx,4), %%edi \n" // add edi, [esi + ebx*4] + " add %%ecx, %%edi \n" // add edi, ecx + " movzwl (%%edi),%%eax \n" // edx,word ptr [edi] + " mov %%eax, %4 \n" // mov result, eax + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "m" (result) // %4 + ); + break; + case 24: + asm( + " mov %%ecx, %%eax \n" // mov eax, ecx - adjust for pixel size + " add %%ecx, %%ecx \n" // add ecx, ecx - adjust for pixel size + " add %%eax, %%ecx \n" // add ecx, eax - adjust for pixel size + " add (%%esi,%%ebx,4), %%edi \n" // add edi, [esi + ebx*4] + " add %%ecx, %%edi \n" // add edi, ecx + " movzwl (%%edi),%%eax \n" // edx,word ptr [edi] + " xor %%eax, %%eax \n" + " mov 2(%%edi), %%al \n" // mov al, [edi+2] + " shl $16, %%eax \n" // shl eax, 16 + " mov (%%edi), %%ax \n" // mov ax, [edi] + " mov %%eax, %4 \n" // mov result, eax + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "m" (result) // %4 + ); + break; + case 32: + asm( + " shl $2, %%ecx \n" // shl ecx, 2 {adjust for pixel size} + " add (%%esi,%%ebx,4), %%edi \n" // add edi, [esi + ebx*4] + " add %%ecx, %%edi \n" // add edi, ecx + " mov (%%edi),%%eax \n" // edx,word ptr [edi] + " mov %%eax, %4 \n" // mov result, eax + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "m" (result) // %4 + ); } // switch return result; } // TGfx0::getpixel @@ -146,10 +191,10 @@ " add %%ecx, %%edi \n" // add edi, ecx // { Draw the pixel } " mov %%al, (%%edi) \n" // mov [edi], al - : - : "D" (Buffer), "S" (LineOfs), // %0, %1 - "c" (x), "b" (y), // %2, %3 - "m" (colour) // %4 + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "m" (colour) // %4 ); break; case 15: @@ -162,41 +207,42 @@ " add %%ecx, %%edi \n" // add edi, ecx // { Draw the pixel } " mov %%ax, (%%edi) \n" // mov [edi], al - : - : "D" (Buffer), "S" (LineOfs), // %0, %1 - "c" (x), "b" (y), // %2, %3 - "m" (colour) // %4 + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "m" (colour) // %4 ); break; case 24: asm( - " mov %3, %%ebx \n" // mov ebx, [y] - " mov %2, %%ecx \n" // mov ecx, [x] - // { Check horizontal visibility } - " mov %5, %%edx \n" // mov edx, maxY - " cmp %%edx, %%ebx \n" // cmp ebx, edx - " ja Exit \n" - // { Check vertical visibility } - " mov %4, %%edx \n" // mov edx, maxX - " mov %%edx, %%ecx \n" // cmp ecx, edx - " ja Exit \n" // { Calculate offset, prepare the pixel to be drawn } - " mov %%edx, (%%esi,%%ebx,4) \n" // mov edx, [esi + ebx * 4] - " add %%edx, %%edx \n" // add edi, edx - " mov %6, %%eax \n" // mov eax, colour + " add (%%esi,%%ebx,4),%%edi \n" // add edi, [esi + ebx * 4] " add %%ecx, %%edi \n" // add edi, ecx - " add %%ecx, %%edi \n" // add ecx, ecx {adjust for pixel size} - " add %%ecx, %%edi \n" // add ecx, ecx {adjust for pixel size} + " add %%ecx, %%edi \n" // add edi, ecx {adjust for pixel size} + " add %%ecx, %%edi \n" // add edi, ecx {adjust for pixel size} // { Draw the pixel } " mov %%ax, (%%edi) \n" // mov [edi], ax " shr $16, %%eax \n" // shr eax, 16 " mov %%al, 2(%%edi)\n" // mov [edi+2],al - "Exit: \n" - : - : "D" (Buffer), "S" (LineOfs), // %0, %1 - "m" (x), "m" (y), // %2, %3 - "m" (MaxX), "m" (MaxY), "m" (colour) // %4, %5, %6 - ); + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "a" (colour) // %4 + ); + break; + case 32: + asm( + // { Calculate offset, prepare the pixel to be drawn } + " shl $2, %%ecx \n" // shl eax, 2 {adjust for pixel size} + " add (%%esi,%%ebx,4),%%edi \n" // add edi, [esi + ebx * 4] + " add %%ecx, %%edi \n" // add edi, ecx + // { Draw the pixel } + " mov %%eax, (%%edi) \n" // mov [edi], eax + : + : "D" (Buffer), "S" (LineOfs), // %0, %1 + "c" (x), "b" (y), // %2, %3 + "a" (colour) // %4 + ); } // switch return; } // TGfx0::putpixel