Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of N5110 by
Revision 43:c2598020fcac, committed 2017-03-21
- Comitter:
- valavanisalex
- Date:
- Tue Mar 21 11:46:14 2017 +0000
- Parent:
- 42:596c207519de
- Commit message:
- Fix line rendering when direction is negative
Changed in this revision
N5110.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 596c207519de -r c2598020fcac N5110.cpp --- a/N5110.cpp Tue Mar 21 10:43:19 2017 +0000 +++ b/N5110.cpp Tue Mar 21 11:46:14 2017 +0000 @@ -370,12 +370,13 @@ unsigned int const y1, unsigned int const type) { - int y_range = y1-y0; // calc range of y and x - int x_range = x1-x0; - int start,stop,step; + // Note that the ranges can be negative so we have to turn the input values + // into signed integers first + int const y_range = static_cast<int>(y1) - static_cast<int>(y0); + int const x_range = static_cast<int>(x1) - static_cast<int>(x0); // if dotted line, set step to 2, else step is 1 - step = (type==2) ? 2:1; + unsigned int const step = (type==2) ? 2:1; // make sure we loop over the largest range to get the most pixels on the display // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels @@ -383,13 +384,14 @@ if ( abs(x_range) > abs(y_range) ) { // ensure we loop from smallest to largest or else for-loop won't run as expected - start = x1>x0 ? x0:x1; - stop = x1>x0 ? x1:x0; + unsigned int const start = x_range > 0 ? x0:x1; + unsigned int const stop = x_range > 0 ? x1:x0; // loop between x pixels - for (int x = start; x<= stop ; x+=step) { + for (unsigned int x = start; x<= stop ; x+=step) { // do linear interpolation - int y = y0 + (y1-y0)*(x-x0)/(x1-x0); + int const dx = static_cast<int>(x)-static_cast<int>(x0); + unsigned int const y = y0 + y_range * dx / x_range; // If the line type is '0', this will clear the pixel // If it is '1' or '2', the pixel will be set @@ -398,12 +400,13 @@ } else { // ensure we loop from smallest to largest or else for-loop won't run as expected - start = y1>y0 ? y0:y1; - stop = y1>y0 ? y1:y0; + unsigned int const start = y_range > 0 ? y0:y1; + unsigned int const stop = y_range > 0 ? y1:y0; - for (int y = start; y<= stop ; y+=step) { + for (unsigned int y = start; y<= stop ; y+=step) { // do linear interpolation - int x = x0 + (x1-x0)*(y-y0)/(y1-y0); + int const dy = static_cast<int>(y)-static_cast<int>(y0); + unsigned int const x = x0 + x_range * dy / y_range; // If the line type is '0', this will clear the pixel // If it is '1' or '2', the pixel will be set @@ -437,7 +440,7 @@ int nrows, int ncols, int *sprite) -{ +{ for (int i = 0; i < nrows; i++) { for (int j = 0 ; j < ncols ; j++) {