package com.xenoage.zong.renderer.stamping;
import com.xenoage.utils.color.Color;
import com.xenoage.utils.math.geom.Point2f;
import com.xenoage.utils.math.geom.Rectangle2f;
import com.xenoage.zong.musiclayout.stampings.Stamping;
import com.xenoage.zong.musiclayout.stampings.StemStamping;
import com.xenoage.zong.musiclayout.stampings.bitmap.BitmapLine;
import com.xenoage.zong.musiclayout.stampings.bitmap.BitmapStaff;
import com.xenoage.zong.renderer.RendererArgs;
import com.xenoage.zong.renderer.canvas.Canvas;
import com.xenoage.zong.renderer.canvas.CanvasFormat;
/**
* Renderer for a {@link StemStamping}.
*
* @author Andreas Wenger
*/
public class StemRenderer
extends StampingRenderer {
/**
* Draws the given {@link StemStamping} on the given {@link Canvas},
* using the given {@link RendererArgs}.
*/
@Override public void draw(Stamping stamping, Canvas canvas, RendererArgs args) {
StemStamping stem = (StemStamping) stamping;
float scaling = args.targetScaling;
float lineWidthMm = stem.noteStaff.getLineWidthMm(); //TODO: stem is thinner
Point2f p1Mm = new Point2f(stem.xMm - lineWidthMm / 2, stem.noteStaff.positionMm.y);
Point2f p2Mm = new Point2f(stem.xMm + lineWidthMm / 2, stem.endStaff.positionMm.y);
Color color = Color.black;
//shorten stem a little bit at the notehead - TODO: looks good. is code ok?
float noteLp = stem.noteLp + 0.2f * (stem.endLp > stem.noteLp ? 1 : -1);
if (canvas.getFormat() == CanvasFormat.Raster) {
//render on screen or print
BitmapLine screenLine = new BitmapLine(lineWidthMm, color, scaling);
BitmapStaff noteScreenStaff = stem.noteStaff.getBitmapInfo().getBitmapStaff(scaling);
BitmapStaff endScreenStaff = stem.endStaff.getBitmapInfo().getBitmapStaff(scaling);
p1Mm = new Point2f(p1Mm.x, p1Mm.y + noteScreenStaff.getYMm(noteLp));
p2Mm = new Point2f(p2Mm.x, p2Mm.y + endScreenStaff.getYMm(stem.endLp));
float width = screenLine.widthMm; //ensure same width for each stem in this staff
canvas.fillRect(new Rectangle2f(p1Mm.x, p1Mm.y, width, p2Mm.y - p1Mm.y), screenLine.color);
}
else if (canvas.getFormat() == CanvasFormat.Vector) {
//render with high quality
p1Mm = new Point2f(p1Mm.x, stem.noteStaff.computeYMm(noteLp));
p2Mm = new Point2f(p2Mm.x, stem.endStaff.computeYMm(stem.endLp));
canvas.fillRect(new Rectangle2f(p1Mm.x, p1Mm.y, p2Mm.x - p1Mm.x, p2Mm.y - p1Mm.y), color);
}
}
}