add support for custom Java Drawables

This is made possible, by adding a second Canvas implementation which
can be used to render directly to GdkSnapshot objects

For now the only implemented method is drawBitmap(), this is already
enough to make VectorDrawableCompat functional
This commit is contained in:
Julian Winkler
2024-03-24 21:01:47 +01:00
parent 0b78cbcc55
commit ad266c7821
15 changed files with 182 additions and 30 deletions

View File

@@ -0,0 +1,74 @@
package android.graphics;
/**
* GskCanvas:
* - implements Canvas for onscreen rendering inside GTKs snapshot function
*/
public class GskCanvas extends Canvas {
private long snapshot;
public GskCanvas(long snapshot) {
System.out.println("GskCanvas(" + snapshot + ")");
this.snapshot = snapshot;
}
@Override
public int save() {
System.out.println("GskCanvas.save()");
return -1;
}
@Override
public void restore() {
System.out.println("GskCanvas.restore()");
}
@Override
public void translate(float dx, float dy) {
System.out.println("GskCanvas.translate(" + dx + ", " + dy + ")");
}
@Override
public void rotate(float degrees) {
System.out.println("GskCanvas.rotate(" + degrees + ")");
}
@Override
public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {
native_drawBitmap(snapshot, bitmap.pixbuf, dst.left, dst.top, dst.width(), dst.height());
}
@Override
public void drawPath(Path path, Paint paint) {
System.out.println("GskCanvas.drawPath(" + path + ", " + paint + ")");
}
@Override
public void drawRect(float left, float top, float right, float bottom, Paint paint) {
System.out.println("GskCanvas.drawRect(" + left + ", " + top + ", " + right + ", " + bottom + ", " + paint + ")");
}
@Override
public void rotate(float degrees, float px, float py) {
System.out.println("GskCanvas.rotate(" + degrees + ", " + px + ", " + py + ")");
}
@Override
public void drawText(String text, float x, float y, Paint paint) {
System.out.println("GskCanvas.drawText(" + text + ", " + x + ", " + y + ", " + paint + ")");
}
@Override
public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
System.out.println("GskCanvas.drawLine(" + startX + ", " + startY + ", " + stopX + ", " + stopY + ", " + paint + ")");
}
@Override
public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
Rect dst = new Rect((int)left, (int)top, (int)left + bitmap.getWidth(), (int)top + bitmap.getHeight());
drawBitmap(bitmap, src, dst, paint);
}
protected native void native_drawBitmap(long snapshot, long pixbuf, int x, int y, int width, int height);
}