runde ecken ??

Das Original Benutzerinterface Neutrino-SD incl. zapit, sectionsd, yWeb etc...
dbt
Administrator
Beiträge: 2675
Registriert: Donnerstag 28. September 2006, 19:18

Re: runde ecken ??

Beitrag von dbt »

@Z80
Problem ist bekannt, wurde mir schon mitgeteilt.
Also ich fand ja schon die runden Kugeln nicht wirklich hübsch und die runden Ecken reihen sich hier mit hinzu.
Solange das ganze einstellbar ist und man bei seinem gewohnten Layout bleiben kann, find ich das zeug aber ok ;-)
Immer diese Panik, man könnte denken, es wird jemanden was weggenommen. :D :D
Ich habe es weiter oben schon mal kurz angerissen, das sowas in Verbindung mit den Themes evtl. Sinn macht und optional sicher auch. Ist aber irgendwie menschlich, man gewöhnt sich halt an gewisse Dinge und tut sich immer schwer, wenn sich was ändert, womit man direkt in Kontakt kommt. Da der Sehsinn beim Menschen so 70% ausmacht, ist das völlig klar :wink:
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: runde ecken ??

Beitrag von mb405 »

also ich hab auch noch einen vorschlag :) für die rundungsoptionen

0 kantig :)
1 gesamt rund
2 oben rund
3 unten rund
4 oben links rund
5 oben rechts rund
6 unten links rund
7 unten rechts rund

somit sind wir für alles vorbereitet.
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

mb405 hat geschrieben:also ich hab auch noch einen vorschlag :) für die rundungsoptionen
...
somit sind wir für alles vorbereitet.
Wie wäre es mit:

0 = kantig
1 = links oben
2 = rechts oben
4 = rechts unten
8 = links unten

So kann man einfach addieren und muss sich nur merken, dass es bitweise von links oben im Uhrzeigersinn weitergeht... Das Schöne daran ist, man kann sich z.B. (BEISPIEL!!!) ein Rechteck mit Abrundungen links oben und rechts unten (=5) basteln und ist prinzipiell freier. Beispielsweise könnte man dann auch globale Konstanten definieren, dann liest sich der Code auch schöner. :wink:
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: runde ecken ??

Beitrag von flasher »

dbt hat geschrieben: Hätte das wie angedeutet auch schon selbst machen können, aber flasher hat sich der Sache ja bereits angenommen. Schriftart ist allerdings standard, wie gehabt.
Hi

Wenn Du die Zeit haben solltest, das selbst zu machen, dann würde ich Dich darum bitten.
Mir ist gestern die DEV Kiste abgeraucht. Abgeraucht im wahrsten Sinne des Wortes.
Neue Teile sind bestellt nur keine Ahnung wann die denn kommen.

Gruß
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

ingrid hat geschrieben: 0 = kantig
1 = links oben
2 = rechts oben
4 = rechts unten
8 = links unten
Schaut mal, ob der Code okay ist, ich habe das mal umgesetzt... single_rounded_corners.diff
Einfluß auf die Geschwindigkeit sollte die Änderung nicht haben, denke ich mal.

Ohne Gewähr, bisher nur grob getestet. ;-)

Werte werden addiert, also wenn z.b. abgerundet unten links & unten rechts = 8 + 4 = 12. :lol:
Der neue Parameter ist der letzte und freiwillig anzugeben. Ohne Parameterangabe werden alle 4 Rundungen (=15) gezeichnet. Parameter=0 zeichnet ein volles Rechteck, wie gehabt.
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

Ich habe das diff gerade noch geändert, da fehlte ein Part. Wobei ich mit dem nicht so glücklich bin, weil die Schleifendurchläufe verdoppelt werden. Wenn jemand 'ne elegantere Lösung hätte, bitte posten. ;-) (Allerdings muss ich bemerken, dass bei meiner Box der Part nicht angesprungen wird, da FB_USE_PALETTE gesetzt ist. In welchem Fall wäre das eigentlich nicht gesetzt?)

Link ist gleich geblieben. (Post über diesem)
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

Als Konstanten würde ich dann das hier vorschlagen:

Code: Alles auswählen

#define CORNER_NONE		0x0
#define CORNER_TOP_LEFT		0x1
#define CORNER_TOP_RIGHT	0x2
#define CORNER_TOP			0x3
#define CORNER_BOTTOM_RIGHT	0x4
#define CORNER_RIGHT		0x6
#define CORNER_BOTTOM_LEFT		0x8
#define CORNER_LEFT			0x9
#define CORNER_BOTTOM			0xC
#define CORNER_ALL			0xF
Zuletzt geändert von ingrid am Donnerstag 28. Februar 2008, 00:29, insgesamt 2-mal geändert.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: runde ecken ??

Beitrag von seife »

ingrid hat geschrieben:(Allerdings muss ich bemerken, dass bei meiner Box der Part nicht angesprungen wird, da FB_USE_PALETTE gesetzt ist. In welchem Fall wäre das eigentlich nicht gesetzt?)
Ich glaube mit --enable-16bit ist FB_USE_PALETTE nicht defined.
Leg mich nicht drauf fest, aber zumindest war da was, und ich habe mir das mal angeschaut, als ich die ominösen segfaults im framebuffer code untersucht habe (und 16bit hatte ich auch mal probiert ;) )
dbt
Administrator
Beiträge: 2675
Registriert: Donnerstag 28. September 2006, 19:18

Re: runde ecken ??

Beitrag von dbt »

Wenn Du die Zeit haben solltest, das selbst zu machen, dann würde ich Dich darum bitten.
Gerne, aber ich muss erst mal wegen meinem Netzwerkproblem schauen. Das bereitet mir etwas Probleme. Ansonsten werd ich da schon mal drauf schauen. ingrid hat ja schon einiges ansatzweise dran gemacht, also kann man das schon mal testen.
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: runde ecken ??

Beitrag von flasher »

@Ingrid

Du könntest den Corner-Parameter doch auch wie den Radius vordefinieren.
Du setzt R = 0 wenn Corners fehlt auch wenn R als Parameter übergeben wurde.

Wenn man jetzt den Paramter corners auf default alle Vier Ecken setzt, dann würde es ja reichen wenn man bei einem kompletten Rechteck mit abgerundeten Ecken nur den gewünschten Radius eingibt.
Man spart sich dadurch einen Parameter in der Übergabe.

frameBuffer->paintBoxRel(5, 5, 10, 10, COL_MENUCONTENT_PLUS_0); // Rechteck
frameBuffer->paintBoxRel(5, 5, 10, 10, COL_MENUCONTENT_PLUS_0, 10); // Rechteck komplett mit abgerundeten Ecken.
frameBuffer->paintBoxRel(5, 5, 10, 10, COL_MENUCONTENT_PLUS_0, 10, 0x3); // Rechteck mit oben abgerundeten Ecken.

Das wäre dann ja in der framebuffer.h den corners Parameter mit const int corners = 0xf vorzudefinieren.
So braucht man sich über den letzten Parameter nur Gedanken machen wenn man nicht möchte, dass z.B. alle Ecken runde sind.

Dadurch fällt auch CORNER_NONE weg, da ja bei fehlendem oder 0 Radius eh ein normales Rechteck gezeichnet wird.

*EDIT*
Sorry, das steht ja fasst alles so in Deinem Post. Ich hatte es leider nur überflogen...
Aber CORNER_NONE könnte man dennoch wegrationalisieren wenn man wieder auf R und nicht auf Corners prüft.


Gruß
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: runde ecken ??

Beitrag von flasher »

Ich nochmal.

Das minimal an Ingrids Diff angepasste Diff funktioniert so wie ich das mit dem Parameter meinte.

Code: Alles auswählen

diff -Naur old/framebuffer.cpp new/framebuffer.cpp
--- old/framebuffer.cpp	2008-02-28 16:58:10.000000000 +0100
+++ new/framebuffer.cpp	2008-02-28 16:29:31.000000000 +0100
@@ -619,9 +619,13 @@
 	*pos = col;
 }
 
-void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, const int radius)
+void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, const int radius, const int corners)
 {
 	int F,R=radius,sx,sy,dxx=dx,dyy=dy,rx,ry,wx,wy;
+	int corner1 =  corners     & 1;	// upper left
+	int corner2 = (corners>>1) & 1;	// upper right
+	int corner3 = (corners>>2) & 1;	// lower right
+	int corner4 = (corners>>3) & 1;	// lower left
 
 	if (!getActive())
 		return;
@@ -683,25 +687,27 @@
 			wx=rx<<1;
 			wy=ry<<1;
 #ifdef FB_USE_PALETTE
-			memset(pos0+rx, col, dxx-wx);
-			memset(pos1+rx, col, dxx-wx);
-			memset(pos2+ry, col, dxx-wy);
-			memset(pos3+ry, col, dxx-wy);
+			memset(pos0+(rx*corner4), col, dxx-(wx*corner3)-(rx*(1-corner3))+(rx*(1-corner4)));
+			memset(pos1+(rx*corner1), col, dxx-(wx*corner2)-(rx*(1-corner2))+(rx*(1-corner1)));
+			memset(pos2+(ry*corner1), col, dxx-(wy*corner2)-(ry*(1-corner2))+(ry*(1-corner1)));
+			memset(pos3+(ry*corner4), col, dxx-(wy*corner3)-(ry*(1-corner3))+(ry*(1-corner4)));
 #else
-			dest0=(fb_pixel_t *)(pos0+rx);
-			dest1=(fb_pixel_t *)(pos1+rx);
-			for (int i=0; i<(dxx-wx); i++)
-			{
+			dest0=(fb_pixel_t *)(pos0+(rx*corner4));
+			for (int i=0; i<(dxx-(wx*corner3)-(rx*(1-corner3))+(rx*(1-corner4))); i++)
 				*(dest0++)=col;
+
+			dest1=(fb_pixel_t *)(pos1+(rx*corner1));
+			for (int i=0; i<(dxx-(wx*corner2)-(rx*(1-corner2))+(rx*(1-corner1))); i++)
 				*(dest1++)=col;
-			}
-			dest0=(fb_pixel_t *)(pos2+ry);
-			dest1=(fb_pixel_t *)(pos3+ry);
-			for (int i=0; i<(dxx-wy); i++)
-			{
+
+			dest0=(fb_pixel_t *)(pos2+(ry*corner1));
+			for (int i=0; i<(dxx-(wy*corner2)-(ry*(1-corner2))+(ry*(1-corner1))); i++)
 				*(dest0++)=col;
+
+			dest1=(fb_pixel_t *)(pos3+(ry*corner4));
+			for (int i=0; i<(dxx-(wy*corner3)-(ry*(1-corner3))+(ry*(1-corner4))); i++)
 				*(dest1++)=col;
-			}
+
 #endif
 			sx++;
 			pos2-=stride;
diff -Naur old/framebuffer.h new/framebuffer.h
--- old/framebuffer.h	2008-02-28 16:58:10.000000000 +0100
+++ new/framebuffer.h	2008-02-28 17:04:51.000000000 +0100
@@ -41,6 +41,15 @@
 #define fb_pixel_t uint16_t
 #endif
 
+#define CORNER_TOP_LEFT		0x1
+#define CORNER_TOP_RIGHT	0x2
+#define CORNER_TOP			0x3
+#define CORNER_BOTTOM_RIGHT	0x4
+#define CORNER_RIGHT		0x6
+#define CORNER_BOTTOM_LEFT	0x8
+#define CORNER_LEFT			0x9
+#define CORNER_BOTTOM		0xC
+
 typedef struct fb_var_screeninfo t_fb_var_screeninfo;
 
 /** Ausfuehrung als Singleton */
@@ -131,7 +140,7 @@
 			};
 		void paintPixel(int x, int y, const fb_pixel_t col);
 
-		void paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, const int radius = 0);
+		void paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, const int radius = 0, const int corners = 0xf);
 		inline void paintBox(int xa, int ya, int xb, int yb, const fb_pixel_t col) { paintBoxRel(xa, ya, xb - xa, yb - ya, col); }
 
 		void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col);
CORNER_NONE und CORNER_ALL werden so nicht gebraucht, da man einfach den letzten Wert für CORNER_ALL oder beide für CORNER_NONE weglassen muss.

Gruß
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

flasher hat geschrieben:Ich nochmal.

Das minimal an Ingrids Diff angepasste Diff funktioniert so wie ich das mit dem Parameter meinte.
CORNER_NONE und CORNER_ALL werden so nicht gebraucht, da man einfach den letzten Wert für CORNER_ALL oder beide für CORNER_NONE weglassen muss.
Finde ich gut. Fällt Dir noch was nettes zu den for-Schleifen ein (also die bei !FB_USE_PALETTE), die ich leider verdoppeln musste? Wäre natürlich schöner, da nur 2 Schleifen zu haben statt jetzt 4.

Die Teile für den PC sind schon angekommen, wie's aussieht? :lol:
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: runde ecken ??

Beitrag von flasher »

ingrid hat geschrieben:
flasher hat geschrieben:Ich nochmal.

Das minimal an Ingrids Diff angepasste Diff funktioniert so wie ich das mit dem Parameter meinte.
CORNER_NONE und CORNER_ALL werden so nicht gebraucht, da man einfach den letzten Wert für CORNER_ALL oder beide für CORNER_NONE weglassen muss.
Finde ich gut. Fällt Dir noch was nettes zu den for-Schleifen ein (also die bei !FB_USE_PALETTE), die ich leider verdoppeln musste? Wäre natürlich schöner, da nur 2 Schleifen zu haben statt jetzt 4.

Die Teile für den PC sind schon angekommen, wie's aussieht? :lol:
Hallo

Die Teile noch nicht. Ich habe mal schnell meinen Lappi missbraucht :D
Ich sehe auch keine andere Möglichkeit als die vier Schleifen. Es müssen ja jetzt alle vier Ecken einzeln berechnet werden.

Ich bin mit Deiner Lösung zufrieden. Gemessen habe ich es nicht aber für mich ist kein Geschwindigkeitsunterschied zu erkennen.
66Mhz für zwei weitere For Schleifen sollte doch reichen ohne die Box dabei in die Knie zu zwingen.

Fals es dennoch jemand als unsauberen oder komplizierten Code ansieht, dann sollte er sich mal die Zeit nehmen das CVS durchzulesen :)


Gruß
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

flasher hat geschrieben:Fals es dennoch jemand als unsauberen oder komplizierten Code ansieht, dann sollte er sich mal die Zeit nehmen das CVS durchzulesen :)
:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

Naja, dürfte schon so in Ordnung sein. Mit 'ner richtigen Bremse durch die 2 zusätzlichen Schleifen habe ich auch nicht gerechnet, es werden ja schließlich keine 567.000 Durchläufe gemacht, sondern dank Bresenham nur das Nötigste berechnet. Sehr interessant übrigens. (Die Theorie, Dein Code, auch der Artikel, den Du woanders gelinkt hattest.)
Grabber66
Einsteiger
Einsteiger
Beiträge: 216
Registriert: Dienstag 1. Juni 2004, 12:24

Re: runde ecken ??

Beitrag von Grabber66 »

Am letzten Freitag wurde ja nun das CVS dementsprechend geändert.

http://cvs.tuxbox.org/lists/tuxbox-cvs- ... 00037.html

Doch wie nutze ich das jetzt genau?
Ich kann das hier nicht mehr genau herauslesen.

Diese Variablen sind ja dazugekommen:

Code: Alles auswählen

const int radius, const int corners
Ich gehe nun also zu dem Bild (z.B.: Infoviewer) und setze dort die Parameterangaben händisch hinten dran.

Doch wie muss das aussehen?
Ich lese das bislang so :
Alle ecken sind abgerundet : (mit Rundungswert 10)

Code: Alles auswählen

frameBuffer->paintBoxRel(5, 5, 10, 10, COL_MENUCONTENT_PLUS_0, 10, 0xF);
Alle oberen ecken sind abgerundet : (mit Rundungswert 10)

Code: Alles auswählen

frameBuffer->paintBoxRel(5, 5, 10, 10, COL_MENUCONTENT_PLUS_0, 10, 0x3);
Welchen Einfluss hat denn der Wert 10. Kann man auch kleine Rundungen mit z.B.: 6 machen?

THX
ingrid
Erleuchteter
Erleuchteter
Beiträge: 600
Registriert: Samstag 14. Oktober 2006, 10:53

Re: runde ecken ??

Beitrag von ingrid »

1. Parameter ist der Radius der zu zeichnenden Viertelkreise und ist beliebig. Probieren, bis Du's schön findest. ;)
2. Parameter ist dies:

Code: Alles auswählen

#define CORNER_TOP_LEFT		0x1
#define CORNER_TOP_RIGHT	0x2
#define CORNER_TOP			0x3
#define CORNER_BOTTOM_RIGHT	0x4
#define CORNER_RIGHT		0x6
#define CORNER_BOTTOM_LEFT	0x8
#define CORNER_LEFT			0x9
#define CORNER_BOTTOM		0xC
Zur besseren Lesbarkeit wäre es ratsam, die Variablen statt der Hex-Werte zu verwenden. ;) Die sind global definiert und können überall in Neutrino benutzt werden.

Du kannst ja auch mal hier reinschauen: http://forum.tuxbox-cvs.sourceforge.net ... =2&t=47580

Wenn Parameter 2 weggelassen wird, werden alle 4 Ecken abgerundet. Fehlt auch Parameter 1, wird ein kantiges Rechteck gezeichnet.
dbt
Administrator
Beiträge: 2675
Registriert: Donnerstag 28. September 2006, 19:18

Re: runde ecken ??

Beitrag von dbt »

Der Radius von meinem Screenshot ist mit 10 erstellt, nebenbei :wink:
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: runde ecken ??

Beitrag von mb405 »

wenn ich das richtig deute wird laut cvs alles rund gemalt ?? 0xf als vorgabe und radius ist 0 also kantig ?
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: runde ecken ??

Beitrag von flasher »

Hi

Per default wird alles Eckig nicht abgerundet...

radius ist per default 0.
Das bedeutet, dass eckig gezeichnet wird. Der Wert für corners wird ignoriert.

Beispiele:
...COL_SILVER); = Eckig
...COL_SILVER, 10); = vier abgerundete Ecken mit Radius 10
...COL_SILVER, 1); = vier abgerundete Ecken, Radius wird berechnet
...COL_SILVER, 0, 0xf); = Eckig, da Radius = 0. Egal was auch dahinter kommt
...COL_SILVER, 1, 0xf); = vier abgerundete Ecken., Radius wird berechnet
...COL_SILVER, 10, 0x2); = Oben Rund mit Radius 10 unten Eckig
...COL_SILVER, 1, 0x2); = Oben Rund unten Eckig, Radius wird berechnet
u.s.w

Gruß
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: runde ecken ??

Beitrag von mb405 »

aha mich hatten nur die 0x sechen sehr verwirrt :)
SnowHead
Einsteiger
Einsteiger
Beiträge: 105
Registriert: Sonntag 6. Juni 2004, 16:04

Re: runde ecken ??

Beitrag von SnowHead »

Gerade bei Schleifen innerhalb von Schleifen sollte man redundante Berechnungen
vermeiden, da diese dann sehr häufig ausgeführt werden. Das trifft auch auf das
Allocieren von Variablen zu. Ich würde daher eine funktionsglobale Deklaration der
Schleifenvariable empfehlen sowie die nur einmalige Berechnung des Endwertes:

Code: Alles auswählen

...
#else
			int i,j;

			dest0=(fb_pixel_t *)(pos0+(rx*corner4));
			j=(dxx-(wx*corner3)-(rx*(1-corner3))+(rx*(1-corner4)));
			for (i=0; i<j; i++)
				*(dest0++)=col;

			dest1=(fb_pixel_t *)(pos1+(rx*corner1));
			j=(dxx-(wx*corner2)-(rx*(1-corner2))+(rx*(1-corner1)));
			for (i=0; i<j; i++)
				*(dest1++)=col;

			dest0=(fb_pixel_t *)(pos2+(ry*corner1));
			j=(dxx-(wy*corner2)-(ry*(1-corner2))+(ry*(1-corner1)));
			for (i=0; i<j; i++)
				*(dest0++)=col;

			dest1=(fb_pixel_t *)(pos3+(ry*corner4));
			j=(dxx-(wy*corner3)-(ry*(1-corner3))+(ry*(1-corner4)));
			for (i=0; i<j; i++)
				*(dest1++)=col;
#endif
...
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: runde ecken ??

Beitrag von seife »

Prinzipiell hast du natürlich recht, allerdings gehe ich davon aus, daß zumindest der j=..-Teil vom gcc wegoptimiert wird, der generierte Code sich also nur minimal (wenn überhaupt) unterscheidet. Disassembliert habe ich die beiden Varianten aber jetzt auch nicht ;)
SnowHead
Einsteiger
Einsteiger
Beiträge: 105
Registriert: Sonntag 6. Juni 2004, 16:04

Re: runde ecken ??

Beitrag von SnowHead »

seife hat geschrieben:allerdings gehe ich davon aus, daß zumindest der j=..-Teil vom gcc wegoptimiert wird
Das halte ich für ziemlich unwahrscheinlich.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: runde ecken ??

Beitrag von seife »

Ich habe die Compilerbauer und Toolchain-spezis mal gefragt und sie wollten mir keine definitive Aussage zu der "total veralteten Version, die ihr da benutzt" ;) machen. Sie meinten, ich soll beides compilieren und dann disassemblieren - dazu war ich dann aber doch zu faul (und mein ppc-Assembler zu rostig).
Grabber66
Einsteiger
Einsteiger
Beiträge: 216
Registriert: Dienstag 1. Juni 2004, 12:24

Re: runde ecken ??

Beitrag von Grabber66 »

Kann ich eigentlich auch 2 Werte angeben. Ich wollte ein Fenster Oben ganz und unten links abrunden. Oder geht das gar nicht?