diff --git a/Bitmap_8cpp_source.html b/Bitmap_8cpp_source.html new file mode 100644 index 00000000..b5b8965f --- /dev/null +++ b/Bitmap_8cpp_source.html @@ -0,0 +1,658 @@ + + + + +ArduinoLibs: Bitmap.cpp Source File + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs
+
+
+ + +
+
+
Bitmap.cpp
+
+
+
00001 /*
+00002  * Copyright (C) 2012 Southern Storm Software, Pty Ltd.
+00003  *
+00004  * Permission is hereby granted, free of charge, to any person obtaining a
+00005  * copy of this software and associated documentation files (the "Software"),
+00006  * to deal in the Software without restriction, including without limitation
+00007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+00008  * and/or sell copies of the Software, and to permit persons to whom the
+00009  * Software is furnished to do so, subject to the following conditions:
+00010  *
+00011  * The above copyright notice and this permission notice shall be included
+00012  * in all copies or substantial portions of the Software.
+00013  *
+00014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+00015  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+00016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+00017  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+00018  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+00019  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+00020  * DEALINGS IN THE SOFTWARE.
+00021  */
+00022 
+00023 #include "Bitmap.h"
+00024 #include <WString.h>
+00025 #include <string.h>
+00026 #include <stdlib.h>
+00027 
+00078 Bitmap::Bitmap(int width, int height)
+00079     : _width(width)
+00080     , _height(height)
+00081     , _stride((width + 7) / 8)
+00082     , fb(0)
+00083     , _font(0)
+00084     , _textColor(White)
+00085 {
+00086     // Allocate memory for the framebuffer and clear it (1 = pixel off).
+00087     unsigned int size = _stride * _height;
+00088     fb = (uint8_t *)malloc(size);
+00089     if (fb)
+00090         memset(fb, 0xFF, size);
+00091 }
+00092 
+00096 Bitmap::~Bitmap()
+00097 {
+00098     if (fb)
+00099         free(fb);
+00100 }
+00101 
+00164 void Bitmap::clear(Color color)
+00165 {
+00166     unsigned int size = _stride * _height;
+00167     if (color == Black)
+00168         memset(fb, 0xFF, size);
+00169     else
+00170         memset(fb, 0x00, size);
+00171 }
+00172 
+00181 Bitmap::Color Bitmap::pixel(int x, int y) const
+00182 {
+00183     if (((unsigned int)x) >= ((unsigned int)_width) ||
+00184             ((unsigned int)y) >= ((unsigned int)_height))
+00185         return Black;
+00186     uint8_t *ptr = fb + y * _stride + (x >> 3);
+00187     if (*ptr & ((uint8_t)0x80) >> (x & 0x07))
+00188         return Black;
+00189     else
+00190         return White;
+00191 }
+00192 
+00198 void Bitmap::setPixel(int x, int y, Color color)
+00199 {
+00200     if (((unsigned int)x) >= ((unsigned int)_width) ||
+00201             ((unsigned int)y) >= ((unsigned int)_height))
+00202         return;     // Pixel is off-screen.
+00203     uint8_t *ptr = fb + y * _stride + (x >> 3);
+00204     if (color)
+00205         *ptr &= ~(((uint8_t)0x80) >> (x & 0x07));
+00206     else
+00207         *ptr |= (((uint8_t)0x80) >> (x & 0x07));
+00208 }
+00209 
+00215 void Bitmap::drawLine(int x1, int y1, int x2, int y2, Color color)
+00216 {
+00217     // Midpoint line scan-conversion algorithm from "Computer Graphics:
+00218     // Principles and Practice", Second Edition, Foley, van Dam, et al.
+00219     int dx = x2 - x1;
+00220     int dy = y2 - y1;
+00221     int xstep, ystep;
+00222     int d, incrE, incrNE;
+00223     if (dx < 0) {
+00224         xstep = -1;
+00225         dx = -dx;
+00226     } else {
+00227         xstep = 1;
+00228     }
+00229     if (dy < 0) {
+00230         ystep = -1;
+00231         dy = -dy;
+00232     } else {
+00233         ystep = 1;
+00234     }
+00235     if (dx >= dy) {
+00236         d = 2 * dy - dx;
+00237         incrE = 2 * dy;
+00238         incrNE = 2 * (dy - dx);
+00239         setPixel(x1, y1, color);
+00240         while (x1 != x2) {
+00241             if (d <= 0) {
+00242                 d += incrE;
+00243             } else {
+00244                 d += incrNE;
+00245                 y1 += ystep;
+00246             }
+00247             x1 += xstep;
+00248             setPixel(x1, y1, color);
+00249         }
+00250     } else {
+00251         d = 2 * dx - dy;
+00252         incrE = 2 * dx;
+00253         incrNE = 2 * (dx - dy);
+00254         setPixel(x1, y1, color);
+00255         while (y1 != y2) {
+00256             if (d <= 0) {
+00257                 d += incrE;
+00258             } else {
+00259                 d += incrNE;
+00260                 x1 += xstep;
+00261             }
+00262             y1 += ystep;
+00263             setPixel(x1, y1, color);
+00264         }
+00265     }
+00266 }
+00267 
+00276 void Bitmap::drawRect(int x1, int y1, int x2, int y2, Color borderColor, Color fillColor)
+00277 {
+00278     int temp;
+00279     if (x1 > x2) {
+00280         temp = x1;
+00281         x1 = x2;
+00282         x2 = temp;
+00283     }
+00284     if (y1 > y2) {
+00285         temp = y1;
+00286         y1 = y2;
+00287         y2 = temp;
+00288     }
+00289     if (fillColor == borderColor) {
+00290         fill(x1, y1, x2 - x1 + 1, y2 - y1 + 1, fillColor);
+00291     } else {
+00292         drawLine(x1, y1, x2, y1, borderColor);
+00293         if (y1 < y2)
+00294             drawLine(x2, y1 + 1, x2, y2, borderColor);
+00295         if (x1 < x2)
+00296             drawLine(x2 - 1, y2, x1, y2, borderColor);
+00297         if (y1 < (y2 - 1))
+00298             drawLine(x1, y2 - 1, x1, y1 + 1, borderColor);
+00299         if (fillColor != NoFill)
+00300             fill(x1 + 1, y1 + 1, x2 - x1 - 1, y2 - y1 - 1, fillColor);
+00301     }
+00302 }
+00303 
+00324 void Bitmap::drawCircle(int centerX, int centerY, int radius, Color borderColor, Color fillColor)
+00325 {
+00326     // Midpoint circle scan-conversion algorithm using second-order
+00327     // differences from "Computer Graphics: Principles and Practice",
+00328     // Second Edition, Foley, van Dam, et al.
+00329     if (radius < 0)
+00330         radius = -radius;
+00331     int x = 0;
+00332     int y = radius;
+00333     int d = 1 - radius;
+00334     int deltaE = 3;
+00335     int deltaSE = 5 - 2 * radius;
+00336     drawCirclePoints(centerX, centerY, radius, x, y, borderColor, fillColor);
+00337     while (y > x) {
+00338         if (d < 0) {
+00339             d += deltaE;
+00340             deltaE += 2;
+00341             deltaSE += 2;
+00342         } else {
+00343             d += deltaSE;
+00344             deltaE += 2;
+00345             deltaSE += 4;
+00346             --y;
+00347         }
+00348         ++x;
+00349         drawCirclePoints(centerX, centerY, radius, x, y, borderColor, fillColor);
+00350     }
+00351 }
+00352 
+00378 void Bitmap::drawBitmap(int x, int y, const Bitmap &bitmap, Color color)
+00379 {
+00380     int w = bitmap.width();
+00381     int s = bitmap.stride();
+00382     int h = bitmap.height();
+00383     Color invColor = !color;
+00384     for (uint8_t by = 0; by < h; ++by) {
+00385         const uint8_t *line = bitmap.data() + by * s;
+00386         uint8_t mask = 0x80;
+00387         uint8_t value = *line++;
+00388         for (uint8_t bx = 0; bx < w; ++bx) {
+00389             if (value & mask)
+00390                 setPixel(x + bx, y + by, invColor);
+00391             else
+00392                 setPixel(x + bx, y + by, color);
+00393             mask >>= 1;
+00394             if (!mask) {
+00395                 mask = 0x80;
+00396                 value = *line++;
+00397             }
+00398         }
+00399     }
+00400 }
+00401 
+00415 void Bitmap::drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color)
+00416 {
+00417     uint8_t w = pgm_read_byte(bitmap);
+00418     uint8_t s = (w + 7) >> 3;
+00419     uint8_t h = pgm_read_byte(bitmap + 1);
+00420     Color invColor = !color;
+00421     for (uint8_t by = 0; by < h; ++by) {
+00422         const prog_uint8_t *line = bitmap + 2 + by * s;
+00423         uint8_t mask = 0x80;
+00424         uint8_t value = pgm_read_byte(line);
+00425         for (uint8_t bx = 0; bx < w; ++bx) {
+00426             if (value & mask)
+00427                 setPixel(x + bx, y + by, color);
+00428             else
+00429                 setPixel(x + bx, y + by, invColor);
+00430             mask >>= 1;
+00431             if (!mask) {
+00432                 mask = 0x80;
+00433                 ++line;
+00434                 value = pgm_read_byte(line);
+00435             }
+00436         }
+00437     }
+00438 }
+00439 
+00499 #define fontIsFixed(font)   (pgm_read_byte((font)) == 0 && \
+00500                              pgm_read_byte((font) + 1) == 0)
+00501 #define fontWidth(font)     (pgm_read_byte((font) + 2))
+00502 #define fontHeight(font)    (pgm_read_byte((font) + 3))
+00503 #define fontFirstChar(font) (pgm_read_byte((font) + 4))
+00504 #define fontCharCount(font) (pgm_read_byte((font) + 5))
+00505 
+00516 void Bitmap::drawText(int x, int y, const char *str, int len)
+00517 {
+00518     if (!_font)
+00519         return;
+00520     uint8_t height = fontHeight(_font);
+00521     if (len < 0)
+00522         len = strlen(str);
+00523     while (len-- > 0) {
+00524         x += drawChar(x, y, *str++);
+00525         if (len > 0) {
+00526             fill(x, y, 1, height, !_textColor);
+00527             ++x;
+00528         }
+00529         if (x >= _width)
+00530             break;
+00531     }
+00532 }
+00533 
+00545 void Bitmap::drawText(int x, int y, const String &str, int start, int len)
+00546 {
+00547     if (!_font)
+00548         return;
+00549     uint8_t height = fontHeight(_font);
+00550     if (len < 0)
+00551         len = str.length() - start;
+00552     while (len-- > 0) {
+00553         x += drawChar(x, y, str[start++]);
+00554         if (len > 0) {
+00555             fill(x, y, 1, height, !_textColor);
+00556             ++x;
+00557         }
+00558         if (x >= _width)
+00559             break;
+00560     }
+00561 }
+00562 
+00575 int Bitmap::drawChar(int x, int y, char ch)
+00576 {
+00577     uint8_t height = fontHeight(_font);
+00578     if (ch == ' ') {
+00579         // Font may not have space, or it is zero-width.  Calculate
+00580         // the real size and fill the space.
+00581         int spaceWidth = charWidth('n');
+00582         fill(x, y, spaceWidth, height, !_textColor);
+00583         return spaceWidth;
+00584     }
+00585     uint8_t first = fontFirstChar(_font);
+00586     uint8_t count = fontCharCount(_font);
+00587     uint8_t index = (uint8_t)ch;
+00588     if (index < first || index >= (first + count))
+00589         return 0;
+00590     index -= first;
+00591     uint8_t heightBytes = (height + 7) >> 3;;
+00592     uint8_t width;
+00593     const prog_uint8_t *image;
+00594     if (fontIsFixed(_font)) {
+00595         // Fixed-width font.
+00596         width = fontWidth(_font);
+00597         image = _font + 6 + index * heightBytes * width;
+00598     } else {
+00599         // Variable-width font.
+00600         width = pgm_read_byte(_font + 6 + index);
+00601         image = _font + 6 + count;
+00602         for (uint8_t temp = 0; temp < index; ++temp) {
+00603             // Scan through all previous characters to find the starting
+00604             // location for this one.
+00605             image += pgm_read_byte(_font + 6 + temp) * heightBytes;
+00606         }
+00607     }
+00608     if ((x + width) <= 0 || (y + height) <= 0)
+00609         return width;   // Character is off the top or left of the screen.
+00610     Color invColor = !_textColor;
+00611     for (uint8_t cx = 0; cx < width; ++cx) {
+00612         for (uint8_t cy = 0; cy < heightBytes; ++cy) {
+00613             uint8_t value = pgm_read_byte(image + cy * width + cx);
+00614             int posn;
+00615             if (heightBytes > 1 && cy == (heightBytes - 1))
+00616                 posn = height - 8;
+00617             else
+00618                 posn = cy * 8;
+00619             for (uint8_t bit = 0; bit < 8; ++bit) {
+00620                 if ((posn + bit) >= (cy * 8) && (posn + bit) <= height) {
+00621                     if (value & 0x01)
+00622                         setPixel(x + cx, y + posn + bit, _textColor);
+00623                     else
+00624                         setPixel(x + cx, y + posn + bit, invColor);
+00625                 }
+00626                 value >>= 1;
+00627             }
+00628         }
+00629     }
+00630     return width;
+00631 }
+00632 
+00640 int Bitmap::charWidth(char ch) const
+00641 {
+00642     uint8_t index = (uint8_t)ch;
+00643     if (!_font)
+00644         return 0;
+00645     uint8_t first = fontFirstChar(_font);
+00646     uint8_t count = fontCharCount(_font);
+00647     if (index == ' ')
+00648         index = 'n';    // In case the font does not contain space.
+00649     if (index < first || index >= (first + count))
+00650         return 0;
+00651     if (fontIsFixed(_font))
+00652         return fontWidth(_font);
+00653     else
+00654         return pgm_read_byte(_font + 6 + (index - first));
+00655 }
+00656 
+00665 int Bitmap::textWidth(const char *str, int len) const
+00666 {
+00667     int width = 0;
+00668     if (len < 0)
+00669         len = strlen(str);
+00670     while (len-- > 0) {
+00671         width += charWidth(*str++);
+00672         if (len > 0)
+00673             ++width;
+00674     }
+00675     return width;
+00676 }
+00677 
+00687 int Bitmap::textWidth(const String &str, int start, int len) const
+00688 {
+00689     int width = 0;
+00690     if (len < 0)
+00691         len = str.length() - start;
+00692     while (len-- > 0) {
+00693         width += charWidth(str[start++]);
+00694         if (len > 0)
+00695             ++width;
+00696     }
+00697     return width;
+00698 }
+00699 
+00706 int Bitmap::textHeight() const
+00707 {
+00708     if (_font)
+00709         return fontHeight(_font);
+00710     else
+00711         return 0;
+00712 }
+00713 
+00728 void Bitmap::copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY)
+00729 {
+00730     if (dest == this) {
+00731         // Copying to within the same bitmap, so copy in a direction
+00732         // that will prevent problems with overlap.
+00733         blit(x, y, x + width - 1, y + height - 1, destX, destY);
+00734     } else {
+00735         // Copying to a different bitmap.
+00736         while (height > 0) {
+00737             for (int tempx = 0; tempx < width; ++tempx)
+00738                 dest->setPixel(destX + tempx, destY, pixel(x + tempx, y));
+00739             ++y;
+00740             ++destY;
+00741             --height;
+00742         }
+00743     }
+00744 }
+00745 
+00752 void Bitmap::fill(int x, int y, int width, int height, Color color)
+00753 {
+00754     while (height > 0) {
+00755         for (int temp = 0; temp < width; ++temp)
+00756             setPixel(x + temp, y, color);
+00757         ++y;
+00758         --height;
+00759     }
+00760 }
+00761 
+00775 void Bitmap::fill(int x, int y, int width, int height, const prog_uint8_t *pattern, Color color)
+00776 {
+00777     uint8_t w = pgm_read_byte(pattern);
+00778     uint8_t s = (w + 7) >> 3;
+00779     uint8_t h = pgm_read_byte(pattern + 1);
+00780     if (!w || !h)
+00781         return;
+00782     Color invColor = !color;
+00783     for (int tempy = 0; tempy < height; ++tempy) {
+00784         const prog_uint8_t *startLine = pattern + 2 + (tempy % h) * s;
+00785         const prog_uint8_t *line = startLine;
+00786         uint8_t mask = 0x80;
+00787         uint8_t value = pgm_read_byte(line++);
+00788         int bit = 0;
+00789         for (int tempx = 0; tempx < width; ++tempx) {
+00790             if (value & mask)
+00791                 setPixel(x + tempx, y + tempy, color);
+00792             else
+00793                 setPixel(x + tempx, y + tempy, invColor);
+00794             if (++bit >= w) {
+00795                 mask = 0x80;
+00796                 line = startLine;
+00797                 value = pgm_read_byte(line++);
+00798                 bit = 0;
+00799             } else {
+00800                 mask >>= 1;
+00801                 if (!mask) {
+00802                     mask = 0x80;
+00803                     value = pgm_read_byte(line++);
+00804                 }
+00805             }
+00806         }
+00807     }
+00808 }
+00809 
+00831 void Bitmap::scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor)
+00832 {
+00833     // Bail out if no scrolling at all.
+00834     if (!dx && !dy)
+00835         return;
+00836 
+00837     // Clamp the scroll region to the extents of the bitmap.
+00838     if (x < 0) {
+00839         width += x;
+00840         x = 0;
+00841     }
+00842     if (y < 0) {
+00843         height += y;
+00844         y = 0;
+00845     }
+00846     if ((x + width) > _width)
+00847         width = _width - x;
+00848     if ((y + height) > _height)
+00849         height = _height - y;
+00850     if (width <= 0 || height <= 0)
+00851         return;
+00852 
+00853     // Scroll the region in the specified direction.
+00854     if (dy < 0) {
+00855         if (dx < 0)
+00856             blit(x - dx, y - dy, x + width - 1 + dx, y + height - 1 + dy, x, y);
+00857         else
+00858             blit(x, y - dy, x + width - 1 - dx, y + height - 1 + dy, x + dx, y);
+00859     } else {
+00860         if (dx < 0)
+00861             blit(x - dx, y, x + width - 1 + dx, y + height - 1 - dy, x, y + dy);
+00862         else
+00863             blit(x, y, x + width - 1 - dx, y + height - 1 - dy, x + dx, y + dy);
+00864     }
+00865 
+00866     // Fill the pixels that were uncovered by the scroll.
+00867     if (dy < 0) {
+00868         fill(x, y + height + dy, width, -dy, fillColor);
+00869         if (dx < 0)
+00870             fill(x + width + dx, y, -dx, height + dy, fillColor);
+00871         else if (dx > 0)
+00872             fill(x, y, dx, height + dy, fillColor);
+00873     } else if (dy > 0) {
+00874         fill(x, y, width, -dy, fillColor);
+00875         if (dx < 0)
+00876             fill(x + width + dx, y + dy, -dx, height - dy, fillColor);
+00877         else if (dx > 0)
+00878             fill(x, y + dy, dx, height - dy, fillColor);
+00879     } else if (dx < 0) {
+00880         fill(x + width + dx, y, -dx, height, fillColor);
+00881     } else if (dx > 0) {
+00882         fill(x, y, dx, height, fillColor);
+00883     }
+00884 }
+00885 
+00892 void Bitmap::invert(int x, int y, int width, int height)
+00893 {
+00894     while (height > 0) {
+00895         for (int tempx = x + width - 1; tempx >= x; --tempx)
+00896             setPixel(tempx, y, !pixel(tempx, y));
+00897         --height;
+00898         ++y;
+00899     }
+00900 }
+00901 
+00902 void Bitmap::blit(int x1, int y1, int x2, int y2, int x3, int y3)
+00903 {
+00904     if (y3 < y1 || (y1 == y3 && x3 <= x1)) {
+00905         for (int tempy = y1; tempy <= y2; ++tempy) {
+00906             int y = y1 - tempy + y3;
+00907             int x = x3 - x1;
+00908             for (int tempx = x1; tempx <= x2; ++tempx)
+00909                 setPixel(x + tempx, y, pixel(tempx, tempy));
+00910         }
+00911     } else {
+00912         for (int tempy = y2; tempy >= y1; --tempy) {
+00913             int y = y1 - tempy + y3;
+00914             int x = x3 - x1;
+00915             for (int tempx = x2; tempx >= x1; --tempx)
+00916                 setPixel(x + tempx, y, pixel(tempx, tempy));
+00917         }
+00918     }
+00919 }
+00920 
+00921 void Bitmap::drawCirclePoints(int centerX, int centerY, int radius, int x, int y, Color borderColor, Color fillColor)
+00922 {
+00923     if (x != y) {
+00924         setPixel(centerX + x, centerY + y, borderColor);
+00925         setPixel(centerX + y, centerY + x, borderColor);
+00926         setPixel(centerX + y, centerY - x, borderColor);
+00927         setPixel(centerX + x, centerY - y, borderColor);
+00928         setPixel(centerX - x, centerY - y, borderColor);
+00929         setPixel(centerX - y, centerY - x, borderColor);
+00930         setPixel(centerX - y, centerY + x, borderColor);
+00931         setPixel(centerX - x, centerY + y, borderColor);
+00932         if (fillColor != NoFill) {
+00933             if (radius > 1) {
+00934                 drawLine(centerX - x + 1, centerY + y, centerX + x - 1, centerY + y, fillColor);
+00935                 drawLine(centerX - y + 1, centerY + x, centerX + y - 1, centerY + x, fillColor);
+00936                 drawLine(centerX - x + 1, centerY - y, centerX + x - 1, centerY - y, fillColor);
+00937                 drawLine(centerX - y + 1, centerY - x, centerX + y - 1, centerY - x, fillColor);
+00938             } else if (radius == 1) {
+00939                 setPixel(centerX, centerY, fillColor);
+00940             }
+00941         }
+00942     } else {
+00943         setPixel(centerX + x, centerY + y, borderColor);
+00944         setPixel(centerX + y, centerY - x, borderColor);
+00945         setPixel(centerX - x, centerY - y, borderColor);
+00946         setPixel(centerX - y, centerY + x, borderColor);
+00947         if (fillColor != NoFill) {
+00948             if (radius > 1) {
+00949                 drawLine(centerX - x + 1, centerY + y, centerX + x - 1, centerY + y, fillColor);
+00950                 drawLine(centerX - x + 1, centerY - y, centerX + x - 1, centerY - y, fillColor);
+00951             } else if (radius == 1) {
+00952                 setPixel(centerX, centerY, fillColor);
+00953             }
+00954         }
+00955     }
+00956 }
+
+
+ +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator
+ + +
+ +
+ + + + diff --git a/Bitmap_8h_source.html b/Bitmap_8h_source.html new file mode 100644 index 00000000..f12e9bad --- /dev/null +++ b/Bitmap_8h_source.html @@ -0,0 +1,221 @@ + + + + +ArduinoLibs: Bitmap.h Source File + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs
+
+
+ + +
+
+
Bitmap.h
+
+
+
00001 /*
+00002  * Copyright (C) 2012 Southern Storm Software, Pty Ltd.
+00003  *
+00004  * Permission is hereby granted, free of charge, to any person obtaining a
+00005  * copy of this software and associated documentation files (the "Software"),
+00006  * to deal in the Software without restriction, including without limitation
+00007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+00008  * and/or sell copies of the Software, and to permit persons to whom the
+00009  * Software is furnished to do so, subject to the following conditions:
+00010  *
+00011  * The above copyright notice and this permission notice shall be included
+00012  * in all copies or substantial portions of the Software.
+00013  *
+00014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+00015  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+00016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+00017  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+00018  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+00019  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+00020  * DEALINGS IN THE SOFTWARE.
+00021  */
+00022 
+00023 #ifndef Bitmap_h
+00024 #define Bitmap_h
+00025 
+00026 #include <inttypes.h>
+00027 #include <avr/pgmspace.h>
+00028 
+00029 class DMD;
+00030 class String;
+00031 
+00032 class Bitmap
+00033 {
+00034 public:
+00035     Bitmap(int width, int height);
+00036     ~Bitmap();
+00037 
+00038     bool isValid() const { return fb != 0; }
+00039 
+00040     typedef uint8_t Color;
+00041 
+00042     static const Color Black  = 0;
+00043     static const Color White  = 1;
+00044     static const Color NoFill = 2;
+00045 
+00046     int width() const { return _width; }
+00047     int height() const { return _height; }
+00048     int stride() const { return _stride; }
+00049     int bitsPerPixel() const { return 1; }
+00050 
+00051     uint8_t *data() { return fb; }
+00052     const uint8_t *data() const { return fb; }
+00053 
+00054     void clear(Color color = Black);
+00055 
+00056     Color pixel(int x, int y) const;
+00057     void setPixel(int x, int y, Color color);
+00058 
+00059     void drawLine(int x1, int y1, int x2, int y2, Color color = White);
+00060     void drawRect(int x1, int y1, int x2, int y2, Color borderColor = White, Color fillColor = NoFill);
+00061     void drawFilledRect(int x1, int y1, int x2, int y2, Color color = White);
+00062     void drawCircle(int centerX, int centerY, int radius, Color borderColor = White, Color fillColor = NoFill);
+00063     void drawFilledCircle(int centerX, int centerY, int radius, Color color = White);
+00064 
+00065     void drawBitmap(int x, int y, const Bitmap &bitmap, Color color = White);
+00066     void drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color = White);
+00067     void drawInvertedBitmap(int x, int y, const Bitmap &bitmap);
+00068     void drawInvertedBitmap(int x, int y, const prog_uint8_t *bitmap);
+00069 
+00070     const prog_uint8_t *font() const { return _font; }
+00071     void setFont(const prog_uint8_t *font) { _font = font; }
+00072 
+00073     Color textColor() const { return _textColor; }
+00074     void setTextColor(Color color) { _textColor = color; }
+00075 
+00076     void drawText(int x, int y, const char *str, int len = -1);
+00077     void drawText(int x, int y, const String &str, int start = 0, int len = -1);
+00078 
+00079     int drawChar(int x, int y, char ch);
+00080 
+00081     int charWidth(char ch) const;
+00082     int textWidth(const char *str, int len = -1) const;
+00083     int textWidth(const String &str, int start = 0, int len = -1) const;
+00084     int textHeight() const;
+00085 
+00086     void copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY);
+00087     void fill(int x, int y, int width, int height, Color color);
+00088     void fill(int x, int y, int width, int height, const prog_uint8_t *pattern, Color color = White);
+00089 
+00090     void scroll(int dx, int dy, Color fillColor = Black);
+00091     void scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor = Black);
+00092 
+00093     void invert(int x, int y, int width, int height);
+00094 
+00095 private:
+00096     // Disable copy constructor and operator=().
+00097     Bitmap(const Bitmap &) {}
+00098     Bitmap &operator=(const Bitmap &) { return *this; }
+00099 
+00100     int _width;
+00101     int _height;
+00102     int _stride;
+00103     uint8_t *fb;
+00104     const prog_uint8_t *_font;
+00105     Color _textColor;
+00106 
+00107     friend class DMD;
+00108 
+00109     void blit(int x1, int y1, int x2, int y2, int x3, int y3);
+00110     void drawCirclePoints(int centerX, int centerY, int radius, int x, int y, Color borderColor, Color fillColor);
+00111 };
+00112 
+00113 inline void Bitmap::drawFilledRect(int x1, int y1, int x2, int y2, Color color)
+00114 {
+00115     drawRect(x1, y1, x2, y2, color, color);
+00116 }
+00117 
+00118 inline void Bitmap::drawFilledCircle(int centerX, int centerY, int radius, Color color)
+00119 {
+00120     drawCircle(centerX, centerY, radius, color, color);
+00121 }
+00122 
+00123 inline void Bitmap::drawInvertedBitmap(int x, int y, const Bitmap &bitmap)
+00124 {
+00125     drawBitmap(x, y, bitmap, Black);
+00126 }
+00127 
+00128 inline void Bitmap::drawInvertedBitmap(int x, int y, const prog_uint8_t *bitmap)
+00129 {
+00130     drawBitmap(x, y, bitmap, Black);
+00131 }
+00132 
+00133 inline void Bitmap::scroll(int dx, int dy, Color fillColor)
+00134 {
+00135     scroll(0, 0, _width, _height, dx, dy, fillColor);
+00136 }
+00137 
+00138 #endif
+
+
+ +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator
+ + +
+ +
+ + + + diff --git a/BlinkLED_8cpp_source.html b/BlinkLED_8cpp_source.html index c04073c3..c2376ce5 100644 --- a/BlinkLED_8cpp_source.html +++ b/BlinkLED_8cpp_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Enumerations Enumerator + All Classes Files Functions Variables Typedefs Enumerations Enumerator
@@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-