package co.smartreceipts.android.workers.reports.pdf.renderer.imagex;
import android.support.annotation.NonNull;
import com.google.common.base.Preconditions;
import com.tom_roush.pdfbox.pdmodel.common.PDRectangle;
import com.tom_roush.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.IOException;
import co.smartreceipts.android.workers.reports.pdf.pdfbox.PdfBoxImageUtils;
import co.smartreceipts.android.workers.reports.pdf.pdfbox.PdfBoxWriter;
import co.smartreceipts.android.workers.reports.pdf.renderer.Renderer;
import co.smartreceipts.android.workers.reports.pdf.renderer.constraints.HeightConstraint;
import co.smartreceipts.android.workers.reports.pdf.renderer.constraints.WidthConstraint;
import co.smartreceipts.android.workers.reports.pdf.renderer.constraints.XPositionConstraint;
import co.smartreceipts.android.workers.reports.pdf.renderer.constraints.YPositionConstraint;
import co.smartreceipts.android.workers.reports.pdf.renderer.formatting.Padding;
/**
* Renders a {@link PDImageXObject} using a {@link PdfBoxWriter}.
*/
public class PDImageXRenderer extends Renderer {
private final PDImageXFactory pdImageXFactory;
public PDImageXRenderer(@NonNull PDImageXFactory pdImageXFactory) {
this.pdImageXFactory = Preconditions.checkNotNull(pdImageXFactory);
this.height = MATCH_PARENT;
this.width = MATCH_PARENT;
}
@NonNull
@Override
public Renderer copy() {
final PDImageXRenderer copy = new PDImageXRenderer(this.pdImageXFactory);
copy.height = this.height;
copy.width = this.width;
copy.getRenderingConstraints().setConstraints(this.getRenderingConstraints());
copy.getRenderingFormatting().setFormatting(this.getRenderingFormatting());
return copy;
}
@Override
public void measure() throws IOException {
final float heightConstraint = Preconditions.checkNotNull(getRenderingConstraints().getConstraint(HeightConstraint.class));
final float widthConstraint = Preconditions.checkNotNull(getRenderingConstraints().getConstraint(WidthConstraint.class));
this.height = heightConstraint;
this.width = widthConstraint;
}
@Override
public void render(@NonNull PdfBoxWriter writer) throws IOException {
float x = Preconditions.checkNotNull(getRenderingConstraints().getConstraint(XPositionConstraint.class));
float y = Preconditions.checkNotNull(getRenderingConstraints().getConstraint(YPositionConstraint.class));
final float padding = getRenderingFormatting().getFormatting(Padding.class, 0f);
final PDImageXObject imageXObject = pdImageXFactory.get();
float availableHeight = height - 2 * padding;
float availableWidth = width - 2 * padding;
final PDRectangle rectangle = new PDRectangle(x + padding, y + padding, availableWidth, availableHeight);
final PDRectangle resizedRec = PdfBoxImageUtils.scaleImageInsideRectangle(imageXObject, rectangle);
writer.printPDImageXObject(imageXObject, resizedRec.getLowerLeftX(), resizedRec.getLowerLeftY(), resizedRec.getWidth(), resizedRec.getHeight());
}
}