13 #include <sys/ioctl.h>
15 #include <sys/unistd.h>
25 double p = V * (1 - S);
26 double q = V * (1 - S * f);
27 double t = V * (1 - S * (1 - f));
45 double f = fabs(
constrain(Factor, -1.0, 1.0));
46 double w = Factor > 0 ? f * 0xFF : 0;
47 return (Color & 0xFF000000) |
48 (
min(0xFF,
int((1 - f) * ((Color >> 16) & 0xFF) + w + 0.5)) << 16) |
49 (
min(0xFF,
int((1 - f) * ((Color >> 8) & 0xFF) + w + 0.5)) << 8) |
50 (
min(0xFF,
int((1 - f) * ( Color & 0xFF) + w + 0.5)) );
65 for (
int alphaA = 0; alphaA < 255; alphaA++) {
66 int range = (alphaA == 255 ? 255 : 254);
67 for (
int alphaB = 0; alphaB < 256; alphaB++) {
68 int alphaO_x_range = 255 * alphaA + alphaB * (range - alphaA);
71 int factorA = (256 * 255 * alphaA + alphaO_x_range / 2) / alphaO_x_range;
72 int factorB = (256 * alphaB * (range - alphaA) + alphaO_x_range / 2) / alphaO_x_range;
83 tColor Alpha = (ColorFg & 0xFF000000) >> 24;
86 uint16_t *lut = &
AlphaLutFactors[Alpha][(ColorBg & 0xFF000000) >> 24][0];
88 | (((((ColorFg & 0x00FF00FF) * lut[0] + (ColorBg & 0x00FF00FF) * lut[1])) & 0xFF00FF00)
89 | ((((ColorFg & 0x0000FF00) * lut[0] + (ColorBg & 0x0000FF00) * lut[1])) & 0x00FF0000)) >> 8);
97 tColor RB = (Color & 0x00FF00FF) * Alpha;
98 RB = ((RB + ((RB >> 8) & 0x00FF00FF) + 0x00800080) >> 8) & 0x00FF00FF;
99 tColor AG = ((Color >> 8) & 0x00FF00FF) * Alpha;
100 AG = ((AG + ((AG >> 8) & 0x00FF00FF) + 0x00800080)) & 0xFF00FF00;
106 tColor Alpha = (ColorFg & 0xFF000000) >> 24;
109 Alpha = ((Alpha + ((Alpha >> 8) & 0x000000FF) + 0x00000080) >> 8) & 0x000000FF;
111 return Multiply(ColorFg, Alpha) + Multiply(ColorBg, 255 - Alpha);
133 int ColorsPerBlend = ColorsForBlending / BlendColors + 2;
193 for (
int i = 0; i < Palette.
numColors; i++) {
195 if (ColorFg || ColorBg) {
197 case 0:
Color = ColorBg;
break;
198 case 1:
Color = ColorFg;
break;
210 for (
int i = 0; i < Palette.
numColors; i++)
220 int Af = (ColorFg & 0xFF000000) >> 24;
221 int Rf = (ColorFg & 0x00FF0000) >> 16;
222 int Gf = (ColorFg & 0x0000FF00) >> 8;
223 int Bf = (ColorFg & 0x000000FF);
224 int Ab = (ColorBg & 0xFF000000) >> 24;
225 int Rb = (ColorBg & 0x00FF0000) >> 16;
226 int Gb = (ColorBg & 0x0000FF00) >> 8;
227 int Bb = (ColorBg & 0x000000FF);
228 int A = (Ab + (Af - Ab) * Level / 0xFF) & 0xFF;
229 int R = (Rb + (Rf - Rb) * Level / 0xFF) & 0xFF;
230 int G = (Gb + (Gf - Gb) * Level / 0xFF) & 0xFF;
231 int B = (Bb + (Bf - Bb) * Level / 0xFF) & 0xFF;
232 return (A << 24) | (R << 16) | (G << 8) | B;
239 int A1 = (
Color & 0xFF000000) >> 24;
240 int R1 = (
Color & 0x00FF0000) >> 16;
241 int G1 = (
Color & 0x0000FF00) >> 8;
242 int B1 = (
Color & 0x000000FF);
243 for (
int i = 0; i < numColors && d > 0; i++) {
244 int A2 = (
color[i] & 0xFF000000) >> 24;
245 int R2 = (
color[i] & 0x00FF0000) >> 16;
246 int G2 = (
color[i] & 0x0000FF00) >> 8;
247 int B2 = (
color[i] & 0x000000FF);
250 diff = (abs(A1 - A2) << 1) + (abs(R1 - R2) << 1) + (abs(G1 - G2) << 1) + (abs(B1 - B2) << 1);
256 return d <= MaxDiff ? n : -1;
311 esyslog(
"ERROR: can't allocate bitmap!");
321 return 0 <= x && x <
width && 0 <= y && y <
height;
330 return x1 <= 0 && y1 <= 0 && x2 >=
width - 1 && y2 >=
height - 1;
339 return !(x2 < 0 || x1 >=
width || y2 < 0 || y1 >=
height);
365 FILE *f = fopen(FileName,
"r");
373 while ((s = ReadLine.
Read(f)) != NULL) {
376 if (strcmp(s,
"/* XPM */") != 0) {
377 esyslog(
"ERROR: invalid header in XPM file '%s'", FileName);
382 else if (*s++ ==
'"') {
385 if (4 != sscanf(s,
"%d %d %d %d", &w, &h, &n, &c)) {
386 esyslog(
"ERROR: faulty 'values' line in XPM file '%s'", FileName);
391 Xpm =
MALLOC(
char *, lines);
392 memset(Xpm, 0, lines *
sizeof(
char*));
394 char *q = strchr(s,
'"');
396 esyslog(
"ERROR: missing quotes in XPM file '%s'", FileName);
402 Xpm[index++] = strdup(s);
404 esyslog(
"ERROR: too many lines in XPM file '%s'", FileName);
414 esyslog(
"ERROR: too few lines in XPM file '%s'", FileName);
417 for (
int i = 0; i < index; i++)
424 esyslog(
"ERROR: can't open XPM file '%s'", FileName);
432 const char *
const *p = Xpm;
434 if (4 != sscanf(*p,
"%d %d %d %d", &w, &h, &n, &c)) {
435 esyslog(
"ERROR: faulty 'values' line in XPM: '%s'", *p);
439 esyslog(
"ERROR: too many colors in XPM: %d", n);
443 while (1 << (1 << b) < (IgnoreNone ? n - 1 : n))
448 for (
int i = 0; i < n; i++) {
449 const char *s = *++p;
450 if (
int(strlen(s)) < c) {
451 esyslog(
"ERROR: faulty 'colors' line in XPM: '%s'", s);
456 esyslog(
"ERROR: unknown color key in XPM: '%c'", *s);
460 if (strcasecmp(s,
"none") == 0) {
467 esyslog(
"ERROR: unknown color code in XPM: '%c'", *s);
470 tColor color = strtoul(++s, NULL, 16) | 0xFF000000;
471 SetColor((IgnoreNone && i > NoneColorIndex) ? i - 1 : i,
color);
473 for (
int y = 0; y < h; y++) {
474 const char *s = *++p;
475 if (
int(strlen(s)) != w * c) {
476 esyslog(
"ERROR: faulty pixel line in XPM: %d '%s'", y, s);
479 for (
int x = 0; x < w; x++) {
480 for (
int i = 0; i <= n; i++) {
482 esyslog(
"ERROR: undefined pixel color in XPM: %d %d '%s'", x, y, s);
485 if (strncmp(Xpm[i + 1], s, c) == 0) {
486 if (i == NoneColorIndex)
488 SetIndex(x, y, (IgnoreNone && i > NoneColorIndex) ? i - 1 : i);
542 for (
int ix = 0; ix < Bitmap.
width; ix++) {
543 for (
int iy = 0; iy < Bitmap.
height; iy++) {
544 if (!Overlay || Bitmap.
bitmap[Bitmap.
width * iy + ix] != 0)
551 Take(Bitmap, &Indexes, ColorFg, ColorBg);
552 for (
int ix = 0; ix < Bitmap.
width; ix++) {
553 for (
int iy = 0; iy < Bitmap.
height; iy++) {
554 if (!Overlay || Bitmap.
bitmap[Bitmap.
width * iy + ix] != 0)
570 if (!
Intersects(x, y, x + cw - 1, y + ch - 1))
577 if ((Alignment &
taLeft) != 0) {
581 else if ((Alignment &
taRight) != 0) {
589 x += (
Width - w) / 2;
593 if ((Alignment &
taTop) != 0)
595 else if ((Alignment &
taBottom) != 0) {
614 if (
Covers(x1, y1, x2, y2))
625 for (
int y = y1; y <= y2; y++) {
626 for (
int x = x1; x <= x2; x++)
639 int cx = (x1 + x2) / 2;
640 int cy = (y1 + y2) / 2;
641 switch (abs(Quadrants)) {
642 case 0: rx /= 2; ry /= 2;
break;
643 case 1: cx = x1; cy = y2;
break;
644 case 2: cx = x2; cy = y2;
break;
645 case 3: cx = x2; cy = y1;
break;
646 case 4: cx = x1; cy = y1;
break;
647 case 5: cx = x1; ry /= 2;
break;
648 case 6: cy = y2; rx /= 2;
break;
649 case 7: cx = x2; ry /= 2;
break;
650 case 8: cy = y1; rx /= 2;
break;
653 int TwoASquare =
max(1, 2 * rx * rx);
654 int TwoBSquare =
max(1, 2 * ry * ry);
657 int XChange = ry * ry * (1 - 2 * rx);
658 int YChange = rx * rx;
659 int EllipseError = 0;
660 int StoppingX = TwoBSquare * rx;
662 while (StoppingX >= StoppingY) {
671 case 6:
DrawRectangle(cx - x, cy - y, cx + x, cy - y,
Color);
if (Quadrants == 6)
break;
680 StoppingY += TwoASquare;
681 EllipseError += YChange;
682 YChange += TwoASquare;
683 if (2 * EllipseError + XChange > 0) {
685 StoppingX -= TwoBSquare;
686 EllipseError += XChange;
687 XChange += TwoBSquare;
693 YChange = rx * rx * (1 - 2 * ry);
696 StoppingY = TwoASquare * ry;
697 while (StoppingX <= StoppingY) {
706 case 6:
DrawRectangle(cx - x, cy - y, cx + x, cy - y,
Color);
if (Quadrants == 6)
break;
715 StoppingX += TwoBSquare;
716 EllipseError += XChange;
717 XChange += TwoBSquare;
718 if (2 * EllipseError + YChange > 0) {
720 StoppingY -= TwoASquare;
721 EllipseError += YChange;
722 YChange += TwoASquare;
731 bool upper = Type & 0x01;
732 bool falling = Type & 0x02;
733 bool vertical = Type & 0x04;
735 for (
int y = y1; y <= y2; y++) {
736 double c = cos((y - y1) * M_PI / (y2 - y1 + 1));
739 int x = int((x2 - x1 + 1) * c / 2);
740 if (upper && !falling || !upper && falling)
747 for (
int x = x1; x <= x2; x++) {
748 double c = cos((x - x1) * M_PI / (x2 - x1 + 1));
751 int y = int((y2 - y1 + 1) * c / 2);
767 int NewBpp = Palette.
Bpp();
768 if (
Bpp() == 4 && NewBpp == 2) {
771 bitmap[i] = (p >> 2) | ((p & 0x03) != 0);
774 else if (
Bpp() == 8) {
778 bitmap[i] = (p >> 6) | ((p & 0x30) != 0);
781 else if (NewBpp == 4) {
806 int MaxNewColors = (NewBpp == 4) ? 16 : 4;
808 for (
int i = 0; i < MaxNewColors; i++) {
811 for (
int n = 0; n < NumOldColors; n++) {
826 for (
int n = 0; n < NumOldColors; n++) {
842 int w =
max(1,
int(round(
Width() * FactorX)));
843 int h =
max(1,
int(round(
Height() * FactorY)));
847 if (!AntiAlias || FactorX <= 1.0 && FactorY <= 1.0) {
852 for (
int y = 0; y < b->
Height(); y++) {
856 for (
int x = 0; x < b->
Width(); x++) {
857 *Dest++ = SourceRow[SourceX >> 16];
861 DestRow += b->
Width();
869 for (
int y = 0; y < b->
Height(); y++) {
871 int sy =
min(SourceY >> 16,
Height() - 2);
872 uint8_t BlendY = 0xFF - ((SourceY >> 8) & 0xFF);
873 for (
int x = 0; x < b->
Width(); x++) {
874 int sx =
min(SourceX >> 16,
Width() - 2);
875 uint8_t BlendX = 0xFF - ((SourceX >> 8) & 0xFF);
1037 else if (
Layer >= 0) {
1144 int w =
max(1,
int(round(
Width() * FactorX)));
1145 int h =
max(1,
int(round(
Height() * FactorY)));
1150 if (!AntiAlias || FactorX <= 1.0 && FactorY <= 1.0) {
1153 for (
int y = 0; y < i->
Height(); y++) {
1155 for (
int x = 0; x < i->
Width(); x++) {
1166 for (
int y = 0; y < i->
Height(); y++) {
1168 int sy =
min(SourceY >> 16,
Height() - 2);
1169 uint8_t BlendY = 0xFF - ((SourceY >> 8) & 0xFF);
1170 for (
int x = 0; x < i->
Width(); x++) {
1171 int sx =
min(SourceX >> 16,
Width() - 2);
1172 uint8_t BlendX = 0xFF - ((SourceX >> 8) & 0xFF);
1194 :
cPixmap(Layer, ViewPort, DrawPort)
1242 Source.
Shift(Delta);
1245 if (Pixmap->
Layer() == 0)
1246 Copy(Pixmap, Source, Dest);
1248 Render(Pixmap, Source, Dest);
1265 if (Pixmap->
Layer() == 0)
1266 Copy(Pixmap, Source, Dest);
1268 Render(Pixmap, Source, Dest);
1283 ps -= Point.
Y() * ws;
1287 for (
int y = r.
Height(); y-- > 0; ) {
1308 const cImage *i = &Image;
1310 i = i->
Scaled(FactorX, FactorY, AntiAlias);
1328 if (
DrawPort().Size().Contains(Point)) {
1342 if (
DrawPort().Size().Contains(Point)) {
1346 data[p] = (
data[p] & 0x00FFFFFF) | ((((
data[p] >> 24) * (255 -
Alpha)) << 16) & 0xFF000000);
1362 bool UseColors = ColorFg || ColorBg;
1365 for (
int y = r.
Top(); y <= r.
Bottom(); y++) {
1367 for (
int x = r.
Left(); x <= r.
Right(); x++) {
1368 tIndex Index = *Bitmap.
Data(x - Point.
X(), y - Point.
Y());
1369 if (Index || !Overlay) {
1371 *cd = Index ? ColorFg : ColorBg;
1373 *cd = Bitmap.
Color(Index);
1392 int cw = Width ? Width : w;
1393 int ch = Height ? Height : h;
1394 cRect r(x, y, cw, ch);
1397 if (Width || Height) {
1400 if ((Alignment &
taLeft) != 0) {
1404 else if ((Alignment &
taRight) != 0) {
1412 x += (Width - w) / 2;
1416 if ((Alignment &
taTop) != 0)
1418 else if ((Alignment &
taBottom) != 0) {
1424 y += (Height - h) / 2;
1428 Font->
DrawText(
this, x, y, s, ColorFg, ColorBg, limit);
1442 for (
int y = r.
Height(); y-- > 0; ) {
1448 for (
int x = r.
Width(); x-- > 0; ) {
1464 int x1 = Rect.
Left();
1465 int y1 = Rect.
Top();
1466 int x2 = Rect.
Right();
1472 int cx = (x1 + x2) / 2;
1473 int cy = (y1 + y2) / 2;
1474 switch (abs(Quadrants)) {
1475 case 0: rx /= 2; ry /= 2;
break;
1476 case 1: cx = x1; cy = y2;
break;
1477 case 2: cx = x2; cy = y2;
break;
1478 case 3: cx = x2; cy = y1;
break;
1479 case 4: cx = x1; cy = y1;
break;
1480 case 5: cx = x1; ry /= 2;
break;
1481 case 6: cy = y2; rx /= 2;
break;
1482 case 7: cx = x2; ry /= 2;
break;
1483 case 8: cy = y1; rx /= 2;
break;
1486 int TwoASquare =
max(1, 2 * rx * rx);
1487 int TwoBSquare =
max(1, 2 * ry * ry);
1490 int XChange = ry * ry * (1 - 2 * rx);
1491 int YChange = rx * rx;
1492 int EllipseError = 0;
1493 int StoppingX = TwoBSquare * rx;
1497 while (StoppingX >= StoppingY) {
1499 switch (Quadrants) {
1507 case 6:
DrawRectangle(
cRect(cx - x, cy - y, 2 * x + ax + 1, 1), Color);
if (Quadrants == 6)
break;
1517 uint8_t intensity = abs(255 * (
long int)EllipseError / XChange);
1518 if (EllipseError >= 0) {
1519 intensity = 255 - intensity;
1524 switch (Quadrants) {
1531 case 7:
DrawRectangle(
cRect( cx - x + 1 - Delta, cy + ay + y, x + Delta, 1), Color);
1544 case 6:
DrawRectangle(
cRect( cx - x - Delta + 1, cy - y, 2 * (x + Delta) + ax - 1, 1), Color);
1549 case 8:
DrawRectangle(
cRect( cx - x - Delta + 1, cy + y, 2 * (x + Delta) + ax - 1 , 1), Color);
1553 case -1:
DrawRectangle(
cRect( cx + x + 1 + Delta, cy - y, rx - (x + Delta), 1), Color);
1562 case -4:
DrawRectangle(
cRect( cx + x + 1 + Delta, cy + y, rx - x - Delta, 1), Color);
1569 StoppingY += TwoASquare;
1570 EllipseError += YChange;
1571 YChange += TwoASquare;
1572 if (2 * EllipseError + XChange > 0) {
1574 StoppingX -= TwoBSquare;
1575 EllipseError += XChange;
1576 XChange += TwoBSquare;
1583 YChange = rx * rx * (1 - 2 * ry);
1586 StoppingY = TwoASquare * ry;
1587 while (StoppingX <= StoppingY) {
1589 switch (Quadrants) {
1597 case 6:
DrawRectangle(
cRect(cx - x, cy - y, 2 * x + ax + 1, 1), Color);
if (Quadrants == 6)
break;
1607 uint8_t intensity = abs(255 * (
long int)EllipseError / YChange);
1608 if (EllipseError >= 0) {
1609 intensity = 255 - intensity;
1614 switch (Quadrants) {
1615 case 5:
DrawRectangle(
cRect( cx + x, cy + ay + 1 + ymax, 1, y - ymax - Delta), Color);
1621 case 7:
DrawRectangle(
cRect( cx - x, cy + ay + 1 + ymax, 1, y - ymax - Delta), Color);
1634 case 6:
DrawRectangle(
cRect( cx + x + ax, cy - y + Delta, 1, y - ymax - Delta), Color);
1651 case -3:
DrawRectangle(
cRect( cx - x, cy + y + 2 - Delta, 1, ry - y - 1 + Delta), Color);
1654 case -4:
DrawRectangle(
cRect( cx + x, cy + y + 2 - Delta, 1, ry - y - 1 + Delta), Color);
1661 StoppingX += TwoBSquare;
1662 EllipseError += XChange;
1663 XChange += TwoBSquare;
1664 if (2 * EllipseError + YChange > 0) {
1666 StoppingY -= TwoASquare;
1667 EllipseError += YChange;
1668 YChange += TwoASquare;
1671 if (AntiAliased && Quadrants < 0 ) {
1672 switch (Quadrants) {
1688 bool upper = Type & 0x01;
1689 bool falling = Type & 0x02;
1690 bool vertical = Type & 0x04;
1691 int x1 = Rect.
Left();
1692 int y1 = Rect.
Top();
1693 int x2 = Rect.
Right();
1695 int w = Rect.
Width();
1698 uint8_t intensity = 0;
1705 for (
int y = 1; y <= (y2 - y1) / 2; y++) {
1706 double c = cos(y * M_PI / (y2 - y1));
1708 double wc = (w * c + (w & 1)) / 2;
1709 intensity = 255 * fabs(wc - floor(wc));
1713 int x = (x1 + x2 + w * c + 1) / 2;
1714 if (upper && !falling || !upper && falling) {
1741 if ((upper && !falling) || (!upper && falling))
1745 for (
int x = 1; x <= (x2 - x1) / 2; x++) {
1746 double c = cos(x * M_PI / (x2 - x1));
1748 double hc = (h * c + (h & 1)) / 2;
1749 intensity = 255 * fabs(hc - floor(hc));
1753 int y = (y1 + y2 + h * c + 1) / 2;
1795 int a = pm->Alpha();
1796 int ws = pm->DrawPort().
Width();
1800 for (
int y = d.
Height(); y-- > 0; ) {
1803 for (
int x = d.
Width(); x-- > 0; ) {
1829 int ws = pm->DrawPort().
Width();
1834 for (
int y = d.
Height(); y-- > 0; ) {
1865 for (
int y = d.
Height(); y-- > 0; ) {
1895 "bpp not supported",
1923 for (
int i = 0; i <
Osds.
Size(); i++) {
1941 for (
int i = 0; i <
Osds.
Size(); i++) {
1942 if (
Osds[i] ==
this) {
1945 Osds[0]->SetActive(
true);
1995 if (Pixmap->
Layer() >= 0)
2002 esyslog(
"ERROR: attempt to destroy an unregistered pixmap");
2028 if (!pm->DirtyViewPort().IsEmpty()) {
2030 d.
Combine(pm->DirtyViewPort());
2039 static cRect OldDirty;
2042 OldDirty = NewDirty;
2051 if (pm->Layer() == Layer)
2058 static tColor DirtyIndicatorColors[] = { 0x7FFFFF00, 0x7F00FFFF };
2059 static int DirtyIndicatorIndex = 0;
2060 DirtyIndicator.
Fill(DirtyIndicatorColors[DirtyIndicatorIndex]);
2061 DirtyIndicatorIndex = 1 - DirtyIndicatorIndex;
2075 for (
int i = 0; i < NumAreas; i++) {
2076 if (Areas[i].x1 > Areas[i].x2 || Areas[i].y1 > Areas[i].y2 || Areas[i].x1 < 0 || Areas[i].y1 < 0)
2078 for (
int j = i + 1; j < NumAreas; j++) {
2079 if (Areas[i].Intersects(Areas[j])) {
2084 if (Areas[i].bpp == 32) {
2095 if (Result ==
oeOk) {
2115 for (
int i = 0; i < NumAreas; i++) {
2131 cRect r(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
2175 pixmaps[0]->DrawImage(Point, Image);
2181 pixmaps[0]->DrawImage(Point, ImageHandle);
2187 pixmaps[0]->DrawScaledImage(Point, Image, FactorX, FactorY, AntiAlias);
2193 pixmaps[0]->DrawScaledImage(Point, ImageHandle, FactorX, FactorY, AntiAlias);
2209 pixmaps[0]->DrawBitmap(
cPoint(x, y), Bitmap, ColorFg, ColorBg, Overlay);
2212 bitmaps[i]->
DrawBitmap(x, y, Bitmap, ColorFg, ColorBg, ReplacePalette, Overlay);
2220 b = b->
Scaled(FactorX, FactorY, AntiAlias);
2239 pixmaps[0]->DrawRectangle(
cRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1), Color);
2249 pixmaps[0]->DrawEllipse(
cRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1), Color, Quadrants);
2259 pixmaps[0]->DrawSlope(
cRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1), Color, Type);
2294 esyslog(
"ERROR: attempt to open OSD while it is already open - using dummy OSD!");
2306 isyslog(
"no OSD provider available - using dummy OSD!");
2307 return new cOsd(Left, Top, 999);
2332 dsyslog(
"OSD size changed to %dx%d @ %g", Width, Height, Aspect);
2351 esyslog(
"ERROR: no OSD provider available in call to SupportsTrueColor()");
2371 delete images[ImageHandle];
2372 images[ImageHandle] = NULL;
2380 return images[ImageHandle];
2446 for (
int i = 0; i <
shown; i++)
void ShrinkBpp(int NewBpp)
Shrinks the color depth of the bitmap to NewBpp by keeping only the 2^NewBpp most frequently used col...
void ReduceBpp(const cPalette &Palette)
Reduces the color depth of the bitmap to that of the given Palette.
bool Dirty(int &x1, int &y1, int &x2, int &y2)
Tells whether there is a dirty area and returns the bounding rectangle of that area (relative to the ...
cBitmap * Scaled(double FactorX, double FactorY, bool AntiAlias=false) const
Creates a copy of this bitmap, scaled by the given factors.
void DrawSlope(int x1, int y1, int x2, int y2, tColor Color, int Type)
Draws a "slope" into the rectangle defined by the upper left (x1, y1) and lower right (x2,...
tColor GetColor(int x, int y) const
Returns the color at the given coordinates.
bool Contains(int x, int y) const
Returns true if this bitmap contains the point (x, y).
void SetIndex(int x, int y, tIndex Index)
Sets the index at the given coordinates to Index.
void DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
Draws a filled rectangle defined by the upper left (x1, y1) and lower right (x2, y2) corners with the...
void DrawPixel(int x, int y, tColor Color)
Sets the pixel at the given coordinates to the given Color, which is a full 32 bit ARGB value.
bool Covers(int x1, int y1, int x2, int y2) const
Returns true if the rectangle defined by the given coordinates completely covers this bitmap.
void Clean(void)
Marks the dirty area as clean.
void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg=0, tColor ColorBg=0, bool ReplacePalette=false, bool Overlay=false)
Sets the pixels in this bitmap with the data from the given Bitmap, putting the upper left corner of ...
void SetSize(int Width, int Height)
Sets the size of this bitmap to the given values.
void Fill(tIndex Index)
Fills the bitmap data with the given Index.
void DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width=0, int Height=0, int Alignment=taDefault)
Draws the given string at coordinates (x, y) with the given foreground and background color and font.
bool SetXpm(const char *const Xpm[], bool IgnoreNone=false)
Sets this bitmap to the given XPM data.
void DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quadrants=0)
Draws a filled ellipse defined by the upper left (x1, y1) and lower right (x2, y2) corners with the g...
bool LoadXpm(const char *FileName)
Calls SetXpm() with the data from the file FileName.
cBitmap(int Width, int Height, int Bpp, int X0=0, int Y0=0)
Creates a bitmap with the given Width, Height and color depth (Bpp).
bool Intersects(int x1, int y1, int x2, int y2) const
Returns true if the rectangle defined by the given coordinates intersects with this bitmap.
virtual ~cBitmap() override
const tIndex * Data(int x, int y) const
Returns the address of the index byte at the given coordinates.
virtual int Width(void) const override
Returns the original character width as requested when the font was created, or 0 if the default widt...
virtual int Height(void) const override
Returns the height of this font in pixel (all characters have the same height).
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const override
Draws the given text into the Bitmap at position (x, y) with the given colors.
static cDevice * PrimaryDevice(void)
Returns the primary device.
virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect)
Returns the Width, Height and PixelAspect ratio the OSD should use to best fit the resolution of the ...
virtual int Height(void) const =0
Returns the height of this font in pixel (all characters have the same height).
static void SetFont(eDvbFont Font, const char *Name, int CharHeight)
< Draws the given text into the Pixmap at position (x, y) with the given colors.
const cSize & Size(void) const
void SetPixel(const cPoint &Point, tColor Color)
Sets the pixel at the given Point to Color.
const tColor * Data(void) const
cImage * Scaled(double FactorX, double FactorY, bool AntiAlias=false) const
Creates a copy of this image, scaled by the given factors.
tColor GetPixel(const cPoint &Point) const
Returns the pixel value at the given Point.
void Clear(void)
Clears the image data by setting all pixels to be fully transparent.
void Fill(tColor Color)
Fills the image data with the given Color.
virtual bool ProvidesTrueColor(void)
Returns true if this OSD provider is able to handle a true color OSD.
static cImage * images[MAXOSDIMAGES]
static bool OsdSizeChanged(int &State)
Checks if the OSD size has changed and a currently displayed OSD needs to be redrawn.
static void DropImage(int ImageHandle)
Drops the image referenced by the given ImageHandle.
virtual int StoreImageData(const cImage &Image)
Copies the given Image and returns a handle for later reference.
virtual void DropImageData(int ImageHandle)
Drops the image data referenced by ImageHandle.
static cOsdProvider * osdProvider
static int StoreImage(const cImage &Image)
Stores the given Image for later use with DrawImage() on an OSD or pixmap.
static void Shutdown(void)
Shuts down the OSD provider facility by deleting the current OSD provider.
static void UpdateOsdSize(bool Force=false)
Inquires the actual size of the video display and adjusts the OSD and font sizes accordingly.
virtual cOsd * CreateOsd(int Left, int Top, uint Level)=0
Returns a pointer to a newly created cOsd object, which will be located at the given coordinates.
static const cImage * GetImageData(int ImageHandle)
Gets the image data referenced by ImageHandle.
static bool SupportsTrueColor(void)
Returns true if the current OSD provider is able to handle a true color OSD.
static cOsd * NewOsd(int Left, int Top, uint Level=OSD_LEVEL_DEFAULT)
Returns a pointer to a newly created cOsd object, which will be located at the given coordinates.
The cOsd class is the interface to the "On Screen Display".
cOsd(int Left, int Top, uint Level)
Initializes the OSD with the given coordinates.
virtual eOsdError SetPalette(const cPalette &Palette, int Area)
Sets the Palette for the given Area (the first area is numbered 0).
virtual const cSize & MaxPixmapSize(void) const
Returns the maximum possible size of a pixmap this OSD can create.
virtual void DrawImage(const cPoint &Point, const cImage &Image)
Draws the given Image on this OSD at the given Point.
virtual void SetActive(bool On)
Sets this OSD to be the active one.
cVector< cPixmap * > pixmaps
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas)
Sets the sub-areas to the given areas.
virtual void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg=0, tColor ColorBg=0, bool ReplacePalette=false, bool Overlay=false)
Sets the pixels in the OSD with the data from the given Bitmap, putting the upper left corner of the ...
virtual void DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quadrants=0)
Draws a filled ellipse defined by the upper left (x1, y1) and lower right (x2, y2) corners with the g...
cBitmap * GetBitmap(int Area)
Returns a pointer to the bitmap for the given Area, or NULL if no such bitmap exists.
virtual void DestroyPixmap(cPixmap *Pixmap)
Destroys the given Pixmap, which has previously been created by a call to CreatePixmap().
void SetAntiAliasGranularity(uint FixedColors, uint BlendColors)
Allows the system to optimize utilization of the limited color palette entries when generating blende...
virtual void DrawPixel(int x, int y, tColor Color)
Sets the pixel at the given coordinates to the given Color, which is a full 32 bit ARGB value.
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas)
Checks whether the OSD can display the given set of sub-areas.
cPixmap * AddPixmap(cPixmap *Pixmap)
Adds the given Pixmap to the list of currently active pixmaps in this OSD.
cPixmap * RenderPixmaps(void)
Renders the dirty part of all pixmaps into a resulting pixmap that shall be displayed on the OSD.
virtual cPixmap * CreatePixmap(int Layer, const cRect &ViewPort, const cRect &DrawPort=cRect::Null)
Creates a new true color pixmap on this OSD (see cPixmap for details).
static void SetOsdPosition(int Left, int Top, int Width, int Height)
Sets the position and size of the OSD to the given values.
virtual void SaveRegion(int x1, int y1, int x2, int y2)
Saves the region defined by the given coordinates for later restoration through RestoreRegion().
virtual void DrawScaledBitmap(int x, int y, const cBitmap &Bitmap, double FactorX, double FactorY, bool AntiAlias=false)
Sets the pixels in the OSD with the data from the given Bitmap, putting the upper left corner of the ...
virtual void Flush(void)
Actually commits all data to the OSD hardware.
virtual void DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
Draws a filled rectangle defined by the upper left (x1, y1) and lower right (x2, y2) corners with the...
cBitmap * bitmaps[MAXOSDAREAS]
virtual void DrawSlope(int x1, int y1, int x2, int y2, tColor Color, int Type)
Draws a "slope" into the rectangle defined by the upper left (x1, y1) and lower right (x2,...
cPixmapMemory * savedPixmap
virtual void RestoreRegion(void)
Restores the region previously saved by a call to SaveRegion().
static cVector< cOsd * > Osds
static cSize maxPixmapSize
virtual ~cOsd()
Shuts down the OSD.
virtual void DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias=false)
Draws the given Image on this OSD at the given Point and scales it.
static int IsOpen(void)
Returns true if there is currently a level 0 OSD open.
virtual void DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width=0, int Height=0, int Alignment=taDefault)
Draws the given string at coordinates (x, y) with the given foreground and background color and font.
tColor Color(int Index) const
Returns the color at the given Index.
tColor Blend(tColor ColorFg, tColor ColorBg, uint8_t Level) const
Determines a color that consists of a linear blend between ColorFg and ColorBg.
void Reset(void)
Resets the palette, making it contain no colors.
void Replace(const cPalette &Palette)
Replaces the colors of this palette with the colors from the given palette.
const tColor * Colors(int &NumColors) const
Returns a pointer to the complete color table and stores the number of valid entries in NumColors.
tIndex tIndexes[MAXNUMCOLORS]
void SetBpp(int Bpp)
Sets the color depth of this palette to the given value.
void SetColor(int Index, tColor Color)
Sets the palette entry at Index to Color.
tColor color[MAXNUMCOLORS]
void SetAntiAliasGranularity(uint FixedColors, uint BlendColors)
Allows the system to optimize utilization of the limited color palette entries when generating blende...
int Index(tColor Color)
Returns the index of the given Color (the first color has index 0).
int ClosestColor(tColor Color, int MaxDiff=INT_MAX) const
Returns the index of a color in this palette that is closest to the given Color.
cPalette(int Bpp=8)
Initializes the palette with the given color depth.
double antiAliasGranularity
void Take(const cPalette &Palette, tIndexes *Indexes=NULL, tColor ColorFg=0, tColor ColorBg=0)
Takes the colors from the given Palette and adds them to this palette, using existing entries if poss...
virtual void DrawRectangle(const cRect &Rect, tColor Color) override
Draws a filled rectangle with the given Color.
virtual void Clear(void) override
Clears the pixmap's draw port by setting all pixels to be fully transparent.
virtual void Copy(const cPixmap *Pixmap, const cRect &Source, const cPoint &Dest) override
Copies the part of the given Pixmap covered by Source into this pixmap at location Dest.
virtual void Render(const cPixmap *Pixmap, const cRect &Source, const cPoint &Dest) override
Renders the part of the given Pixmap covered by Source into this pixmap at location Dest.
virtual void DrawEllipse(const cRect &Rect, tColor Color, int Quadrants=0) override
Draws a filled ellipse with the given Color that fits into the given rectangle.
virtual void Scroll(const cPoint &Dest, const cRect &Source=cRect::Null) override
Scrolls the data in the pixmap's draw port to the given Dest point.
virtual void DrawBitmap(const cPoint &Point, const cBitmap &Bitmap, tColor ColorFg=0, tColor ColorBg=0, bool Overlay=false) override
Sets the pixels in the OSD with the data from the given Bitmap, putting the upper left corner of the ...
virtual void DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width=0, int Height=0, int Alignment=taDefault) override
Draws the given string at Point with the given foreground and background color and font.
virtual void Fill(tColor Color) override
Fills the pixmap's draw port with the given Color.
virtual void DrawSlope(const cRect &Rect, tColor Color, int Type) override
Draws a "slope" with the given Color into the given rectangle.
virtual void DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias=false) override
virtual void DrawBlendedPixel(const cPoint &Point, tColor Color, uint8_t AlphaLayer=ALPHA_OPAQUE) override
Like DrawPixel(), but with an additional AlphaLayer, and works on any pixmap, not only the background...
virtual void DrawImage(const cPoint &Point, const cImage &Image) override
Draws the given Image into this pixmap at the given Point.
virtual void Pan(const cPoint &Dest, const cRect &Source=cRect::Null) override
Does the same as Scroll(), but also shifts the draw port accordingly, so that the view port doesn't g...
virtual void DrawPixel(const cPoint &Point, tColor Color) override
Draws the image referenced by the given ImageHandle into this pixmap at the given Point and scales it...
virtual ~cPixmapMemory() override
virtual void DrawPixmap(const cPixmap *Pixmap, const cRect &Dirty)
Draws the Dirty part of the given Pixmap into this pixmap.
const cRect & DrawPort(void) const
Returns the pixmap's draw port, which is relative to the view port.
virtual void SetViewPort(const cRect &Rect)
Sets the pixmap's view port to the given Rect.
virtual void Clear(void)=0
Clears the pixmap's draw port by setting all pixels to be fully transparent.
void MarkViewPortDirty(const cRect &Rect)
Marks the given rectangle of the view port of this pixmap as dirty.
virtual void SetDrawPortPoint(const cPoint &Point, bool Dirty=true)
Sets the pixmap's draw port to the given Point.
static void Lock(void)
All public member functions of cPixmap set locks as necessary to make sure they are thread-safe (unle...
virtual void SetLayer(int Layer)
Sets the layer of this pixmap to the given value.
const cRect & ViewPort(void) const
Returns the pixmap's view port, which is relative to the OSD's origin.
void MarkDrawPortDirty(const cRect &Rect)
Marks the given rectangle of the draw port of this pixmap as dirty.
void SetClean(void)
Resets the "dirty" rectangles of this pixmap.
virtual void Copy(const cPixmap *Pixmap, const cRect &Source, const cPoint &Dest)=0
Copies the part of the given Pixmap covered by Source into this pixmap at location Dest.
virtual void Render(const cPixmap *Pixmap, const cRect &Source, const cPoint &Dest)=0
Renders the part of the given Pixmap covered by Source into this pixmap at location Dest.
virtual void SetAlpha(int Alpha)
Sets the alpha value of this pixmap to the given value.
virtual void SetTile(bool Tile)
Sets the tile property of this pixmap to the given value.
cPoint Shifted(int Dx, int Dy) const
void Shift(int Dx, int Dy)
void Combine(const cRect &Rect)
Combines this rectangle with the given Rect.
bool Intersects(const cRect &Rect) const
Returns true if this rectangle intersects with Rect.
bool Contains(const cPoint &Point) const
Returns true if this rectangle contains Point.
void SetPoint(int X, int Y)
cRect Intersected(const cRect &Rect) const
Returns the intersection of this rectangle and the given Rect.
const cSize & Size(void) const
void Grow(int Dx, int Dy)
Grows the rectangle by the given number of pixels in either direction.
cRect Shifted(int Dx, int Dy) const
void SetBottom(int Bottom)
void Shift(int Dx, int Dy)
const cPoint & Point(void) const
bool IsEmpty(void) const
Returns true if this rectangle is empty.
void Set(int X, int Y, int Width, int Height)
char FontOsd[MAXFONTNAME]
char FontSml[MAXFONTNAME]
char FontFix[MAXFONTNAME]
void Grow(int Dw, int Dh)
void Scroll(bool Up, bool Page)
void Set(cOsd *Osd, int Left, int Top, int Width, int Height, const char *Text, const cFont *Font, tColor ColorFg, tColor ColorBg)
const char * GetLine(int Line)
Returns the given Line. The first line is numbered 0.
void Set(const char *Text, const cFont *Font, int Width)
Wraps the Text to make it fit into the area defined by the given Width when displayed with the given ...
virtual void Insert(T Data, int Before=0)
virtual void Append(T Data)
virtual void Remove(int Index)
static uint16_t AlphaLutFactors[255][256][2]
tColor AlphaBlend(tColor ColorFg, tColor ColorBg, uint8_t AlphaLayer)
tColor RgbShade(tColor Color, double Factor)
Returns a brighter (Factor > 0) or darker (Factor < 0) version of the given Color.
class cInitAlphaLut InitAlphaLut
static uint8_t AlphaLutAlpha[255][256]
static const char * OsdErrorTexts[]
tColor HsvToColor(double H, double S, double V)
Converts the given Hue (0..360), Saturation (0..1) and Value (0..1) to an RGB tColor value.
#define ALPHA_TRANSPARENT
tColor RgbToColor(uint8_t R, uint8_t G, uint8_t B)
#define OSD_LEVEL_DEFAULT
#define TEXT_ALIGN_BORDER
static const cCursesFont Font