74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
import { jDataView } from "./jdataview";
|
|
import { supportedFormats } from "../format-readers";
|
|
import { Pattern } from "./pattern";
|
|
|
|
function renderFile(filename, evt, canvas, colorView, stitchesView, sizeView) {
|
|
const fileExtension = filename.toLowerCase().split(".").pop();
|
|
const view = jDataView(evt.target.result, 0, evt.size);
|
|
const pattern = new Pattern();
|
|
|
|
supportedFormats[fileExtension].read(view, pattern);
|
|
|
|
pattern.moveToPositive();
|
|
pattern.drawShapeTo(canvas);
|
|
pattern.drawColorsTo(colorView);
|
|
pattern.drawStitchesCountTo(stitchesView);
|
|
pattern.drawSizeValuesTo(stitchesView);
|
|
}
|
|
|
|
function renderAbortMessage(errorMessageRef) {
|
|
errorMessageRef.innerHTML = "Render aborted!";
|
|
}
|
|
|
|
function renderErrorMessage(errorName, errorMessageRef) {
|
|
let message;
|
|
switch (errorName) {
|
|
case "NotFoundError":
|
|
message =
|
|
"The file could not be found at the time the read was processed.";
|
|
break;
|
|
case "SecurityError":
|
|
message = "<p>A file security error occured. This can be due to:</p>";
|
|
message +=
|
|
"<ul><li>Accessing certain files deemed unsafe for Web applications.</li>";
|
|
message += "<li>Performing too many read calls on file resources.</li>";
|
|
message +=
|
|
"<li>The file has changed on disk since the user selected it.</li></ul>";
|
|
break;
|
|
case "NotReadableError":
|
|
message =
|
|
"The file cannot be read. This can occur if the file is open in another application.";
|
|
break;
|
|
case "EncodingError":
|
|
message = "The length of the data URL for the file is too long.";
|
|
break;
|
|
default:
|
|
message = "Something wrong happened!";
|
|
break;
|
|
}
|
|
|
|
errorMessageRef.innerHTML = message;
|
|
}
|
|
|
|
export default function renderFileToCanvas(
|
|
fileObject,
|
|
canvas,
|
|
errorMessageRef,
|
|
colorView,
|
|
stitchesView,
|
|
sizeView
|
|
) {
|
|
const reader = new FileReader();
|
|
|
|
reader.onloadend = (evt) =>
|
|
renderFile(fileObject.name, evt, canvas, colorView, stitchesView, sizeView);
|
|
reader.abort = (/** @type {any} */ _) => renderAbortMessage(errorMessageRef);
|
|
reader.onerror = (evt) =>
|
|
renderErrorMessage(evt.target.error.name, errorMessageRef);
|
|
|
|
if (fileObject) {
|
|
reader.readAsArrayBuffer(fileObject);
|
|
}
|
|
|
|
return "";
|
|
}
|