package org.wikipedia.richtext;
import android.graphics.Paint;
import android.text.Spanned;
import android.text.style.LineHeightSpan;
/*package*/ abstract class RelativeLineHeightSpan implements LineHeightSpan {
private final float scalar;
RelativeLineHeightSpan(float scalar) {
this.scalar = scalar;
}
protected float scaledAscender(Paint.FontMetricsInt metrics) {
return -ascenderHeightRatio(metrics) * scaledLineHeight(metrics);
}
protected float scaledDescender(Paint.FontMetricsInt metrics) {
return descenderHeightRatio(metrics) * scaledLineHeight(metrics);
}
protected float descenderHeightRatio(Paint.FontMetricsInt metrics) {
return 1 - ascenderHeightRatio(metrics);
}
protected float ascenderHeightRatio(Paint.FontMetricsInt metrics) {
int height = lineHeight(metrics);
return height == 0 ? 0 : Math.abs(metrics.ascent) / (float) height;
}
protected float scaledLineHeight(Paint.FontMetricsInt metrics) {
return lineHeight(metrics) * scalar;
}
protected int lineHeight(Paint.FontMetricsInt metrics) {
return Math.abs(metrics.ascent) + Math.abs(metrics.descent);
}
protected boolean spanStart(CharSequence text, int start) {
return spanStart((Spanned) text, start);
}
protected boolean spanStart(Spanned text, int start) {
return text.getSpanStart(this) == start;
}
protected boolean spanEnd(CharSequence text, int end) {
return spanEnd((Spanned) text, end);
}
protected boolean spanEnd(Spanned text, int end) {
return text.getSpanEnd(this) == end;
}
}