diff --git a/src/sys/graphics/main.cpp b/src/sys/graphics/main.cpp index ea5e23a..2e8c87f 100755 --- a/src/sys/graphics/main.cpp +++ b/src/sys/graphics/main.cpp @@ -26,16 +26,17 @@ buf = new TGfx0(); buf2 = new TGfx0(); font = new TDPFont(); - buf->create(400,400,def_pixfmt_16bpp); + buf->create(400,400,def_pixfmt_32bpp); buf->setRGBPalette(1,255,255,255); // buf2->create(400,400,def_pixfmt_15bpp); buf2->alias(*buf,0,0,39,7); // buf2->clone(*buf); result = font->load("OLDENG.DPF"); font->setColor(255,255,255); - font->putText(buf3,0,0,"HelloWorld"); + font->putText(buf3,0,0," World"); buf->copyBuf(0,0,buf3,40,0,79,8); - // buf2->hFlip(); + buf2->hFlip(); + buf->line(0,0,79,7,buf->RGB(255,0,0)); for (r=0; r<8; r++) { for (g=0; g<80; g++) if (buf->getPixel(g,r)) printf("*"); else printf(" "); diff --git a/src/sys/graphics/objgfx30.cpp b/src/sys/graphics/objgfx30.cpp index 0378714..0721036 100755 --- a/src/sys/graphics/objgfx30.cpp +++ b/src/sys/graphics/objgfx30.cpp @@ -886,25 +886,309 @@ * private method; draws an unclipped line from (x1,y1) to (x2,y2) * */ - + Int32 tc; if ((Buffer==NULL) || (LineOfs==NULL)) return; switch (BPP) { case 8: asm( " mov $1, %%ecx \n" // mov ecx, 1 " bt $15, %%eax \n" // bt eax, 15 - : - : "D" ((UInt8 *)Buffer+LineOfs[y1]+x1), // %0 - "S" ((UInt8 *)Buffer+LineOfs[y2]+x2), // %1 - "a" (x2-x1), "b" (y2-y1) // %2, %3 - ); + " jnc rlxPositive8 \n" + " or $-1, %%ecx \n" // or ecx, -1 + " neg %%eax \n" // neg eax +"rlxPositive8: \n" + " add %%eax, %%eax \n" // add eax, eax + " bt $15, %%ebx \n" // bt ebx, 15 + " jnc rlyPositive8 \n" + " neg %%edx \n" // neg edx + " neg %%ebx \n" // neg ebx +"rlyPositive8: \n" + " add %%ebx, %%ebx \n" // add ebx, ebx + + " cmp %%ebx, %%eax \n" // cmp eax, ebx + " jle rlyGreater8 \n" + " push %%ecx \n" // push ecx + " mov %%eax, %%ecx \n" // mov ecx, eax + " mov %%ebx, %6 \n" // mov tc, ebx + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" // pop ecx +"rlxTop8: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%al, (%%edi) \n" // mov [edi], al + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone8 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddY8 \n" + " add %%edx, %%edi \n" // add edi, edx + " sub %%eax, %6 \n" // sub tc, eax +"rlNoAddY8: \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ebx, %6 \n" // add tc, ebx + " jmp rlxTop8 \n" + +"rlyGreater8: \n" + " push %%ecx \n" // push ecx + " mov %%ebx, %%ecx \n" // mov ecx, ebx + " mov %%eax, %6 \n" // mov tc, eax + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" +"rlyTop8: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%al, (%%edi) \n" // mov [edi], al + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone8 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddX8 \n" + " add %%ecx, %%edi \n" // add edi, ecx + " sub %%ebx, %6 \n" // sub tc, ebx +"rlNoAddX8: \n" + " add %%edx, %%edi \n" // add edi, edx + " add %%eax, %6 \n" // add tc, eax + " jmp rlyTop8 \n" +"rlDone8: \n" + : + : "D" ((UInt8 *)Buffer+LineOfs[y1]+x1), // %0 + "S" ((UInt8 *)Buffer+LineOfs[y2]+x2), // %1 + "a" (x2-x1), "b" (y2-y1), // %2, %3 + "d" (xRes), "g" (colour), // %4, %5 + "g" (tc) // %6 + ); break; case 15: case 16: + asm( + " mov $1, %%ecx \n" // mov ecx, 1 + " bt $15, %%eax \n" // bt eax, 15 + " jnc rlxPositive16 \n" + " or $-1, %%ecx \n" // or ecx, -1 + " neg %%eax \n" // neg eax +"rlxPositive16: \n" + " add %%eax, %%eax \n" // add eax, eax + " bt $15, %%ebx \n" // bt ebx, 15 + " jnc rlyPositive16 \n" + " neg %%edx \n" // neg edx + " neg %%ebx \n" // neg ebx +"rlyPositive16: \n" + " add %%ebx, %%ebx \n" // add ebx, ebx + + " cmp %%ebx, %%eax \n" // cmp eax, ebx + " jle rlyGreater16 \n" + " push %%ecx \n" // push ecx + " mov %%eax, %%ecx \n" // mov ecx, eax + " mov %%ebx, %6 \n" // mov tc, ebx + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" // pop ecx +"rlxTop16: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%ax, (%%edi) \n" // mov [edi], ax + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone16 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddY16 \n" + " add %%edx, %%edi \n" // add edi, edx + " sub %%eax, %6 \n" // sub tc, eax +"rlNoAddY16: \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ebx, %6 \n" // add tc, ebx + " jmp rlxTop16 \n" + +"rlyGreater16: \n" + " push %%ecx \n" // push ecx + " mov %%ebx, %%ecx \n" // mov ecx, ebx + " mov %%eax, %6 \n" // mov tc, eax + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" +"rlyTop16: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%ax, (%%edi) \n" // mov [edi], ax + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone16 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddX16 \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " sub %%ebx, %6 \n" // sub tc, ebx +"rlNoAddX16: \n" + " add %%edx, %%edi \n" // add edi, edx + " add %%eax, %6 \n" // add tc, eax + " jmp rlyTop16 \n" +"rlDone16: \n" + : + : "D" ((UInt8 *)Buffer+LineOfs[y1]+(x1 << 1)), // %0 + "S" ((UInt8 *)Buffer+LineOfs[y2]+(x2 << 1)), // %1 + "a" (x2-x1), "b" (y2-y1), // %2, %3 + "d" (xRes), "g" (colour), // %4, %5 + "g" (tc) // %6 + ); break; case 24: + asm( + " mov $1, %%ecx \n" // mov ecx, 1 + " bt $15, %%eax \n" // bt eax, 15 + " jnc rlxPositive24 \n" + " or $-1, %%ecx \n" // or ecx, -1 + " neg %%eax \n" // neg eax +"rlxPositive24: \n" + " add %%eax, %%eax \n" // add eax, eax + " bt $15, %%ebx \n" // bt ebx, 15 + " jnc rlyPositive24 \n" + " neg %%edx \n" // neg edx + " neg %%ebx \n" // neg ebx +"rlyPositive24: \n" + " add %%ebx, %%ebx \n" // add ebx, ebx + + " cmp %%ebx, %%eax \n" // cmp eax, ebx + " jle rlyGreater24 \n" + " push %%ecx \n" // push ecx + " mov %%eax, %%ecx \n" // mov ecx, eax + " mov %%ebx, %6 \n" // mov tc, ebx + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" // pop ecx +"rlxTop24: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%ax, (%%edi) \n" // mov [edi], ax + " shr $16, %%eax \n" // shr eax, 16 + " mov %%al, 2(%%edi)\n" // mov [edi+2],al + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone24 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddY24 \n" + " add %%edx, %%edi \n" // add edi, edx + " sub %%eax, %6 \n" // sub tc, eax +"rlNoAddY24: \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ebx, %6 \n" // add tc, ebx + " jmp rlxTop24 \n" + +"rlyGreater24: \n" + " push %%ecx \n" // push ecx + " mov %%ebx, %%ecx \n" // mov ecx, ebx + " mov %%eax, %6 \n" // mov tc, eax + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" +"rlyTop24: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%ax, (%%edi) \n" // mov [edi], ax + " shr $16, %%eax \n" // shr eax, 16 + " mov %%al, 2(%%edi)\n" // mov [edi+2],al + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone24 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddX24 \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ecx, %%edi \n" // add edi, ecx + " sub %%ebx, %6 \n" // sub tc, ebx +"rlNoAddX24: \n" + " add %%edx, %%edi \n" // add edi, edx + " add %%eax, %6 \n" // add tc, eax + " jmp rlyTop24 \n" +"rlDone24: \n" + : + : "D" ((UInt8 *)Buffer+LineOfs[y1]+(x1*3)), // %0 + "S" ((UInt8 *)Buffer+LineOfs[y2]+(x2*3)), // %1 + "a" (x2-x1), "b" (y2-y1), // %2, %3 + "d" (xRes), "g" (colour), // %4, %5 + "g" (tc) // %6 + ); break; case 32: + asm( + " mov $1, %%ecx \n" // mov ecx, 1 + " bt $15, %%eax \n" // bt eax, 15 + " jnc rlxPositive32 \n" + " or $-1, %%ecx \n" // or ecx, -1 + " neg %%eax \n" // neg eax +"rlxPositive32: \n" + " add %%eax, %%eax \n" // add eax, eax + " bt $15, %%ebx \n" // bt ebx, 15 + " jnc rlyPositive32 \n" + " neg %%edx \n" // neg edx + " neg %%ebx \n" // neg ebx +"rlyPositive32: \n" + " add %%ebx, %%ebx \n" // add ebx, ebx + + " cmp %%ebx, %%eax \n" // cmp eax, ebx + " jle rlyGreater32 \n" + " push %%ecx \n" // push ecx + " mov %%eax, %%ecx \n" // mov ecx, eax + " mov %%ebx, %6 \n" // mov tc, ebx + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" // pop ecx +"rlxTop32: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%eax, (%%edi)\n" // mov [edi], eax + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone32 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddY32 \n" + " add %%edx, %%edi \n" // add edi, edx + " sub %%eax, %6 \n" // sub tc, eax +"rlNoAddY32: \n" + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ebx, %6 \n" // add tc, ebx + " jmp rlxTop32 \n" + +"rlyGreater32: \n" + " push %%ecx \n" // push ecx + " mov %%ebx, %%ecx \n" // mov ecx, ebx + " mov %%eax, %6 \n" // mov tc, eax + " shr $1, %%ecx \n" // shr ecx, 1 + " sub %%ecx, %6 \n" // sub tc, ecx + " pop %%ecx \n" +"rlyTop32: \n" + " push %%eax \n" // push eax + " mov %5, %%eax \n" // mov eax, colour + " mov %%eax, (%%edi)\n" // mov [edi], eax + " pop %%eax \n" // pop eax + " cmp %%edi, %%esi \n" // cmp esi, edi + " je rlDone32 \n" + " cmp $0, %6 \n" // cmp tc, 0 + " jl rlNoAddX32 \n" + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ecx, %%edi \n" // add edi, ecx + " add %%ecx, %%edi \n" // add edi, ecx - pix size + " add %%ecx, %%edi \n" // add edi, ecx + " sub %%ebx, %6 \n" // sub tc, ebx +"rlNoAddX32: \n" + " add %%edx, %%edi \n" // add edi, edx + " add %%eax, %6 \n" // add tc, eax + " jmp rlyTop32 \n" +"rlDone32: \n" + : + : "D" ((UInt8 *)Buffer+LineOfs[y1]+(x1 << 2)), // %0 + "S" ((UInt8 *)Buffer+LineOfs[y2]+(x2 << 2)), // %1 + "a" (x2-x1), "b" (y2-y1), // %2, %3 + "d" (xRes), "g" (colour), // %4, %5 + "g" (tc) // %6 + ); break; } // switch return;