Start texture-space book renderer

This commit is contained in:
2026-06-06 14:51:07 +02:00
parent 326f812b22
commit 62215b280f
6 changed files with 259 additions and 100 deletions
+90
View File
@@ -0,0 +1,90 @@
/**
* Book Page Format Module
* Defines the canonical page geometry used by the WebGL book renderer.
*/
import { BaseModule } from './base-module.js';
class BookPageFormatModule extends BaseModule {
constructor() {
super('book-page-format', 'Book Page Format');
this.dependencies = [];
this.format = Object.freeze({
id: 'us-mass-market-hardcover',
trim: Object.freeze({
widthIn: 4.25,
heightIn: 6.375
}),
margins: Object.freeze({
topIn: 0.46,
bottomIn: 0.58,
innerIn: 0.68,
outerIn: 0.46
}),
typography: Object.freeze({
fontFamily: '"EB Garamond", "EB Garamond 12", serif',
bodyFontSizePt: 10.8,
lineHeightPt: 14.9,
headingFontSizePt: 13.2,
dropCapLines: 2
})
});
this.bindMethods([
'getFormat',
'getAspectRatio',
'getTextureMetrics',
'inchesToTexture'
]);
}
async initialize() {
this.reportProgress(100, 'Book page format ready');
return true;
}
getFormat() {
return this.format;
}
getAspectRatio() {
return this.format.trim.widthIn / this.format.trim.heightIn;
}
inchesToTexture(valueIn, textureHeight) {
return (Number(valueIn) / this.format.trim.heightIn) * textureHeight;
}
getTextureMetrics(textureWidth = 1280) {
const width = Math.max(1, Math.round(Number(textureWidth) || 1280));
const height = Math.round(width / this.getAspectRatio());
const margins = {
top: this.inchesToTexture(this.format.margins.topIn, height),
bottom: this.inchesToTexture(this.format.margins.bottomIn, height),
inner: this.inchesToTexture(this.format.margins.innerIn, height),
outer: this.inchesToTexture(this.format.margins.outerIn, height)
};
return {
width,
height,
aspectRatio: this.getAspectRatio(),
margins,
content: {
x: margins.outer,
y: margins.top,
width: Math.max(1, width - margins.outer - margins.inner),
height: Math.max(1, height - margins.top - margins.bottom)
},
typography: this.format.typography
};
}
}
const bookPageFormat = new BookPageFormatModule();
export { bookPageFormat as BookPageFormat };
if (window.moduleRegistry) {
window.moduleRegistry.register(bookPageFormat);
}
window.BookPageFormat = bookPageFormat;