-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDOPage.cs
194 lines (152 loc) · 6.51 KB
/
DOPage.cs
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Ink;
namespace PenTabletNotebook {
class DOPage {
private string mImgFilename = "";
public string ImgFilename {
get { return mImgFilename; }
set { mImgFilename = value; }
}
private string mSaveDir;
private string mLoadDir;
/// <summary>
/// DrawObjの情報をシリアライズし保持。
/// </summary>
private System.IO.MemoryStream mMStream;
private long mStreamBytes = 0;
/// <summary>
/// mStreamのバージョン。
/// </summary>
private int mStreamFileVersion;
private StrokeCollection mStrokeCollection = new StrokeCollection();
System.IO.BinaryWriter mBW;
System.IO.BinaryReader mBR;
private int FOURCC = 0x45474150; //< "PAGE"
public DOPage() {
mMStream = new System.IO.MemoryStream();
mBW = new System.IO.BinaryWriter(mMStream);
mBR = new System.IO.BinaryReader(mMStream);
}
public bool Save(System.IO.BinaryWriter bw) {
if (mStreamBytes == 0) {
// ページが追加されたが一度も表示されなかった場合。
Serialize(mStrokeCollection);
}
var b = mMStream.ToArray();
// 最後についているごみを除去。
Array.Resize(ref b, (int)mStreamBytes);
// バイト数を書き込み。
int bytes = b.Length;
bw.Write(bytes);
bw.Write(b);
return true;
}
public void Load(int fileVersion, System.IO.BinaryReader br, string saveDir, string loadDir) {
mSaveDir = saveDir;
mLoadDir = loadDir;
// brから読んでメモリ上にバッファbを作成。
int bytes = br.ReadInt32();
var b = br.ReadBytes(bytes);
// mStreamにバッファbを書き込みます。
mMStream = new System.IO.MemoryStream();
mBW = new System.IO.BinaryWriter(mMStream);
mBW.Write(b);
// バッファbのメモリストリームから内容を読み出し。
mBR = new System.IO.BinaryReader(mMStream);
mBW.Seek(0, System.IO.SeekOrigin.Begin);
Deserialize(fileVersion, null);
}
/// <summary>
/// ページ情報を内部のMemoryStreamに貯めこみます。
/// </summary>
public bool Serialize(StrokeCollection strokeCollection) {
// 4 FOURCC "PAGE"
// 4 画像ファイル名バイト数fnBytes
// fnBytes 画像ファイル名
// 4 DrawObjの数dCount
// dCount個のDrawObj
// 4 inkCanvasの情報バイト数。
// inkCanvasの情報。
mBW.Write(FOURCC);
// mImgFilename文字列を保存します。
SaveLoad.SerializeString(mImgFilename, mBW);
// doList:廃止。
int dCount = 0;
mBW.Write(dCount);
// inkCanvasの情報書き込み。
using (var icMS = new System.IO.MemoryStream()) {
strokeCollection.Save(icMS);
int icBytes = (int)icMS.Length;
var icData = icMS.ToArray();
mBW.Write(icBytes);
mBW.Write(icData);
}
// Streamの有効データバイト数。
mStreamBytes = mBW.BaseStream.Position;
mBW.Seek(0, System.IO.SeekOrigin.Begin);
// ストリームをクローズするとmMemStreamが消えるのでクローズしない。
// このフォーマットのバージョンを保持。
mStreamFileVersion = SaveLoad.FILE_VERSION;
return true;
}
/// <summary>
/// 内部に蓄えられたMemoryStreamからDrawObjとImageFilenameを実体化します。
/// </summary>
/// <param name="inkCanvas">キャンバスに登録しない場合nullを指定します。</param>
public IEnumerable<DrawObj> Deserialize(int fileVersion, InkCanvas inkCanvas) {
if (0 <= fileVersion) {
// ストリームファイルバージョンを更新。
mStreamFileVersion = fileVersion;
} else {
// 最後にストリームを書き込んだ時のバージョン番号を使用。
fileVersion = mStreamFileVersion;
}
var r = new List<DrawObj>();
{
mBR.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
if (mBR.BaseStream.Length == 0) {
// 空である。
return r;
}
int fourcc = mBR.ReadInt32();
if (fourcc != FOURCC) {
// 読み出しエラー。
throw new FormatException("FOURCC mismatch");
}
// mImgFilename文字列を読み出します。
mImgFilename = SaveLoad.DeserializeString(mBR);
if (mImgFilename.StartsWith(mSaveDir)) {
// mImgFilenameがsaveDirを含む場合、loadDirに置き換えます。
mImgFilename = mImgFilename.Replace(mSaveDir, mLoadDir);
Console.WriteLine("img {0}", mImgFilename);
}
int dCount = mBR.ReadInt32();
for (int i=0; i<dCount; ++i) {
var d = DrawObjNew.Load(mBR);
r.Add(d);
}
if (6 <= fileVersion) {
// inkCanvasの情報読み出し。
int icBytes = mBR.ReadInt32();
var icData = mBR.ReadBytes(icBytes);
using (var icMS = new System.IO.MemoryStream(icData)) {
mStrokeCollection = new StrokeCollection(icMS);
if (inkCanvas != null) {
inkCanvas.Strokes = mStrokeCollection;
}
}
} else {
// inkCanvasの情報なし。
mStrokeCollection = new StrokeCollection();
}
mBR.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
}
return r;
}
}
}