manga-renderer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -0
- package/README.md +118 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/book/book.d.ts +133 -0
- package/dist/lib/book/book.js +329 -0
- package/dist/lib/book/book.js.map +1 -0
- package/dist/lib/book/envelope.d.ts +26 -0
- package/dist/lib/book/envelope.js +158 -0
- package/dist/lib/book/envelope.js.map +1 -0
- package/dist/lib/book/imagePacking.d.ts +10 -0
- package/dist/lib/book/imagePacking.js +213 -0
- package/dist/lib/book/imagePacking.js.map +1 -0
- package/dist/lib/book/layout.d.ts +41 -0
- package/dist/lib/book/layout.js +14 -0
- package/dist/lib/book/layout.js.map +1 -0
- package/dist/lib/book/notebook.d.ts +72 -0
- package/dist/lib/book/notebook.js +30 -0
- package/dist/lib/book/notebook.js.map +1 -0
- package/dist/lib/book/richChat.d.ts +36 -0
- package/dist/lib/book/richChat.js +87 -0
- package/dist/lib/book/richChat.js.map +1 -0
- package/dist/lib/book/storyboard.d.ts +125 -0
- package/dist/lib/book/storyboard.js +44 -0
- package/dist/lib/book/storyboard.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.d.ts +96 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.js +630 -0
- package/dist/lib/layeredCanvas/dataModels/bubble.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/effect.d.ts +25 -0
- package/dist/lib/layeredCanvas/dataModels/effect.js +104 -0
- package/dist/lib/layeredCanvas/dataModels/effect.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/film.d.ts +44 -0
- package/dist/lib/layeredCanvas/dataModels/film.js +172 -0
- package/dist/lib/layeredCanvas/dataModels/film.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.d.ts +99 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.js +861 -0
- package/dist/lib/layeredCanvas/dataModels/frameTree.js.map +1 -0
- package/dist/lib/layeredCanvas/dataModels/media.d.ts +39 -0
- package/dist/lib/layeredCanvas/dataModels/media.js +69 -0
- package/dist/lib/layeredCanvas/dataModels/media.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.d.ts +6 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.js +22 -0
- package/dist/lib/layeredCanvas/layers/SampleLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.d.ts +49 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.js +364 -0
- package/dist/lib/layeredCanvas/layers/arrayLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.d.ts +97 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.js +1418 -0
- package/dist/lib/layeredCanvas/layers/bubbleLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.d.ts +13 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.js +64 -0
- package/dist/lib/layeredCanvas/layers/floorLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.d.ts +106 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.js +1283 -0
- package/dist/lib/layeredCanvas/layers/frameLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.d.ts +33 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js +222 -0
- package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.d.ts +64 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.js +443 -0
- package/dist/lib/layeredCanvas/layers/paperRendererLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.d.ts +8 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.js +24 -0
- package/dist/lib/layeredCanvas/layers/undoLayer.js.map +1 -0
- package/dist/lib/layeredCanvas/system/keyCache.d.ts +4 -0
- package/dist/lib/layeredCanvas/system/keyCache.js +61 -0
- package/dist/lib/layeredCanvas/system/keyCache.js.map +1 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.d.ts +172 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.js +597 -0
- package/dist/lib/layeredCanvas/system/layeredCanvas.js.map +1 -0
- package/dist/lib/layeredCanvas/system/paperArray.d.ts +29 -0
- package/dist/lib/layeredCanvas/system/paperArray.js +108 -0
- package/dist/lib/layeredCanvas/system/paperArray.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.d.ts +7 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js +728 -0
- package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.d.ts +42 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js +129 -0
- package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.d.ts +4 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js +53 -0
- package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.js +45 -0
- package/dist/lib/layeredCanvas/tools/draw/drawText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.d.ts +15 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.js +172 -0
- package/dist/lib/layeredCanvas/tools/draw/richText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.d.ts +5 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js +63 -0
- package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.d.ts +16 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.js +2 -0
- package/dist/lib/layeredCanvas/tools/draw/typeSetting.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.d.ts +3 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.js +230 -0
- package/dist/lib/layeredCanvas/tools/draw/verticalText.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.js +15 -0
- package/dist/lib/layeredCanvas/tools/focusKeeper.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.d.ts +382 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.js +758 -0
- package/dist/lib/layeredCanvas/tools/frameExamples.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.d.ts +12 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js +117 -0
- package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.d.ts +2 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js +25 -0
- package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.d.ts +69 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.js +408 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.d.ts +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js +58 -0
- package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.d.ts +10 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.js +91 -0
- package/dist/lib/layeredCanvas/tools/geometry/quickHull.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.d.ts +18 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js +105 -0
- package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/grid.d.ts +7 -0
- package/dist/lib/layeredCanvas/tools/grid.js +16 -0
- package/dist/lib/layeredCanvas/tools/grid.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/haiku.d.ts +1 -0
- package/dist/lib/layeredCanvas/tools/haiku.js +17 -0
- package/dist/lib/layeredCanvas/tools/haiku.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.d.ts +8 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.js +58 -0
- package/dist/lib/layeredCanvas/tools/imageUtil.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.d.ts +26 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.js +124 -0
- package/dist/lib/layeredCanvas/tools/kinsoku.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/misc.d.ts +25 -0
- package/dist/lib/layeredCanvas/tools/misc.js +46 -0
- package/dist/lib/layeredCanvas/tools/misc.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.d.ts +2 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js +21 -0
- package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.d.ts +4 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.js +24 -0
- package/dist/lib/layeredCanvas/tools/pictureControl.js.map +1 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.d.ts +6 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.js +17 -0
- package/dist/lib/layeredCanvas/tools/rectHandle.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
Copyright (c) 2024 manga-renderer
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
The above copyright notice and this permission notice shall be included in all
|
|
10
|
+
copies or substantial portions of the Software.
|
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
12
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
13
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
14
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
15
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
16
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
17
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# manga-renderer
|
|
2
|
+
|
|
3
|
+
A JavaScript library for rendering manga/comic pages in browser canvas.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Load and render manga pages from envelope file format
|
|
8
|
+
- Automatic font loading (supports both Google Fonts and local fonts)
|
|
9
|
+
- Canvas-based rendering for optimal performance
|
|
10
|
+
- Handles text bubbles and typography
|
|
11
|
+
- TypeScript support
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install manga-renderer
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Basic Usage
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
import { readEnvelope, buildRenderer, listFonts, isLocalFont, loadGoogleFontForCanvas } from "manga-renderer";
|
|
23
|
+
|
|
24
|
+
// Load your envelope file
|
|
25
|
+
const response = await fetch('your-manga.envelope');
|
|
26
|
+
const fileContent = await response.blob();
|
|
27
|
+
const book = await readEnvelope(fileContent);
|
|
28
|
+
|
|
29
|
+
// Get canvas element
|
|
30
|
+
const canvas = document.querySelector('canvas');
|
|
31
|
+
|
|
32
|
+
// Load required fonts
|
|
33
|
+
const fonts = listFonts(book);
|
|
34
|
+
for (const font of fonts) {
|
|
35
|
+
const { family, weight } = font;
|
|
36
|
+
|
|
37
|
+
if (isLocalFont(family)) {
|
|
38
|
+
// Load local font
|
|
39
|
+
const localFile = localFonts[family];
|
|
40
|
+
const url = `/fonts/${localFile}.woff2`;
|
|
41
|
+
const font = new FontFace(family, `url(${url}) format('woff2')`, {
|
|
42
|
+
style: 'normal',
|
|
43
|
+
weight
|
|
44
|
+
});
|
|
45
|
+
document.fonts.add(font);
|
|
46
|
+
await font.load();
|
|
47
|
+
} else {
|
|
48
|
+
// Load Google font
|
|
49
|
+
await loadGoogleFontForCanvas(family, [weight]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Initialize renderer
|
|
54
|
+
const renderer = buildRenderer(canvas, book);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## API Reference
|
|
58
|
+
|
|
59
|
+
### `readEnvelope(blob: Blob): Promise<Book>`
|
|
60
|
+
Reads and parses a manga envelope file.
|
|
61
|
+
|
|
62
|
+
### `buildRenderer(canvas: HTMLCanvasElement, book: Book): Renderer`
|
|
63
|
+
Creates a new renderer instance for the given canvas and book.
|
|
64
|
+
|
|
65
|
+
### `listFonts(book: Book): Font[]`
|
|
66
|
+
Returns an array of required fonts for the book.
|
|
67
|
+
|
|
68
|
+
### `isLocalFont(family: string): boolean`
|
|
69
|
+
Checks if the given font family is a local font.
|
|
70
|
+
|
|
71
|
+
### `loadGoogleFontForCanvas(family: string, weights: string[]): Promise<void>`
|
|
72
|
+
Loads a Google Font for use with canvas.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
77
|
+
|
|
78
|
+
## Development Setup
|
|
79
|
+
|
|
80
|
+
Before building the package, you need to:
|
|
81
|
+
|
|
82
|
+
1. Clone the FramePlanner2 repository alongside the manga-renderer directory:
|
|
83
|
+
```bash
|
|
84
|
+
# Your workspace directory
|
|
85
|
+
├── manga-renderer/
|
|
86
|
+
└── FramePlanner2/ # clone this repository
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
2. Clone FramePlanner2:
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/jonigata/FramePlanner2.git
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
3. Run the setup script:
|
|
95
|
+
```bash
|
|
96
|
+
cd manga-renderer
|
|
97
|
+
sh setup.sh
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
This setup process is required because manga-renderer depends on some modules from the FramePlanner2 project.
|
|
101
|
+
|
|
102
|
+
## Project Structure
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
manga-renderer-npm/
|
|
106
|
+
├── src/
|
|
107
|
+
│ ├── /lib/layeredCanvas/ -> ../../../FramePlanner/src/lib/layeredCanvas/ (symlink)
|
|
108
|
+
│ └── /lib/book/ -> ../../../FramePlanner/src/lib/book/ (symlink)
|
|
109
|
+
├── setup.sh
|
|
110
|
+
└── package.json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Note: The `src/manga-renderer` directory is a symbolic link to the source code in the FramePlanner repository. Changes made to the files in either location will be reflected in both places.
|
|
114
|
+
|
|
115
|
+
## Contributing
|
|
116
|
+
|
|
117
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
118
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LayeredCanvas } from './lib/layeredCanvas/system/layeredCanvas';
|
|
2
|
+
import { ArrayLayer } from './lib/layeredCanvas/layers/arrayLayer';
|
|
3
|
+
import type { Book } from './lib/book/book';
|
|
4
|
+
import { FocusKeeper } from './lib/layeredCanvas/tools/focusKeeper';
|
|
5
|
+
export { readEnvelope } from './lib/book/envelope';
|
|
6
|
+
export { initPaperJs } from './lib/layeredCanvas/tools/draw/bubbleGraphic';
|
|
7
|
+
export declare class Renderer {
|
|
8
|
+
private arrayLayer;
|
|
9
|
+
private layeredCanvas;
|
|
10
|
+
private focusKeeper;
|
|
11
|
+
private marks;
|
|
12
|
+
constructor(arrayLayer: ArrayLayer, layeredCanvas: LayeredCanvas, focusKeeper: FocusKeeper, marks: boolean[]);
|
|
13
|
+
cleanup(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildRenderer(canvas: HTMLCanvasElement, book: Book): Renderer;
|
|
16
|
+
export declare function destroyRenderer(renderer: Renderer): void;
|
|
17
|
+
export declare function listFonts(book: Book): {
|
|
18
|
+
family: string;
|
|
19
|
+
weight: string;
|
|
20
|
+
}[];
|
|
21
|
+
export declare const localFonts: {
|
|
22
|
+
[key: string]: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function isLocalFont(fontFamily: string): boolean;
|
|
25
|
+
export declare function isGoogleFont(fontFamily: string): boolean;
|
|
26
|
+
export declare function loadGoogleFont(family: string, weights?: string[]): Promise<void>;
|
|
27
|
+
export declare function loadGoogleFontForCanvas(family: string, weights?: string[]): Promise<void>;
|
|
28
|
+
export declare function checkCanvasFontAvailable(family: string, weight?: string, maxRetries?: number, interval?: number): Promise<boolean>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { LayeredCanvas, Paper, Viewport } from './lib/layeredCanvas/system/layeredCanvas';
|
|
2
|
+
import { FloorLayer } from './lib/layeredCanvas/layers/floorLayer';
|
|
3
|
+
import { ArrayLayer } from './lib/layeredCanvas/layers/arrayLayer';
|
|
4
|
+
import { PaperRendererLayer } from './lib/layeredCanvas/layers/paperRendererLayer';
|
|
5
|
+
import { FocusKeeper } from './lib/layeredCanvas/tools/focusKeeper';
|
|
6
|
+
export { readEnvelope } from './lib/book/envelope';
|
|
7
|
+
export { initPaperJs } from './lib/layeredCanvas/tools/draw/bubbleGraphic';
|
|
8
|
+
export class Renderer {
|
|
9
|
+
arrayLayer;
|
|
10
|
+
layeredCanvas;
|
|
11
|
+
focusKeeper;
|
|
12
|
+
marks;
|
|
13
|
+
constructor(arrayLayer, layeredCanvas, focusKeeper, marks) {
|
|
14
|
+
this.arrayLayer = arrayLayer;
|
|
15
|
+
this.layeredCanvas = layeredCanvas;
|
|
16
|
+
this.focusKeeper = focusKeeper;
|
|
17
|
+
this.marks = marks;
|
|
18
|
+
}
|
|
19
|
+
cleanup() {
|
|
20
|
+
this.layeredCanvas.cleanup();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function buildRenderer(canvas, book) {
|
|
24
|
+
const viewport = new Viewport(canvas, () => { });
|
|
25
|
+
const focusKeeper = new FocusKeeper();
|
|
26
|
+
const layeredCanvas = new LayeredCanvas(viewport, true);
|
|
27
|
+
const floorLayer = new FloorLayer(layeredCanvas.viewport, () => { }, focusKeeper);
|
|
28
|
+
layeredCanvas.rootPaper.addLayer(floorLayer);
|
|
29
|
+
let papers = [];
|
|
30
|
+
// pages.push(pages[0]);
|
|
31
|
+
let pageNumber = 0;
|
|
32
|
+
for (const page of book.pages) {
|
|
33
|
+
for (const bubble of page.bubbles) {
|
|
34
|
+
bubble.pageNumber = pageNumber;
|
|
35
|
+
}
|
|
36
|
+
papers.push(buildPaper(page));
|
|
37
|
+
pageNumber++;
|
|
38
|
+
}
|
|
39
|
+
const direction = getDirectionFromReadingDirection(book.direction);
|
|
40
|
+
const { fold, gapX, gapY } = getFoldAndGapFromWrapMode(book.wrapMode);
|
|
41
|
+
const marks = [];
|
|
42
|
+
const arrayLayer = new ArrayLayer(papers, marks, fold, gapX, gapY, direction, () => { }, () => { }, () => { }, () => { }, () => { }, () => { }, () => { });
|
|
43
|
+
layeredCanvas.rootPaper.addLayer(arrayLayer);
|
|
44
|
+
return new Renderer(arrayLayer, layeredCanvas, focusKeeper, marks);
|
|
45
|
+
}
|
|
46
|
+
export function destroyRenderer(renderer) {
|
|
47
|
+
renderer.cleanup();
|
|
48
|
+
}
|
|
49
|
+
function buildPaper(page) {
|
|
50
|
+
const paper = new Paper(page.paperSize, false);
|
|
51
|
+
// renderer
|
|
52
|
+
const paperRendererLayer = new PaperRendererLayer();
|
|
53
|
+
paperRendererLayer.setFrameTree(page.frameTree);
|
|
54
|
+
paperRendererLayer.setBubbles(page.bubbles);
|
|
55
|
+
paper.addLayer(paperRendererLayer);
|
|
56
|
+
// frame
|
|
57
|
+
page.frameTree.bgColor = page.paperColor;
|
|
58
|
+
page.frameTree.borderColor = page.frameColor;
|
|
59
|
+
page.frameTree.borderWidth = page.frameWidth;
|
|
60
|
+
return paper;
|
|
61
|
+
}
|
|
62
|
+
function getFoldAndGapFromWrapMode(wrapMode) {
|
|
63
|
+
switch (wrapMode) {
|
|
64
|
+
case "none":
|
|
65
|
+
return { fold: 0, gapX: 100, gapY: 0 };
|
|
66
|
+
case "two-pages":
|
|
67
|
+
return { fold: 2, gapX: 100, gapY: 200 };
|
|
68
|
+
case "one-page":
|
|
69
|
+
return { fold: 1, gapX: 0, gapY: 0 };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function getDirectionFromReadingDirection(readingDirection) {
|
|
73
|
+
switch (readingDirection) {
|
|
74
|
+
case "left-to-right":
|
|
75
|
+
return 1;
|
|
76
|
+
case "right-to-left":
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function listFonts(book) {
|
|
81
|
+
const fonts = new Set();
|
|
82
|
+
for (let page of book.pages) {
|
|
83
|
+
for (let bubble of page.bubbles) {
|
|
84
|
+
fonts.add(JSON.stringify({ family: bubble.fontFamily, weight: bubble.fontWeight }));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return [...fonts].map(font => JSON.parse(font));
|
|
88
|
+
}
|
|
89
|
+
export const localFonts = {
|
|
90
|
+
'源暎アンチック': 'GenEiAntiqueNv5-M',
|
|
91
|
+
'源暎エムゴ': 'GenEiMGothic2-Black',
|
|
92
|
+
'源暎ぽっぷる': 'GenEiPOPle-Bk',
|
|
93
|
+
'源暎ラテゴ': 'GenEiLateMinN_v2',
|
|
94
|
+
'源暎ラテミン': 'GenEiLateMinN_v2',
|
|
95
|
+
"ふい字": 'HuiFont29',
|
|
96
|
+
"まきばフォント": 'MakibaFont13',
|
|
97
|
+
};
|
|
98
|
+
export function isLocalFont(fontFamily) {
|
|
99
|
+
return localFonts[fontFamily] !== undefined;
|
|
100
|
+
}
|
|
101
|
+
export function isGoogleFont(fontFamily) {
|
|
102
|
+
return !isLocalFont(fontFamily);
|
|
103
|
+
}
|
|
104
|
+
// Googleフォントの読み込みチェック用のキャッシュ
|
|
105
|
+
const loadedGoogleFonts = new Set();
|
|
106
|
+
export async function loadGoogleFont(family, weights = ['400']) {
|
|
107
|
+
try {
|
|
108
|
+
const key = `${family}-${weights.join('-')}`;
|
|
109
|
+
if (loadedGoogleFonts.has(key))
|
|
110
|
+
return;
|
|
111
|
+
const familyParam = family.replace(/\s+/g, '+');
|
|
112
|
+
const weightsParam = weights.join(';');
|
|
113
|
+
const url = `https://fonts.googleapis.com/css2?family=${familyParam}:wght@${weightsParam}&display=swap`;
|
|
114
|
+
const response = await fetch(url, {
|
|
115
|
+
headers: { 'User-Agent': navigator.userAgent }
|
|
116
|
+
});
|
|
117
|
+
const css = await response.text();
|
|
118
|
+
const fontUrlMatches = Array.from(css.matchAll(/src: url\((.+?)\) format\('woff2'\)/g));
|
|
119
|
+
if (!fontUrlMatches.length) {
|
|
120
|
+
throw new Error('No font URLs found in CSS');
|
|
121
|
+
}
|
|
122
|
+
const loadPromises = fontUrlMatches.map(match => {
|
|
123
|
+
const fontUrl = match[1];
|
|
124
|
+
const cssBlock = css.substring(0, match.index).split('}').slice(-1)[0];
|
|
125
|
+
const weightMatch = cssBlock.match(/font-weight: (\d+)/);
|
|
126
|
+
const weight = weightMatch ? weightMatch[1] : '400';
|
|
127
|
+
const font = new FontFace(family, `url(${fontUrl})`, {
|
|
128
|
+
weight,
|
|
129
|
+
style: 'normal'
|
|
130
|
+
});
|
|
131
|
+
return font.load().then(loadedFace => {
|
|
132
|
+
document.fonts.add(loadedFace);
|
|
133
|
+
return loadedFace;
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
await Promise.all(loadPromises);
|
|
137
|
+
await document.fonts.ready;
|
|
138
|
+
loadedGoogleFonts.add(key);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error(`Failed to load font "${family}":`, error);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function loadGoogleFontForCanvas(family, weights = ['400']) {
|
|
146
|
+
try {
|
|
147
|
+
// 既存のフォント読み込み処理
|
|
148
|
+
await loadGoogleFont(family, weights);
|
|
149
|
+
// document.fonts.readyで待機
|
|
150
|
+
await document.fonts.ready;
|
|
151
|
+
// 各ウェイトについてCanvas対応を確認
|
|
152
|
+
const checks = weights.map(weight => checkCanvasFontAvailable(family, weight));
|
|
153
|
+
await Promise.all(checks);
|
|
154
|
+
console.log(`Font "${family}" is fully loaded and ready for Canvas use`);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.error(`Failed to load font "${family}" for Canvas:`, error);
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export async function checkCanvasFontAvailable(family, weight = '400', maxRetries = 20, interval = 50) {
|
|
162
|
+
const testString = 'あいうえおABCDE12345';
|
|
163
|
+
const fontSize = '24px';
|
|
164
|
+
function measureWidth() {
|
|
165
|
+
const canvas = document.createElement('canvas');
|
|
166
|
+
const ctx = canvas.getContext('2d');
|
|
167
|
+
// テスト対象のフォントで描画
|
|
168
|
+
ctx.font = `${weight} ${fontSize} "${family}"`;
|
|
169
|
+
const targetWidth = ctx.measureText(testString).width;
|
|
170
|
+
// フォールバックフォントで描画
|
|
171
|
+
ctx.font = `${weight} ${fontSize} serif`;
|
|
172
|
+
const fallbackWidth = ctx.measureText(testString).width;
|
|
173
|
+
return targetWidth !== fallbackWidth;
|
|
174
|
+
}
|
|
175
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
176
|
+
if (measureWidth()) {
|
|
177
|
+
console.log(`Font "${family}" ${weight} is ready for Canvas`);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
await new Promise(resolve => setTimeout(resolve, interval));
|
|
181
|
+
}
|
|
182
|
+
throw new Error(`Timeout waiting for font "${family}" ${weight} to be ready for Canvas`);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { Bubble } from '../layeredCanvas/dataModels/bubble';
|
|
2
|
+
import { FrameElement, type Layout, type Border } from '../layeredCanvas/dataModels/frameTree';
|
|
3
|
+
import { Film, FilmStack } from '../layeredCanvas/dataModels/film';
|
|
4
|
+
import type { Rect, Vector } from "../layeredCanvas/tools/geometry/geometry";
|
|
5
|
+
import type { RichChatLog, ProtocolChatLog } from './richChat';
|
|
6
|
+
import { type Notebook } from "./notebook";
|
|
7
|
+
export type Prefix = 'shortcut-' | 'paste-' | 'drop-' | 'add-in-folder-' | 'shared-' | 'initial-' | 'hiruma-' | 'weaved-' | 'envelope-';
|
|
8
|
+
export type Revision = {
|
|
9
|
+
id: string;
|
|
10
|
+
revision: number;
|
|
11
|
+
prefix: Prefix;
|
|
12
|
+
};
|
|
13
|
+
export type Page = {
|
|
14
|
+
id: string;
|
|
15
|
+
frameTree: FrameElement;
|
|
16
|
+
bubbles: Bubble[];
|
|
17
|
+
paperSize: [number, number];
|
|
18
|
+
paperColor: string;
|
|
19
|
+
frameColor: string;
|
|
20
|
+
frameWidth: number;
|
|
21
|
+
source: any;
|
|
22
|
+
};
|
|
23
|
+
export type HistoryTag = 'bubble' | 'page-attribute' | "effect" | null;
|
|
24
|
+
export type HistoryWeight = "light" | "heavy";
|
|
25
|
+
export type HistoryEntry = {
|
|
26
|
+
pages: Page[];
|
|
27
|
+
tag: HistoryTag;
|
|
28
|
+
};
|
|
29
|
+
export type History = {
|
|
30
|
+
entries: HistoryEntry[];
|
|
31
|
+
cursor: number;
|
|
32
|
+
};
|
|
33
|
+
export type ReadingDirection = 'left-to-right' | 'right-to-left';
|
|
34
|
+
export type WrapMode = 'none' | 'two-pages' | 'one-page';
|
|
35
|
+
export type VideoSettings = {
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
moveDuration: number;
|
|
39
|
+
standardWait: number;
|
|
40
|
+
standardScale: number;
|
|
41
|
+
};
|
|
42
|
+
export type Book = {
|
|
43
|
+
revision: Revision;
|
|
44
|
+
pages: Page[];
|
|
45
|
+
history: History;
|
|
46
|
+
direction: ReadingDirection;
|
|
47
|
+
wrapMode: WrapMode;
|
|
48
|
+
chatLogs: RichChatLog[];
|
|
49
|
+
notebook: Notebook;
|
|
50
|
+
video?: VideoSettings;
|
|
51
|
+
};
|
|
52
|
+
export type SerializedPage = {
|
|
53
|
+
id: string;
|
|
54
|
+
frameTree: any;
|
|
55
|
+
bubbles: any[];
|
|
56
|
+
paperSize: [number, number];
|
|
57
|
+
paperColor: string;
|
|
58
|
+
frameColor: string;
|
|
59
|
+
frameWidth: number;
|
|
60
|
+
};
|
|
61
|
+
export type SerializedBook = {
|
|
62
|
+
revision: {
|
|
63
|
+
id: string;
|
|
64
|
+
revision: number;
|
|
65
|
+
prefix: Prefix;
|
|
66
|
+
};
|
|
67
|
+
pages: SerializedPage[];
|
|
68
|
+
direction: ReadingDirection;
|
|
69
|
+
wrapMode: WrapMode;
|
|
70
|
+
chatLogs: ProtocolChatLog[];
|
|
71
|
+
notebook: Notebook;
|
|
72
|
+
};
|
|
73
|
+
export declare function incrementRevision(revision: Revision): void;
|
|
74
|
+
export declare function revisionEqual(a: Revision, b: Revision): boolean;
|
|
75
|
+
export declare function getHistoryWeight(book: Book): HistoryWeight;
|
|
76
|
+
export declare function addBookHistory(book: Book, tag: HistoryTag): void;
|
|
77
|
+
export declare function undoBookHistory(book: Book): void;
|
|
78
|
+
export declare function redoBookHistory(book: Book): void;
|
|
79
|
+
export declare function commitBook(book: Book, tag: HistoryTag): void;
|
|
80
|
+
export declare function revertBook(book: Book): void;
|
|
81
|
+
export declare function newPage(frameTree: FrameElement, bubbles: Bubble[]): Page;
|
|
82
|
+
export declare function newBook(id: string, prefix: Prefix, exampleIndex: number): Book;
|
|
83
|
+
export declare function newImageBook(id: string, canvas: HTMLCanvasElement, prefix: Prefix): Book;
|
|
84
|
+
export interface BookOperators {
|
|
85
|
+
hint: (r: [number, number, number, number], s: string | null) => void;
|
|
86
|
+
commit: (tag: HistoryTag) => void;
|
|
87
|
+
forceDelayedCommit(): void;
|
|
88
|
+
cancelDelayedCommit(): void;
|
|
89
|
+
revert: () => void;
|
|
90
|
+
undo: () => void;
|
|
91
|
+
redo: () => void;
|
|
92
|
+
shift: (page: Page, frameElement: FrameElement) => void;
|
|
93
|
+
unshift: (page: Page, frameElement: FrameElement) => void;
|
|
94
|
+
swap: (page: Page, frameElement0: FrameElement, frameElement1: FrameElement) => void;
|
|
95
|
+
insert: (page: Page, border: Border) => void;
|
|
96
|
+
focusFrame: (page: Page, frame: FrameElement | null, p: Vector | null) => void;
|
|
97
|
+
focusBubble: (page: Page, bubble: Bubble | null) => void;
|
|
98
|
+
viewportChanged: () => void;
|
|
99
|
+
insertPage: (index: number) => void;
|
|
100
|
+
deletePage: (index: number) => void;
|
|
101
|
+
movePages: (from: number[], to: number) => void;
|
|
102
|
+
copyPageToClipboard: (index: number) => void;
|
|
103
|
+
batchImaging: (index: number) => void;
|
|
104
|
+
editBubbles: (index: number) => void;
|
|
105
|
+
tweak: (index: number) => void;
|
|
106
|
+
chase: () => void;
|
|
107
|
+
getMarks: () => boolean[];
|
|
108
|
+
setMarks: (marks: boolean[]) => void;
|
|
109
|
+
getFocusedPage: () => Page;
|
|
110
|
+
}
|
|
111
|
+
export declare function clonePage(page: Page): Page;
|
|
112
|
+
export declare function cloneBook(book: Book): Book;
|
|
113
|
+
export type FrameContent = {
|
|
114
|
+
sourcePage: Page;
|
|
115
|
+
sourceRect: Rect;
|
|
116
|
+
filmStack: FilmStack;
|
|
117
|
+
bubbles: Bubble[];
|
|
118
|
+
prompt: string | null;
|
|
119
|
+
};
|
|
120
|
+
export type FrameSlot = {
|
|
121
|
+
layout: Layout;
|
|
122
|
+
page: Page;
|
|
123
|
+
pageNumber: number;
|
|
124
|
+
};
|
|
125
|
+
export type FrameSequence = {
|
|
126
|
+
slots: FrameSlot[];
|
|
127
|
+
contents: FrameContent[];
|
|
128
|
+
};
|
|
129
|
+
export declare function collectBookContents(book: Book): FrameSequence;
|
|
130
|
+
export declare function collectPageContents(page: Page, pageNumber: number, dir: ReadingDirection): FrameSequence;
|
|
131
|
+
export declare function dealBookContents(seq: FrameSequence, insertElement: FrameElement | null, spliceElement: FrameElement | null): void;
|
|
132
|
+
export declare function swapBookContents(seq: FrameSequence, frameElement0: FrameElement, frameElement1: FrameElement): void;
|
|
133
|
+
export declare function collectAllFilms(book: Book): Film[];
|