Forum: Mikrocontroller und Digitale Elektronik Graphic-library OHNE Arduino mit Texten und Farbkorrektur


von Robert B. (robertb)


Lesenswert?

Hallo!

Ich suche eine Grafik Bibliothek ähnlich der Adafruit GFX, welche aber 
im Idealfall auf Plain-C aufsetzt und keine weiteren (Arduino) Libraries 
benötigt.

Oder andersrum: Ich habe auf einer recht unüblichen MCU Plattform eine 
bereits per DMA und SPI sehr effiziente Ansteuerung von APA102 LEDs mit 
einem einwandfrei nutzbaren Framebuffer.

Interface wäre also quasi "SetPixel(x, y, r, g, b, [brightness])". Jetzt 
suche ich "upper-layer" Funktionen für Kreise, Linien, ggf. 
Farbkorrekturtabellen und am liebsten die Adafruit GFX Fonts.

Danke!

Grüße
Robert

von Lukas W. (lukas_we)


Lesenswert?

Probiere es mal mit LVGL

von Johannes S. (Gast)


Lesenswert?

Die AdafruitGFX ist nicht sehr Arduino spezifisch und kann auch für 
andere Plattformen umgebaut werden. Und C++ unterstützt gerade die 
Implementierung für verschiedenste Grafik Controller, inklusive LED 
Matrizen.

Lukas W. schrieb:
> Probiere es mal mit LVGL

da liegt der Fokus aber auf dem GUI level, einfache Zeichenfunktionen 
sind da eher aufwändig weil die wieder extra Speicher für den 
Zeichenbereich brauchen.

von Ralph S. (jjflash)


Lesenswert?

Robert B. schrieb:
> Funktionen für Kreise, Linien, ggf.

Bresenham (Linie) aus Wikipedia:
1
void line(int x0, int y0, int x1, int y1)
2
{
3
  int dx =  abs(x1-x0), sx = x0<x1 ? 1 : -1;
4
  int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
5
  int err = dx+dy, e2; /* error value e_xy */
6
7
  while (1) {
8
    setPixel(x0,y0);
9
    if (x0==x1 && y0==y1) break;
10
    e2 = 2*err;
11
    if (e2 > dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
12
    if (e2 < dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
13
  }
14
}

Bresenham (Ellipse) aus Wikipedia:
1
void ellipse(int xm, int ym, int a, int b)
2
{
3
   int dx = 0, dy = b; /* im I. Quadranten von links oben nach rechts unten */
4
   long a2 = a*a, b2 = b*b;
5
   long err = b2-(2*b-1)*a2, e2; /* Fehler im 1. Schritt */
6
7
   do {
8
       setPixel(xm+dx, ym+dy); /* I. Quadrant */
9
       setPixel(xm-dx, ym+dy); /* II. Quadrant */
10
       setPixel(xm-dx, ym-dy); /* III. Quadrant */
11
       setPixel(xm+dx, ym-dy); /* IV. Quadrant */
12
13
       e2 = 2*err;
14
       if (e2 <  (2*dx+1)*b2) { dx++; err += (2*dx+1)*b2; }
15
       if (e2 > -(2*dy-1)*a2) { dy--; err -= (2*dy-1)*a2; }
16
   } while (dy >= 0);
17
18
   while (dx++ < a) { /* fehlerhafter Abbruch bei flachen Ellipsen (b=1) */
19
       setPixel(xm+dx, ym); /* -> Spitze der Ellipse vollenden */
20
       setPixel(xm-dx, ym);
21
   }
22
}
23
24
void circle(int xm, int ym, int r)
25
{
26
  ellipse(xm, ym, r, r);
27
}

Funktionen kann man evtl. Farben mit übergeben und den setpixel in den 
Funktionen dann mitgeben.

Ab dem Moment, bei dem es schon ein funktionierendes Setpixel oder 
Putpixel schon gibt, gibt es zig Funktionen im Netz verfügbar, die von 
der Hardware unabhängig sind.

von Waldfee (Gast)


Lesenswert?

LVGL ist für so was ideal. Ist in Plain C, brauch nur SetPixel um ein 
Bild aufzubauen. Habe es selbst auf meiner Smartwat laufen. Als 
Vergleich, ein ESP32 packt locker 30FPS

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.