diff options
Diffstat (limited to 'bitmap.cpp')
-rw-r--r-- | bitmap.cpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/bitmap.cpp b/bitmap.cpp new file mode 100644 index 0000000..998d5d8 --- /dev/null +++ b/bitmap.cpp @@ -0,0 +1,190 @@ +/* + * Spider-Arachnid: A plugin for the Video Disk Recorder + * + * Copyright (C) 2005-2007, Thomas Günther <tom@toms-cafe.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * $Id: bitmap.cpp 94 2007-09-20 23:43:48Z tom $ + */ + +#include "bitmap.h" +#include <vdr/config.h> +#include <vdr/osdbase.h> +#include <vdr/osd.h> +#include <ctype.h> + + +/** --- class Bitmap ------------------------------------------------------- **/ + +/** Constructor */ +Bitmap::Bitmap(int width, int height) : + cBitmap(width, height, 4) +{ +} + +/** Constructor for a bitmap with frame */ +Bitmap::Bitmap(int width, int height, tColor frameColor, tColor backgroundColor) : + cBitmap(width, height, 4) +{ + DrawRectangle(0, 0, width - 1, height - 1, backgroundColor); + frame(0, 0, width - 1, height - 1, frameColor); +} + +/** Constructor for a bitmap read from an xpm file */ +Bitmap::Bitmap(int width, int height, const char* dir, const char* name) : + cBitmap(width, height, 4) +{ + char* path; + asprintf(&path, "%s/%s.xpm", dir, name); + loadXpm(path); + free(path); +} + +/** Constructor for a card bitmap read from an xpm file */ +Bitmap::Bitmap(int width, int height, const char* dir, + const char* suit, const char* rank) : + cBitmap(width, height, 4) +{ + char* path; + asprintf(&path, "%s/%s_%s.xpm", dir, suit, rank); + loadXpm(path); + free(path); +} + +/** Write a text into the bitmap */ +void Bitmap::text(const char* text, bool centered) +{ + DrawRectangle(0, 0, Width() - 1, Height() - 1, clrWhite); + frame(0, 0, Width() - 1, Height() - 1, clrRed); + const cFont* font = cFont::GetFont(fontOsd); + cTextWrapper wrapper(text, font, Width()); + int y = max((Height() - wrapper.Lines() * font->Height()) / 2, 0); + for (int l = 0; l < wrapper.Lines(); ++l, y += font->Height()) + { + int x = 0; + if (centered) + x = max((Width() - font->Width(wrapper.GetLine(l))) / 2, 0); + DrawText(x, y, wrapper.GetLine(l), clrBlack, clrWhite, font); + } +} + +/** Draw a frame into the bitmap */ +void Bitmap::frame(int x1, int y1, int x2, int y2, tColor frameColor) +{ + DrawRectangle(x1, y1, x2, y1 + 1, frameColor); + DrawRectangle(x1, y1, x1 + 1, y2, frameColor); + DrawRectangle(x1, y2 - 1, x2, y2, frameColor); + DrawRectangle(x2 - 1, y1, x2, y2, frameColor); +} + +/** Load a bitmap from an xpm file - taken from ElchiAIO4d patch */ +bool Bitmap::loadXpm(const char* FileName, tColor NoneColor) +{ + bool bRet = false; + FILE *infile; + infile = fopen(FileName, "r"); + if (infile) { + bool ok = true; + char buf[512]; + char *ptr; + int state = 0; + int width, height, colors, colwidth, cnt = 0; + int temp; + uint pal[65536]; + + while (ok && fgets(buf, sizeof(buf), infile) != NULL) { + int len = strlen(buf); + ptr = buf; + if (ptr[len - 1] == '\n') + ptr[--len] = '\0'; + + if (state > 0 && strncmp(ptr, "/*", 2) == 0) { + continue; + } + + switch (state) { + case 0: + if (strcmp(ptr, "/* XPM */") != 0) { + esyslog("ERROR: loading xpm %s failed: invalid header", FileName); + ok = false; + break; + } + ++state; + break; + case 1: + ++state; + break; + case 2: + sscanf(ptr, "\"%d %d %d %d\",", &width, &height, &colors, &colwidth); + if (colwidth > 2) { + esyslog("ERROR: wrong colorwidth in xpm %s", FileName); + ok = false; + break; + } + cnt = 0; + ++state; + break; + case 3: + ++ptr; + temp = 0; + for (int i = 0; i < colwidth; ++i) { + temp <<= 8; + temp += (int)*ptr; + ++ptr; + } + ++ptr; + if (strncmp(ptr, "c ", 2) != 0) { + esyslog("ERROR: wrong character in xpm %s", FileName); + ok = false; + break; + } + ptr += 2; + if (*ptr == '#') { + int col = strtoul(++ptr, NULL, 16); + pal[temp] = 0xff000000 | col; + } + else { + pal[temp] = NoneColor; + } + if (++cnt == colors) { + cnt = 0; + ++state; + } + break; + case 4: + ++ptr; + for (int p = 0; p < width; ++p) { + temp = 0; + for (int i = 0; i < colwidth; ++i) { + temp <<= 8; + temp += (int)*ptr; + ++ptr; + } + DrawPixel(p, cnt, (tColor)pal[temp]); + } + if (++cnt == height) { + ++state; + bRet = true; + } + break; + default: + break; + } + } + fclose(infile); + } + return bRet; +} |