From: uz Date: Thu, 5 Nov 2009 19:52:18 +0000 (+0000) Subject: Added a tgi_arc function. Removed the old ellipse code and create a new X-Git-Tag: V2.13.1~83 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=de6050f21d61d58cc2d15022e1f00c1a88f3cb44;p=cc65 Added a tgi_arc function. Removed the old ellipse code and create a new ellipse module that calls tgi_arc. git-svn-id: svn://svn.cc65.org/cc65/trunk@4446 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/asminc/tgi-kernel.inc b/asminc/tgi-kernel.inc index 012dfdc10..8d9151dcb 100644 --- a/asminc/tgi-kernel.inc +++ b/asminc/tgi-kernel.inc @@ -150,44 +150,43 @@ TGI_TEXT_VERTICAL = 1 ;------------------------------------------------------------------------------ ; C callable functions - .global _tgi_load - .global _tgi_load_driver - .global _tgi_unload - .global _tgi_install - .global _tgi_uninstall - .global _tgi_init - .global _tgi_ioctl + .global _tgi_arc + .global _tgi_bar + .global _tgi_circle + .global _tgi_clear .global _tgi_done + .global _tgi_ellipse + .global _tgi_getcolor + .global _tgi_getcolorcount + .global _tgi_getdefpalette .global _tgi_geterror .global _tgi_geterrormsg - .global _tgi_clear - .global _tgi_getpagecount - .global _tgi_setviewpage - .global _tgi_setdrawpage - .global _tgi_getcolorcount .global _tgi_getmaxcolor - .global _tgi_setcolor - .global _tgi_getcolor - .global _tgi_setpalette - .global _tgi_getpalette - .global _tgi_getdefpalette - .global _tgi_getxres .global _tgi_getmaxx - .global _tgi_getyres .global _tgi_getmaxy + .global _tgi_getpagecount + .global _tgi_getpalette .global _tgi_getpixel - .global _tgi_setpixel + .global _tgi_getxres + .global _tgi_getyres .global _tgi_gotoxy + .global _tgi_init + .global _tgi_install + .global _tgi_ioctl .global _tgi_line .global _tgi_lineto - .global _tgi_circle - .global _tgi_ellipse - .global _tgi_bar + .global _tgi_load + .global _tgi_load_driver + .global _tgi_outtext + .global _tgi_outtextxy + .global _tgi_setcolor + .global _tgi_setdrawpage + .global _tgi_setpalette + .global _tgi_setpixel + .global _tgi_setviewpage + .global _tgi_textheight .global _tgi_textscale .global _tgi_textstyle .global _tgi_textwidth - .global _tgi_textheight - .global _tgi_outtext - .global _tgi_outtextxy - - + .global _tgi_uninstall + .global _tgi_unload diff --git a/doc/funcref.sgml b/doc/funcref.sgml index 67b6ef633..13293d6b8 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -505,6 +505,7 @@ It does not declare any functions.

+ @@ -4872,6 +4873,39 @@ be used in presence of a prototype. +tgi_arc

+ + + +/ + +The function is only available as fastcall function, so it may only +be used in presence of a prototype. +The function behaves unexpectedly or may crash if the angles are out +of range. + +, +, +, + + +/* Draw the upper half of an ellipse */ +tgi_setcolor(TGI_COLOR_BLUE); +tgi_arc (50, 50, 40, 20, 0, 180); + + + + + tgi_bar

@@ -4910,6 +4944,7 @@ be used in presence of a prototype. , , , @@ -4975,6 +5010,7 @@ be used in presence of a prototype. , , , @@ -5042,7 +5078,7 @@ if (tgi_getcolorcount() == 2) { / The function is only available as fastcall function, so it may only diff --git a/libsrc/tgi/Makefile b/libsrc/tgi/Makefile index 9a8147436..4f15e3d20 100644 --- a/libsrc/tgi/Makefile +++ b/libsrc/tgi/Makefile @@ -29,7 +29,7 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include #-------------------------------------------------------------------------- # Object files -C_OBJS = tgi_ellipse.o \ +C_OBJS = tgi_arc.o \ tgi_load.o \ tgi_load_driver.o \ tgi_load_vectorfont.o @@ -41,6 +41,7 @@ S_OBJS = tgi-kernel.o \ tgi_clipline.o \ tgi_curtoxy.o \ tgi_done.o \ + tgi_ellipse.o \ tgi_free_vectorfont.o \ tgi_getcolor.o \ tgi_getcolorcount.o \ diff --git a/libsrc/tgi/tgi_arc.c b/libsrc/tgi/tgi_arc.c new file mode 100644 index 000000000..1ce239fc4 --- /dev/null +++ b/libsrc/tgi/tgi_arc.c @@ -0,0 +1,101 @@ +/*****************************************************************************/ +/* */ +/* tgi_arc.c */ +/* */ +/* Draw an ellipse arc */ +/* */ +/* */ +/* */ +/* (C) 2002-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +static int RoundMul (int rhs, int lhs) +{ + long res = cc65_imul16x16r32 (rhs, lhs); + if ((unsigned char)res & 0x80) { + return (int)(res >> 8) + 1; + } else { + return (int)(res >> 8); + } +} + + + +void __fastcall__ tgi_arc (int x, int y, unsigned char rx, unsigned char ry, + unsigned sa, unsigned ea) +/* Draw an ellipse arc with center at x/y and radii rx/ry using the current + * drawing color. The arc covers the angle between sa and ea (startangle and + * endangle), which must be in the range 0..360 (otherwise the function may + * bevave unextectedly). + */ +{ + int x1, y1, x2, y2; + unsigned char inc; + unsigned char done = 0; + + /* Bail out if there's nothing to do */ + if (sa > ea) { + return; + } + + /* Determine the number of segments to use. This may be refined ... */ + if (rx + ry >= 25) { + inc = 12; + } else { + inc = 24; + } + + /* Calculate the start coords */ + x1 = x + RoundMul (rx, cc65_cos (sa)); + y1 = y + RoundMul (ry, cc65_sin (sa)); + do { + sa += inc; + if (sa >= ea) { + sa = ea; + done = 1; + } + x2 = x + RoundMul (rx, cc65_cos (sa)); + y2 = y - RoundMul (ry, cc65_sin (sa)); + tgi_line (x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } while (!done); +} + + + diff --git a/libsrc/tgi/tgi_ellipse.c b/libsrc/tgi/tgi_ellipse.c deleted file mode 100644 index 6f42b1a49..000000000 --- a/libsrc/tgi/tgi_ellipse.c +++ /dev/null @@ -1,92 +0,0 @@ -/*****************************************************************************/ -/* */ -/* tgi_ellipse.c */ -/* */ -/* Draw a full ellipse */ -/* */ -/* */ -/* */ -/* (C) 2002-2009, Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -static int RoundMul (int rhs, int lhs) -{ - long res = cc65_imul16x16r32 (rhs, lhs); - if ((unsigned char)res & 0x80) { - return (int)(res >> 8) + 1; - } else { - return (int)(res >> 8); - } -} - - - -void __fastcall__ tgi_ellipse (int x, int y, unsigned char rx, unsigned char ry) -/* Draw a full ellipse with center at x/y and radii rx/ry using the current - * drawing color. - */ -{ - int x1, y1, x2, y2; - unsigned angle; - unsigned char inc; - unsigned size = rx + ry; - - if (size >= 128) { - inc = 12; - } else if (size >= 32) { - inc = 15; - } else if (size >= 12) { - inc = 20; - } else { - inc = 45; - } - - x1 = x + rx; - y1 = y; - angle = 0; - for (angle = 0; angle <= 360; angle += inc) { - x2 = x + RoundMul (rx, cc65_cos (angle)); - y2 = y + RoundMul (ry, cc65_sin (angle)); - tgi_line (x1, y1, x2, y2); - x1 = x2; - y1 = y2; - } -} - - - diff --git a/libsrc/tgi/tgi_ellipse.s b/libsrc/tgi/tgi_ellipse.s new file mode 100644 index 000000000..1471f9156 --- /dev/null +++ b/libsrc/tgi/tgi_ellipse.s @@ -0,0 +1,28 @@ +; +; Ullrich von Bassewitz, 2009-11-05 +; +; void __fastcall__ tgi_ellipse (int x, int y, unsigned char rx, unsigned char ry); +; /* Draw a full ellipse with center at x/y and radii rx/ry using the current +; * drawing color. +; */ +; + + + .include "tgi-kernel.inc" + + .import pusha, push0 + + +;---------------------------------------------------------------------------- +; + +.code +.proc _tgi_ellipse + + jsr pusha ; Push ry + jsr push0 ; Start angle is 0 + lda #<360 + ldx #>360 ; End angle is 360 + jmp _tgi_arc + +.endproc