1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed alignment of semi-circles in case of odd sizes

This commit is contained in:
Klaus Schmidinger 2020-10-13 13:47:10 +02:00
parent fc7ca12edd
commit 1a6a518f49
2 changed files with 42 additions and 40 deletions

View File

@ -9525,3 +9525,4 @@ Video Disk Recorder Revision History
to Christoph Haubrich). to Christoph Haubrich).
The version numbers (both VDRVERSNUM and APIVERSNUM) have been bumped to 2.4.5 to The version numbers (both VDRVERSNUM and APIVERSNUM) have been bumped to 2.4.5 to
indicate this change. indicate this change.
- Fixed alignment of semi-circles in case of odd sizes.

55
osd.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: osd.c 4.8 2020/10/12 13:54:44 kls Exp $ * $Id: osd.c 4.9 2020/10/13 13:47:10 kls Exp $
*/ */
#include "osd.h" #include "osd.h"
@ -1396,7 +1396,6 @@ void cPixmapMemory::DrawRectangle(const cRect &Rect, tColor Color)
void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants) void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
{ {
//TODO fix alignment
Lock(); Lock();
// Algorithm based on https://dai.fmph.uniba.sk/upload/0/01/Ellipse.pdf // Algorithm based on https://dai.fmph.uniba.sk/upload/0/01/Ellipse.pdf
int x1 = Rect.Left(); int x1 = Rect.Left();
@ -1405,6 +1404,8 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
int y2 = Rect.Bottom(); int y2 = Rect.Bottom();
int rx = x2 - x1; int rx = x2 - x1;
int ry = y2 - y1; int ry = y2 - y1;
int ax = rx & 0x01; // alignment to make semi-circles match rectangles of same size
int ay = ry & 0x01;
int cx = (x1 + x2) / 2; int cx = (x1 + x2) / 2;
int cy = (y1 + y2) / 2; int cy = (y1 + y2) / 2;
switch (abs(Quadrants)) { switch (abs(Quadrants)) {
@ -1433,15 +1434,15 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
while (StoppingX >= StoppingY) { while (StoppingX >= StoppingY) {
if (!AntiAliased) { if (!AntiAliased) {
switch (Quadrants) { switch (Quadrants) {
case 5: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); // no break case 5: DrawRectangle(cRect(cx, cy + y + ay, x + 1, 1), Color); // no break
case 1: DrawRectangle(cRect(cx, cy - y, x + 1, 1), Color); break; case 1: DrawRectangle(cRect(cx, cy - y, x + 1, 1), Color); break;
case 7: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); // no break case 7: DrawRectangle(cRect(cx - x, cy + y + ay, x + 1, 1), Color); // no break
case 2: DrawRectangle(cRect(cx - x, cy - y, x + 1, 1), Color); break; case 2: DrawRectangle(cRect(cx - x, cy - y, x + 1, 1), Color); break;
case 3: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); break; case 3: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); break;
case 4: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); break; case 4: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); break;
case 0: case 0:
case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + 1, 1), Color); if (Quadrants == 6) break; case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + ax + 1, 1), Color); if (Quadrants == 6) break;
case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + 1, 1), Color); break; case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + ax + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break; case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break;
case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break; case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break;
case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break; case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break;
@ -1458,14 +1459,14 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
else else
Delta = 1; Delta = 1;
switch (Quadrants) { switch (Quadrants) {
case 5: DrawRectangle( cRect( cx, cy + y, x + Delta, 1), Color); case 5: DrawRectangle( cRect( cx, cy + y + ay, x + Delta, 1), Color);
DrawBlendedPixel(cPoint(cx + x + Delta, cy + y), Color, intensity); DrawBlendedPixel(cPoint(cx + x + Delta, cy + y + ay), Color, intensity);
// no break // no break
case 1: DrawRectangle( cRect( cx, cy - y, x + Delta, 1), Color); case 1: DrawRectangle( cRect( cx, cy - y, x + Delta, 1), Color);
DrawBlendedPixel(cPoint(cx + x + Delta, cy - y), Color, intensity); DrawBlendedPixel(cPoint(cx + x + Delta, cy - y), Color, intensity);
break; break;
case 7: DrawRectangle( cRect( cx - x + 1 - Delta, cy + y, x + Delta, 1), Color); case 7: DrawRectangle( cRect( cx - x + 1 - Delta, cy + ay + y, x + Delta, 1), Color);
DrawBlendedPixel(cPoint(cx - x - Delta, cy + y), Color, intensity); DrawBlendedPixel(cPoint(cx - x - Delta, cy + ay + y), Color, intensity);
// no break // no break
case 2: DrawRectangle( cRect( cx - x + 1 - Delta, cy - y, x + Delta, 1), Color); case 2: DrawRectangle( cRect( cx - x + 1 - Delta, cy - y, x + Delta, 1), Color);
DrawBlendedPixel(cPoint(cx - x - Delta, cy - y), Color, intensity); DrawBlendedPixel(cPoint(cx - x - Delta, cy - y), Color, intensity);
@ -1477,14 +1478,14 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
DrawBlendedPixel(cPoint(cx + x + Delta, cy + y), Color, intensity); DrawBlendedPixel(cPoint(cx + x + Delta, cy + y), Color, intensity);
break; break;
case 0: case 0:
case 6: DrawRectangle( cRect( cx - x + 1 - Delta, cy - y, 2 * (x + Delta) - 1, 1), Color); case 6: DrawRectangle( cRect( cx - x - Delta + 1, cy - y, 2 * (x + Delta) + ax - 1, 1), Color);
DrawBlendedPixel(cPoint(cx - x - Delta, cy - y), Color, intensity); DrawBlendedPixel(cPoint(cx - x - Delta, cy - y), Color, intensity);
DrawBlendedPixel(cPoint(cx + x + Delta, cy - y), Color, intensity); DrawBlendedPixel(cPoint(cx + x + Delta + ax, cy - y), Color, intensity);
if (Quadrants == 6) if (Quadrants == 6)
break; break;
case 8: DrawRectangle( cRect( cx - x + 1 - Delta, cy + y, 2 * (x + Delta) - 1 , 1), Color); case 8: DrawRectangle( cRect( cx - x - Delta + 1, cy + y, 2 * (x + Delta) + ax - 1 , 1), Color);
DrawBlendedPixel(cPoint(cx - x - Delta, cy + y), Color, intensity); DrawBlendedPixel(cPoint(cx - x - Delta, cy + y), Color, intensity);
DrawBlendedPixel(cPoint(cx + x + Delta, cy + y), Color, intensity); DrawBlendedPixel(cPoint(cx + x + Delta + ax, cy + y), Color, intensity);
break; break;
case -1: DrawRectangle( cRect( cx + x + 1 + Delta, cy - y, rx - (x + Delta), 1), Color); case -1: DrawRectangle( cRect( cx + x + 1 + Delta, cy - y, rx - (x + Delta), 1), Color);
DrawBlendedPixel(cPoint(cx + x + Delta, cy - y), Color, 255-intensity); DrawBlendedPixel(cPoint(cx + x + Delta, cy - y), Color, 255-intensity);
@ -1523,15 +1524,15 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
while (StoppingX <= StoppingY) { while (StoppingX <= StoppingY) {
if (!AntiAliased) { if (!AntiAliased) {
switch (Quadrants) { switch (Quadrants) {
case 5: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); // no break case 5: DrawRectangle(cRect(cx, cy + y + ay, x + 1, 1), Color); // no break
case 1: DrawRectangle(cRect(cx, cy - y, x + 1, 1), Color); break; case 1: DrawRectangle(cRect(cx, cy - y, x + 1, 1), Color); break;
case 7: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); // no break case 7: DrawRectangle(cRect(cx - x, cy + y + ay, x + 1, 1), Color); // no break
case 2: DrawRectangle(cRect(cx - x, cy - y, x + 1, 1), Color); break; case 2: DrawRectangle(cRect(cx - x, cy - y, x + 1, 1), Color); break;
case 3: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); break; case 3: DrawRectangle(cRect(cx - x, cy + y, x + 1, 1), Color); break;
case 4: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); break; case 4: DrawRectangle(cRect(cx, cy + y, x + 1, 1), Color); break;
case 0: case 0:
case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + 1, 1), Color); if (Quadrants == 6) break; case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + ax + 1, 1), Color); if (Quadrants == 6) break;
case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + 1, 1), Color); break; case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + ax + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break; case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break;
case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break; case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break;
case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break; case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break;
@ -1548,14 +1549,14 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
else else
Delta = 0; Delta = 0;
switch (Quadrants) { switch (Quadrants) {
case 5: DrawRectangle( cRect( cx + x, cy + 1 + ymax, 1, y - ymax - Delta), Color); case 5: DrawRectangle( cRect( cx + x, cy + ay + 1 + ymax, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx + x, cy + y + 1 - Delta), Color, intensity); DrawBlendedPixel(cPoint(cx + x, cy + ay + y + 1 - Delta), Color, intensity);
// no break // no break
case 1: DrawRectangle( cRect( cx + x, cy - y + Delta, 1, y - ymax - Delta), Color); case 1: DrawRectangle( cRect( cx + x, cy - y + Delta, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx + x, cy - y - 1 + Delta), Color, intensity); DrawBlendedPixel(cPoint(cx + x, cy - y - 1 + Delta), Color, intensity);
break; break;
case 7: DrawRectangle( cRect( cx - x, cy + 1 + ymax, 1, y - ymax - Delta), Color); case 7: DrawRectangle( cRect( cx - x, cy + ay + 1 + ymax, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx - x, cy + y + 1 - Delta), Color, intensity); DrawBlendedPixel(cPoint(cx - x, cy + ay + y + 1 - Delta), Color, intensity);
// no break // no break
case 2: DrawRectangle( cRect( cx - x, cy - y + Delta, 1, y - ymax - Delta), Color); case 2: DrawRectangle( cRect( cx - x, cy - y + Delta, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx - x, cy - y - 1 + Delta), Color, intensity); DrawBlendedPixel(cPoint(cx - x, cy - y - 1 + Delta), Color, intensity);
@ -1567,16 +1568,16 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
DrawBlendedPixel(cPoint(cx + x, cy + y + 1 - Delta), Color, intensity); DrawBlendedPixel(cPoint(cx + x, cy + y + 1 - Delta), Color, intensity);
break; break;
case 0: case 0:
case 6: DrawRectangle( cRect( cx + x, cy - y + Delta, 1, y - ymax - Delta), Color); case 6: DrawRectangle( cRect( cx + x + ax, cy - y + Delta, 1, y - ymax - Delta), Color);
DrawRectangle( cRect( cx - x, cy - y + Delta, 1, y - ymax - Delta), Color); DrawRectangle( cRect( cx - x, cy - y + Delta, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx - x, cy - y - 1 + Delta), Color, intensity); DrawBlendedPixel(cPoint(cx - x, cy - y + Delta - 1), Color, intensity);
DrawBlendedPixel(cPoint(cx + x, cy - y - 1 + Delta), Color, intensity); DrawBlendedPixel(cPoint(cx + x + ax, cy - y + Delta - 1), Color, intensity);
if (Quadrants == 6) if (Quadrants == 6)
break; break;
case 8: DrawRectangle( cRect( cx - x, cy + 1 + ymax, 1, y - ymax - Delta), Color); case 8: DrawRectangle( cRect( cx - x, cy + 1 + ymax, 1, y - ymax - Delta), Color);
DrawRectangle( cRect( cx + x, cy + 1 + ymax, 1, y - ymax - Delta), Color); DrawRectangle( cRect( cx + x + ax, cy + 1 + ymax, 1, y - ymax - Delta), Color);
DrawBlendedPixel(cPoint(cx - x, cy + y + 1 - Delta), Color, intensity); DrawBlendedPixel(cPoint(cx - x, cy + y + 1 - Delta), Color, intensity);
DrawBlendedPixel(cPoint(cx + x, cy + y + 1 - Delta), Color, intensity); DrawBlendedPixel(cPoint(cx + x + ax, cy + y + 1 - Delta), Color, intensity);
break; break;
case -1: DrawRectangle( cRect( cx + x, cy - ry, 1, ry - y - 1 + Delta), Color); case -1: DrawRectangle( cRect( cx + x, cy - ry, 1, ry - y - 1 + Delta), Color);
DrawBlendedPixel(cPoint(cx + x, cy - y - 1 + Delta), Color, 255-intensity); DrawBlendedPixel(cPoint(cx + x, cy - y - 1 + Delta), Color, 255-intensity);