X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=mw_utility.c;h=fa7d3420b5f089c6f9973b570266dead9e0324c6;hb=5ca93ad5eaf4345df2dac9091546f17abd87af1e;hp=2ddc12dde098f7e2dafe4f9b9bb2ac0f5ed2893f;hpb=59068bbd135c3d2ed046be5fd64850166ca04a5c;p=metawatch.git diff --git a/mw_utility.c b/mw_utility.c index 2ddc12d..fa7d342 100644 --- a/mw_utility.c +++ b/mw_utility.c @@ -21,11 +21,15 @@ #include #include -#include "mw_utility.h" #include "metawatch.h" +#include "mw_utility.h" #include "fonts.h" +/* ---------------------------------------------------------------------- + * Generic drawing functions + * ---------------------------------------------------------------------- */ + /* * The pixmap buffer has at least one byte per pixel, even for monochrome (bpp=1) * bitmaps @@ -151,6 +155,9 @@ void mw_buf_draw_pixel(mw_buffer *mwbuf, unsigned int x, unsigned int y, mw_colo if (clr == MW_TRANSPARENT) return; + if (x < 0 || x > 128 || y < 0 || y > 128) + return; + *(unsigned char *)(mwbuf->pbuf+((y*mwbuf->res_x)+x)) = clr; } @@ -252,3 +259,148 @@ void mw_buf_draw_line_bresenham(mw_buffer *mwbuf, unsigned int xstart, unsigned } } +void mw_buf_draw_line_bresenham_w(mw_buffer *mwbuf, unsigned int xstart, unsigned int ystart, unsigned int xend, unsigned int yend, unsigned char thickness, mw_color clr) +{ + int i, x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err; + + dx = xend - xstart; + dy = yend - ystart; + + incx = (dx >= 0) ? 1 : -1; + incy = (dy >= 0) ? 1 : -1; + + if (dx<0) + dx = -dx; + if (dy<0) + dy = -dy; + + if (dx>dy) { + pdx = incx; pdy = 0; + ddx=incx; ddy=incy; + es =dy; el =dx; + } else { + pdx=0; pdy=incy; + ddx=incx; ddy=incy; + es =dx; el =dy; + } + + x = xstart; + y = ystart; + err = el/2; + mw_buf_draw_pixel(mwbuf, x, y, clr); + for (i=1; idevtype, title, text, vibrate); + if (mwdevice->devtype == MW_DEVICE_TYPE_DIGITAL || mwdevice->devtype == MW_DEVICE_TYPE_DEVB_DIGI) { + mwbuf = mw_alloc_pbuffer(96, 96, 1); + mw_buf_clear(mwbuf, MW_BLACK); + + mw_buf_print(mwbuf, 0, 0, title, 0, MW_BLACK, MW_WHITE); + + i=0; + c=0; r=1; + memset(sstr,0,32); + while (i=16 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + if (r>10) + break; + }; + }; + + bbuf = mw_make_mw_buffer(mwbuf, &len); + mw_send_bitmap(mwdevice, MW_SCREEN_MODE_NOTIFICATION, 96, 96, 0, bbuf, len); + mw_update_display(mwdevice, MW_SCREEN_MODE_NOTIFICATION, 1); + mw_free_pbuffer(mwbuf); + } else if (mwdevice->devtype == MW_DEVICE_TYPE_ANA_DIGI || mwdevice->devtype == MW_DEVICE_TYPE_DEVB_ANA_DIGI) { + fprintf(stderr, "do notify OLED\n"); + mwbuf = mw_alloc_pbuffer(80, 16, 1); + mw_buf_clear(mwbuf, MW_BLACK); + + mw_buf_print(mwbuf, 0, 0, title, 0, MW_BLACK, MW_WHITE); + + i=0; + c=0; r=1; + memset(sstr,0,32); + while (i=13 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + }; + }; + + bbuf = mw_make_mw_oled_buffer(mwbuf, &len); + mw_write_oled_buffer(mwdevice, 0, MW_OLED_UPPER, 80, 0, bbuf, len); + + mw_buf_clear(mwbuf, MW_BLACK); + c=0; r=0; + memset(sstr,0,32); + while (i=13 || i>=strlen(text)) { + mw_buf_print(mwbuf, 0, r*9, sstr, 0, MW_WHITE, MW_BLACK); + memset(sstr,0,32); + c=0; r++; + if (r>2) + break; + }; + }; + + bbuf = mw_make_mw_oled_buffer(mwbuf, &len); + mw_write_oled_buffer(mwdevice, 0, MW_OLED_LOWER, 80, 0, bbuf, len); + + mw_free_pbuffer(mwbuf); + } else + fprintf(stderr, "Watch type not set - forgot to call mw_init()?\n"); + + if (vibrate) + mw_set_vibrate_mode(mwdevice, 1, 300, 300, vibrate); +} +