-
Notifications
You must be signed in to change notification settings - Fork 56
/
Copy pathvideomodes.ts
120 lines (96 loc) · 2.83 KB
/
videomodes.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { MemoryPages, Restorable, memory } from './types';
export type bank = 0 | 1;
export type pageNo = 1 | 2;
export interface Region {
top: number;
bottom: number;
left: number;
right: number;
}
export interface GraphicsState {
buffer: memory[];
}
export interface VideoModesState {
grs: [gr1: GraphicsState, gr2: GraphicsState];
hgrs: [hgr1: GraphicsState, hgr2: GraphicsState];
textMode: boolean;
mixedMode: boolean;
hiresMode: boolean;
pageMode: pageNo;
_80colMode: boolean;
altCharMode: boolean;
an3State: boolean;
flag: number;
}
export interface VideoPage extends MemoryPages, Restorable<GraphicsState> {
imageData: ImageData;
dirty: Region;
bank0(): MemoryPages;
bank1(): MemoryPages;
refresh: () => void;
}
export interface LoresPage extends VideoPage {
getText: () => string;
}
export interface HiresPage extends VideoPage {}
export interface VideoModes extends Restorable<VideoModesState> {
textMode: boolean;
mixedMode: boolean;
hiresMode: boolean;
pageMode: pageNo;
_80colMode: boolean;
altCharMode: boolean;
an3State: boolean;
doubleHiresMode: boolean;
flag: number;
monoMode: boolean;
context: CanvasRenderingContext2D;
page(pageNo: number): void;
blit(altData?: ImageData): boolean;
reset(): void;
setLoresPage(page: pageNo, lores: LoresPage): void;
getLoresPage(page: pageNo): LoresPage;
setHiresPage(page: pageNo, lores: HiresPage): void;
getHiresPage(page: pageNo): HiresPage;
_80col(on: boolean): void;
altChar(on: boolean): void;
an3(on: boolean): void;
doubleHires(on: boolean): void;
hires(on: boolean): void;
mixed(on: boolean): void;
text(on: boolean): void;
is80Col(): boolean;
isAltChar(): boolean;
isDoubleHires(): boolean;
isHires(): boolean;
isMixed(): boolean;
isPage2(): boolean;
isText(): boolean;
mono(on: boolean): void;
scanlines(on: boolean): void;
getText(): string;
getCanvasAsBlob(): Promise<Blob>;
ready: Promise<void>;
}
export async function copyScreenToClipboard(vm: VideoModes) {
const text = vm.getText();
if (typeof ClipboardItem !== 'undefined') {
const data: Record<string, Blob> = {};
if (!vm.textMode) {
const blob = await vm.getCanvasAsBlob();
data[blob.type] = blob;
} else {
const htmlBlob = new Blob([`<pre>${text}</pre>`], {
type: 'text/html',
});
data[htmlBlob.type] = htmlBlob;
const textBlob = new Blob([text], {
type: 'text/plain',
});
data[textBlob.type] = textBlob;
}
await navigator.clipboard.write([new ClipboardItem(data)]);
} else {
await navigator.clipboard.writeText(text);
}
}