Wie die Stücke von Android (2D) Canvas-Zeichnung, die pipeline passt das zusammen?

Ich würde gerne besser verstehen, wie die Komponenten von Android (2D) Canvas-Zeichnung, die pipeline zusammen passen.

Angenommen, wie XferMode, Shader, MaskFilter und ColorFilter interagieren? Die Referenz-Dokumentation für diese Klassen sind ziemlich spärlich und die docs für Leinwand und Farbe nicht wirklich eine nützliche Erklärung.

Es ist auch mir nicht ganz klar, wie die Zeichenoperationen, die inneren Farben (z.B.: drawBitmap, im Vergleich zum "Vektor" primitive wie drawRect) passen in alle diese-nicht immer ignorieren die Paint's Farbe und Verwendung Ihrer intrinsischen Farbe statt?

Ich war auch überrascht von der Tatsache, dass man etwas wie das hier tun:

Paint eraser = new Paint();
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawOval(rectF, eraser);

Diese löscht ein oval. Bevor ich dies bemerkte meine geistige-Modell war, dass die Zeichnung auf eine Leinwand (konzeptionell) zieht, um eine separate "Schicht" und dann, die Schicht aus mit der Leinwand-Bitmap mit der Farbe die transfer-Modus. Wenn es so einfach, dann würde der obige code löscht die gesamte Bitmap (innerhalb der clipping region) als KLARE immer wird die Farbe (und alpha) auf 0 unabhängig von der Quelle der alpha. So impliziert dies, dass es eine zusätzliche Art von Maskierung gehen auf die beschränken, die radieren die sich zu einem oval.

Ich fand die API-demos aber jeder demo "im Vakuum" und nicht zeigen, wie die Sache es den Fokus auf (z.B.: XferModes) interagiert mit anderen Sachen (zB: ColorFilters).

Mit genügend Zeit und Mühe konnte ich empirisch herausfinden, wie diese Stücke beziehen, oder gehen Sie entziffern die Quelle, aber ich bin der Hoffnung, dass jemand anderes hat bereits herausgearbeitet, oder noch besser, dass es einige tatsächliche Dokumentation der pipeline/Zeichnung-Modell, das habe ich verpasst.

Diese Frage wurde inspiriert durch den Anblick der code in diese Antwort auf eine andere Frage ALSO.

Update

Während der Suche rund um für eine Dokumentation ist mir eingefallen, dass da viel die Sachen, die ich bin daran interessiert, hier zu sein scheint, eine ziemlich dünne Furnier auf der Oberseite der skia, vielleicht gibt es einen skia-Dokumentation, die nützlich sein würde. Das beste, was ich finden konnte ist die Dokumentation für SkPaint, die sagt:

Gibt es 6 Arten von Effekten, können
zugeordnet werden Farbe:

  • SkPathEffect - änderungen der geometrie (Pfad), bevor es erzeugt eine
    alpha-Maske (z.B. schneidigen)
  • SkRasterizer - verfassen von benutzerdefinierten Masken-Ebenen (z.B. Schatten)
  • SkMaskFilter - änderungen an der alpha-Maske, bevor es eingefärbt und
    gezeichnet (z.B. Weichzeichner, Relief)
  • SkShader - z.B. Farbverläufe (linear, radial-sweep), bitmap-Muster
    (Klammer -, repeat -, Spiegel)
  • SkColorFilter - ändern Sie die Quell-color(s) vor der Anwendung der xfermode
    (z.B. Farb-matrix)
  • SkXfermode - z.B. porter-duff transfermodes, blend-Modi

Es nicht ausdrücklich, aber ich vermute, dass die Reihenfolge der Effekte ist hier die Reihenfolge in der pipeline.

  • Sie sind am besten zu verstehen, wie mathematische Funktionen nehmen (alpha, color) - Tupel von 1-oder 2-Quelle der Bilder, und zur Ausgabe eines Tupels. hi-android.info/doc/android/graphics/PorterDuff.Mode.html (Buchung Nicht als eine Antwort, denn ich habe noch nie verwendet, Skia; nur auf der Basis der web-Suche Ergebnisse)
  • Das ist eine feine Erklärung PorterDuff.Modus, aber es nicht wirklich erklären, die gesamte pipeline. Siehe den Teil meiner Frage zu PorterDuff.- Modus.KLAR und drawOval, zum Beispiel. KLAR definiert ist wie immer die Ausgabe 0 an sowohl alpha-und die Farb-Kanäle unabhängig von den Eingängen, so dass die Anwendung KLAR sollte wischen Sie die gesamte Ziel-es sei denn, es gibt einige weitere Maskierung Einschränkung der Anwendung der mathematischen Funktion clear(src, dst) = [0,0].
  • warum sind Sie der Annahme, dass es extra Maskierung? Das oval an sich ist die Maske. Der software-renderer nicht stört blending Pixel außerhalb der Form, die Sie versuchen zu ziehen. Deine Erklärung würde nur arbeiten mit einer bitmap.
Schreibe einen Kommentar