MythTV  0.26-pre
drawmethods.h
Go to the documentation of this file.
00001 #ifndef _DRAWMETHODS_H
00002 #define _DRAWMETHODS_H
00003 
00004 #include "goomconfig.h"
00005 
00006 #define DRAWMETHOD_NORMAL(adr,col) {*(adr) = (col);}
00007 
00008 #ifdef MMX
00009 #include "mmx.h"
00010 
00011 #define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
00012 {\
00013 movd_m2r (_backbuf, mm0); \
00014 paddusb_m2r (_col, mm0); \
00015 movd_r2m (mm0, _out); \
00016 }
00017 
00018 #else
00019 #define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
00020 {\
00021       int tra=0,i=0;\
00022       unsigned char *bra = (unsigned char*)&(_backbuf);\
00023       unsigned char *dra = (unsigned char*)&(_out);\
00024       unsigned char *cra = (unsigned char*)&(_col);\
00025       for (;i<4;i++) {\
00026                                 tra = *cra;\
00027                                 tra += *bra;\
00028                                 if (tra>255) tra=255;\
00029                                 *dra = tra;\
00030                                 ++dra;++cra;++bra;\
00031                         }\
00032 }
00033 #endif
00034 
00035 #define DRAWMETHOD_OR(adr,col) {*(adr)|=(col);}
00036 
00037 #ifdef MMX
00038 #define DRAWMETHOD_DONE() {__asm__ __volatile__ ("emms");}
00039 #else
00040 #define DRAWMETHOD_DONE() {}
00041 #endif
00042 
00043 #ifndef DRAWMETHOD
00044 #define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col)
00045 
00046 static void draw_line (int *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) {
00047     int     x, y, dx, dy, yy, xx;       // am, tmp;
00048         int    *p;
00049 
00050 
00051         if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) 
00052                         return;
00053         
00054         dx = x2 - x1;
00055         dy = y2 - y1;
00056         if (x1 > x2) {
00057                 int     tmp;
00058 
00059                 tmp = x1;
00060                 x1 = x2;
00061                 x2 = tmp;
00062                 tmp = y1;
00063                 y1 = y2;
00064                 y2 = tmp;
00065                 dx = x2 - x1;
00066                 dy = y2 - y1;
00067         }
00068 
00069         /* vertical line */
00070         if (dx == 0) {
00071                 if (y1 < y2) {
00072                         p = &(data[(screenx * y1) + x1]);
00073                         for (y = y1; y <= y2; y++) {
00074                                 DRAWMETHOD;
00075                                 p += screenx;
00076                         }
00077                 }
00078                 else {
00079                         p = &(data[(screenx * y2) + x1]);
00080                         for (y = y2; y <= y1; y++) {
00081                                 DRAWMETHOD;
00082                                 p += screenx;
00083                         }
00084                 }
00085                 return;
00086         }
00087         /* horizontal line */
00088         if (dy == 0) {
00089                 if (x1 < x2) {
00090                         p = &(data[(screenx * y1) + x1]);
00091                         for (x = x1; x <= x2; x++) {
00092                                 DRAWMETHOD;
00093                                 p++;
00094                         }
00095                         return;
00096                 }
00097                 else {
00098                         p = &(data[(screenx * y1) + x2]);
00099                         for (x = x2; x <= x1; x++) {
00100                                 DRAWMETHOD;
00101                                 p++;
00102                         }
00103                         return;
00104                 }
00105         }
00106         /* 1    */
00107         
00108         /* 2 */
00109         if (y2 > y1) {
00110                 /* steep */
00111                 if (dy > dx) {
00112                         dx = ((dx << 16) / dy);
00113                         x = x1 << 16;
00114                         for (y = y1; y <= y2; y++) {
00115                                 xx = x >> 16;
00116                                 p = &(data[(screenx * y) + xx]);
00117                                 DRAWMETHOD;
00118                                 if (xx < (screenx - 1)) {
00119                                         p++;
00120                                 }
00121                                 x += dx;
00122                         }
00123                         return;
00124                 }
00125                 /* shallow */
00126                 else {
00127                         dy = ((dy << 16) / dx);
00128                         y = y1 << 16;
00129                         for (x = x1; x <= x2; x++) {
00130                                 yy = y >> 16;
00131                                 p = &(data[(screenx * yy) + x]);
00132                                 DRAWMETHOD;
00133                                 if (yy < (screeny - 1)) {
00134                                         p += screeny;
00135                                 }
00136                                 y += dy;
00137                         }
00138                 }
00139         }
00140         /* 2 */
00141         
00142         /* 1    */
00143         else {
00144                 /* steep */
00145                 if (-dy > dx) {
00146                         dx = ((dx << 16) / -dy);
00147                         x = (x1 + 1) << 16;
00148                         for (y = y1; y >= y2; y--) {
00149                                 xx = x >> 16;
00150                                 p = &(data[(screenx * y) + xx]);
00151                                 DRAWMETHOD;
00152                                 if (xx < (screenx - 1)) {
00153                                         p--;
00154                                 }
00155                                 x += dx;
00156                         }
00157                         return;
00158                 }
00159                 /* shallow */
00160                 else {
00161                         dy = ((dy << 16) / dx);
00162                         y = y1 << 16;
00163                         for (x = x1; x <= x2; x++) {
00164                                 yy = y >> 16;
00165                                 p = &(data[(screenx * yy) + x]);
00166                                 DRAWMETHOD;
00167                                 if (yy < (screeny - 1)) {
00168                                         p += screeny;
00169                                 }
00170                                 y += dy;
00171                         }
00172                         return;
00173                 }
00174         }
00175 }
00176 #endif
00177 
00178 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends