diff options
Diffstat (limited to 'bitmap.cpp')
-rw-r--r-- | bitmap.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/bitmap.cpp b/bitmap.cpp new file mode 100644 index 0000000..f41ca73 --- /dev/null +++ b/bitmap.cpp @@ -0,0 +1,151 @@ +/* + * Sudoku: A plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + * $Id: bitmap.cpp 11 2005-10-28 01:00:01Z tom $ + */ + +#include "bitmap.h" +#include <vdr/config.h> +#include <vdr/osdbase.h> +#include <vdr/osd.h> +#include <ctype.h> + +// Compatibility to older vdr versions +#if VDRVERSNUM < 10307 + #define tColor eDvbColor + #define DrawRectangle Fill +#endif + +using namespace SudokuPlugin; + + +//--- class SudokuPlugin::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); +} + +/** 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); + +#if VDRVERSNUM < 10307 + SetFont(fontOsd); + int lineCount; + char* wrapper = textWrapper(text, &lineCount); + int y = max((Height() - lineCount * cOsd::LineHeight()) / 2, 0); + char* line = wrapper; + while (*line) + { + char* newline = strchr(line, '\n'); + if (newline) + *newline = 0; + int x = 0; + if (centered) + x = max((Width() - Width(line)) / 2, 0); + Text(x, y, line, clrBlack, clrWhite); + if (newline) + *newline = '\n'; + if (!newline) + break; + line = newline + 1; + y += cOsd::LineHeight(); + } + free(wrapper); +#else + 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); + } +#endif +} + +/** 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); +} + +#if VDRVERSNUM < 10307 +/** Wrap the text to fit into the bitmap (taken from font.c / VDR 1.3.7). */ +char *Bitmap::textWrapper(const char *Text, int *p_lines) +{ + char *text = strdup(Text); + int lines = 1; + + char *Blank = NULL; + char *Delim = NULL; + int w = 0; + + stripspace(text); // strips trailing newlines + + for (char *p = text; *p; ) { + if (*p == '\n') { + lines++; + w = 0; + Blank = Delim = NULL; + p++; + continue; + } + else if (isspace(*p)) + Blank = p; + int cw = Width(*p); + if (w + cw > Width()) { + if (Blank) { + *Blank = '\n'; + p = Blank; + continue; + } + else { + // Here's the ugly part, where we don't have any whitespace to + // punch in a newline, so we need to make room for it: + if (Delim) + p = Delim + 1; // let's fall back to the most recent delimiter + char *s = MALLOC(char, strlen(text) + 2); // The additional '\n' plus the terminating '\0' + int l = p - text; + strncpy(s, text, l); + s[l] = '\n'; + strcpy(s + l + 1, p); + free(text); + text = s; + p = text + l; + continue; + } + } + else + w += cw; + if (strchr("-.,:;!?_", *p)) { + Delim = p; + Blank = NULL; + } + p++; + } + if (p_lines != NULL) + *p_lines = lines; + return text; +} +#endif |