reorganizing repo

git-svn-id: svn://ultimatepp.org/upp/trunk@9207 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2015-11-22 11:24:16 +00:00
parent e3e8d627f5
commit e29f8e4718
265 changed files with 0 additions and 69272 deletions

View file

@ -1,42 +0,0 @@
uniform sampler2D Texture;
uniform vec4 GlyphColor;
uniform vec4 GlowColor;
uniform vec4 OutlineColor;
uniform bool Outline;
uniform bool Glow;
uniform bool Shadow;
const float AlphaCenter = 0.5;
const float DistanceScale = 25.0;
uniform float OutlineCenter;
uniform float GlowCenter;
void main()
{
vec4 color = texture2D(Texture, gl_TexCoord[0].xy);
float alpha = color.a;
float width = min(length(fwidth(gl_TexCoord[0])), 1.0) * DistanceScale;
vec4 finalColor = GlyphColor;
float ma = smoothstep(AlphaCenter - width, AlphaCenter + width, alpha);
finalColor.a = ma;
if(Outline)
{
float mo = smoothstep(OutlineCenter - width, OutlineCenter + width, alpha);
finalColor = mix(OutlineColor, finalColor, ma);
finalColor.a = mo;
}
if(Glow && alpha >= finalColor.a - 0.5)
{
float mg = smoothstep(AlphaCenter, GlowCenter, sqrt(alpha));
finalColor = mix(GlowColor, finalColor, ma);
finalColor.a = mg;
}
gl_FragColor = finalColor * GlyphColor.a;
}

View file

@ -1,5 +0,0 @@
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}

View file

@ -1,51 +0,0 @@
uniform float sigma; // The sigma value for the gaussian function: higher value means more blur
// A good value for 9x9 is around 3 to 5
// A good value for 7x7 is around 2.5 to 4
// A good value for 5x5 is around 2 to 3.5
// ... play around with this based on what you need :)
uniform float blurSize; // This should usually be equal to
// 1.0f / texture_pixel_width for a horizontal blur, and
// 1.0f / texture_pixel_height for a vertical blur.
uniform sampler2D blurSampler; // Texture that will be blurred by this shader
const float numBlurPixelsPerSide = 3.0f;
// 9x9 - 4
// 7x7 - 3
// 5x5 - 2
uniform vec2 blurMultiplyVec;
// 1, 0 - vertical
// 0, 1 - horizontal
uniform vec3 gaussian;
uniform float grayStrength;
uniform float blurStrength;
void main() {
vec4 v = texture2D(blurSampler, gl_TexCoord[0].xy);
if(blurStrength > 0.0f)
{
vec4 avgValue = vec4(0.0f, 0.0f, 0.0f, 0.0f);
float coefficientSum = 0.0f;
vec3 incGaussian = gaussian;
avgValue += v * incGaussian.x;
coefficientSum += incGaussian.x;
incGaussian.xy *= incGaussian.yz;
for (float i = 1.0f; i <= numBlurPixelsPerSide; i++) {
vec2 pos = i * blurSize * blurMultiplyVec;
avgValue += texture2D(blurSampler, gl_TexCoord[0].xy - pos) * incGaussian.x;
avgValue += texture2D(blurSampler, gl_TexCoord[0].xy + pos) * incGaussian.x;
coefficientSum += 2.0f * incGaussian.x;
incGaussian.xy *= incGaussian.yz;
}
v = avgValue / coefficientSum;
}
float gray = dot(v.rgb, vec3(0.299, 0.587, 0.114));
vec4 grayColor = vec4(gray, gray, gray, v.a);
gl_FragColor = mix(v, grayColor, grayStrength);
}

View file

@ -1,5 +0,0 @@
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}

View file

@ -1,21 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlLib/CtrlLib.h>
NAMESPACE_UPP
void ChSysInit()
{
CtrlImg::Reset();
CtrlsImg::Reset();
ChReset();
}
void ChHostSkin()
{
ChSysInit();
}
END_UPP_NAMESPACE
#endif

View file

@ -1,238 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
static VectorMap<String, ClipData> fbClipboard;
void ClearClipboard()
{
GuiLock __;
fbClipboard.Clear();
}
void AppendClipboard(const char *format, const Value& data, String (*render)(const Value&))
{
GuiLock __;
ClipData& cd = fbClipboard.GetAdd(format);
cd.data = data;
cd.render = render;
}
static String sRawRender(const Value& v)
{
return v;
}
void AppendClipboard(const char *format, const String& data)
{
GuiLock __;
AppendClipboard(format, data, sRawRender);
}
void AppendClipboard(const char *format, const byte *data, int length)
{
GuiLock __;
AppendClipboard(format, String(data, length));
}
String ReadClipboard(const char *format)
{
GuiLock __;
int q = fbClipboard.Find(format);
return q >= 0 ? (*fbClipboard[q].render)(fbClipboard[q].data) : String();
}
void AppendClipboardText(const String& s)
{
AppendClipboard("text", ToSystemCharset(s));
}
void AppendClipboardUnicodeText(const WString& s)
{
AppendClipboard("wtext", (byte *)~s, 2 * s.GetLength());
}
const char *ClipFmtsText()
{
return "wtext;text";
}
String GetString(PasteClip& clip)
{
GuiLock __;
if(clip.Accept("wtext")) {
String s = ~clip;
return WString((const wchar *)~s, wstrlen((const wchar *)~s)).ToString();
}
if(clip.IsAvailable("text"))
return ~clip;
return Null;
}
WString GetWString(PasteClip& clip)
{
GuiLock __;
if(clip.Accept("wtext")) {
String s = ~clip;
return WString((const wchar *)~s, wstrlen((const wchar *)~s));
}
if(clip.IsAvailable("text"))
return (~clip).ToWString();
return Null;
}
bool AcceptText(PasteClip& clip)
{
return clip.Accept(ClipFmtsText());
}
static String sText(const Value& data)
{
return data;
}
static String sWText(const Value& data)
{
return Unicode__(WString(data));
}
void Append(VectorMap<String, ClipData>& data, const String& text)
{
data.GetAdd("text", ClipData(text, sText));
data.GetAdd("wtext", ClipData(text, sWText));
}
void Append(VectorMap<String, ClipData>& data, const WString& text)
{
data.GetAdd("text", ClipData(text, sText));
data.GetAdd("wtext", ClipData(text, sWText));
}
String GetTextClip(const WString& text, const String& fmt)
{
if(fmt == "text")
return text.ToString();
if(fmt == "wtext")
return Unicode__(text);
return Null;
}
String GetTextClip(const String& text, const String& fmt)
{
if(fmt == "text")
return text;
if(fmt == "wtext")
return Unicode__(text.ToWString());
return Null;
}
String ReadClipboardText()
{
String w = ReadClipboard("text");
return w.GetCount() ? w : ReadClipboardUnicodeText().ToString();
}
WString ReadClipboardUnicodeText()
{
String w = ReadClipboard("wtext");
if(w.GetCount())
return WString((const wchar *)~w, w.GetLength() / 2);
return ReadClipboard("text").ToWString();
}
bool IsClipboardAvailable(const char *id)
{
return fbClipboard.Find(id) >= 0;
}
bool IsClipboardAvailableText()
{
return IsClipboardAvailable("text") || IsClipboardAvailable("wtext");
}
const char *ClipFmtsImage()
{
static const char *q;
ONCELOCK {
static String s = "dib;" + ClipFmt<Image>();
q = s;
}
return q;
}
bool AcceptImage(PasteClip& clip)
{
GuiLock __;
return clip.Accept(ClipFmtsImage());
}
Image GetImage(PasteClip& clip)
{
GuiLock __;
Image m;
if(Accept<Image>(clip)) {
LoadFromString(m, ~clip);
if(!m.IsEmpty())
return m;
}
return Null;
}
Image ReadClipboardImage()
{
GuiLock __;
PasteClip d = Ctrl::Clipboard();
return GetImage(d);
}
String sImage(const Value& image)
{
Image img = image;
return StoreAsString(const_cast<Image&>(img));
}
String GetImageClip(const Image& img, const String& fmt)
{
GuiLock __;
if(img.IsEmpty()) return Null;
if(fmt == ClipFmt<Image>())
return sImage(img);
return Null;
}
void AppendClipboardImage(const Image& img)
{
GuiLock __;
if(img.IsEmpty()) return;
AppendClipboard(ClipFmt<Image>(), img, sImage);
}
bool AcceptFiles(PasteClip& clip)
{
if(clip.Accept("files")) {
clip.SetAction(DND_COPY);
return true;
}
return false;
}
bool IsAvailableFiles(PasteClip& clip)
{
return clip.IsAvailable("files");
}
Vector<String> GetFiles(PasteClip& clip)
{
GuiLock __;
Vector<String> f;
return f;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,199 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "Console.h"
NAMESPACE_UPP
void Console::Paint(Draw& w)
{
Size sz = GetSize();
#ifndef COLOR_ALPHA
SystemDraw& sw = (SystemDraw&) w;
sw.alpha = 100.f;
Color frame = Yellow;
Color body = Black;
#else
Color frame = Yellow().Alpha(100);
Color body = Black().Alpha(100);
#endif
w.DrawRect(sz, body);
w.DrawRect(0, 0, sz.cx, 1, frame);
w.DrawRect(sz.cx - 1, 1, 1, sz.cy - 1, frame);
w.DrawRect(0, 1, 1, sz.cy, frame);
w.DrawRect(1, sz.cy - 1, sz.cx - 2, 1, frame);
//DrawFrame(w, sz, Yellow);
//w.DrawImage(sz.cx - 18, sz.cy - 21, LinuxGlImg::ResizeMarker());
w.DrawRect(1, sz.cy - 22, sz.cx - 2, 1, frame);
w.Clip(5, 5, sz.cx - 10, sz.cy - 5 - 21);
#ifndef COLOR_ALPHA
sw.alpha = 255.f;
#endif
int y = 5;
//int ty = Draw::GetStdFontCy() + 2;
int ty = 12 + 2;
for(int i = 0; i < fixedText.GetCount(); i++)
{
w.DrawText(5, y, fixedText[i].text, StdFont(), fixedText[i].ink);
y += ty;
}
if(fixedText.GetCount() > 0 && floatText.GetCount() > 0)
{
#ifndef COLOR_ALPHA
sw.alpha = 150.f;
#endif
w.DrawRect(5, y, sz.cx - 10, 1, frame);
#ifndef COLOR_ALPHA
sw.alpha = 255.f;
#endif
y += 2;
}
int lines = (sz.cy - y - 22) / ty;
int n = fceil(sb.GetPos() / double(ty));
int maxn = min(n + lines, currLine);
while(n < maxn)
{
LineInfo& lf = floatText[n];
w.DrawText(5, y, lf.text, StdFont(), lf.ink);
y += ty;
++n;
}
w.End();
}
void Console::Log(int line, const char* text, Color ink)
{
LineInfo& lf = fixedText.GetAdd(line);
lf.ink = ink;
lf.text = text;
}
void Console::Log(const char* text, Color ink)
{
bool isend = sb.IsEnd();
if(++currLine >= maxLine)
{
currLine = maxLine;
for(int i = 0; i < maxLine - 1; i++)
floatText[i] = floatText[i + 1];
}
int ty = Draw::GetStdFontCy() + 2;
int total = currLine * ty;
int fcnt = fixedText.GetCount();
sb.SetTotal(total + 5 + 22);
if(isend)
sb.GoEnd();
LineInfo& lf = floatText[currLine - 1];
lf.ink = ink;
lf.text = text;
}
void Console::LeftDown(Point p, dword keys)
{
SetCapture();
pos = p;
rs = GetSize();
tl = GetScreenRect().TopLeft();
Size sz = GetSize();
resize = p.x > sz.cx - 18 && p.y > sz.cy - 18;
}
void Console::LeftUp(Point p, dword keys)
{
ReleaseCapture();
}
void Console::MouseMove(Point p, dword keys)
{
if(HasCapture())
{
Rect r = GetRect();
bool isend = sb.IsEnd();
if(resize)
{
tl = Point(p.x - pos.x, p.y - pos.y);
SetConsoleRect(r.left, r.top, max(2, rs.cx + tl.x), max(2, rs.cy + tl.y));
}
else
{
tl += Point(p.x - pos.x, p.y - pos.y);
SetConsoleRect(tl.x, tl.y, r.Width(), r.Height());
}
if(isend)
sb.GoEnd();
}
}
void Console::Layout()
{
}
void Console::SetConsoleRect(int x, int y, int cx, int cy)
{
int width = cx < 0 ? 300 : cx;
int height = cy < 0 ? 5 + 5 + (Draw::GetStdFontCy() + 2) * 30 + 3 : cy;
SetRect(x, y, width, height);
}
void Console::SetLines(int lines)
{
maxLine = lines;
floatText.SetCount(lines);
}
void Console::Init(Ctrl& parent)
{
if(!init)
return;
init = false;
this->parent = &parent;
SetConsoleRect(parent.GetSize().cx - 5 - 300, 5);
sb.SetFrameSize(5, false).SetAlign(AlignedFrame::RIGHT);
Show();
}
void Console::Show(bool b)
{
if(IsOpen())
{
if(!b)
Close();
}
else
{
if(b)
PopUp(parent, true, false);
}
}
void Console::Clear()
{
currLine = 0;
sb.Clear();
}
Console::Console() : init(true), resize(false)
{
Add(sb.RightPos(2, 7).VSizePos(2, 22));
Add(clear.LeftPos(2, 50).BottomPos(2, 18));
clear.SetLabel("Clear");
//clear.bg = Yellow;
//clear.alpha = 150.f;
clear <<= THISBACK(Clear);
SetLines(3000);
currLine = 0;
scrollLine = 0;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,51 +0,0 @@
#ifndef _CoreGl_Console_h_
#define _CoreGl_Console_h_
#include "ControlPanel.h"
#include "Scrollbar.h"
NAMESPACE_UPP
struct Console : Ctrl
{
Ctrl* parent;
SlimScrollBar sb;
SlimButton clear;
struct LineInfo : Moveable<LineInfo> {
Color ink;
String text;
};
bool init;
bool resize;
Point pos;
Point tl;
Size rs;
int currLine;
int scrollLine;
int maxLine;
VectorMap<int, LineInfo> fixedText;
Vector<LineInfo> floatText;
void Init(Ctrl& parent);
void SetConsoleRect(int x, int y, int cx = -1, int cy = -1);
virtual void Paint(Draw& w);
virtual void LeftDown(Point p, dword keys);
virtual void LeftUp(Point p, dword keys);
virtual void MouseMove(Point p, dword keys);
virtual void Layout();
void Log(int line, const char* text, Color ink = White);
void Log(const char* text, Color ink = White);
void SetLines(int lines);
void Show(bool b = true);
void Clear();
typedef Console CLASSNAME;
Console();
};
END_UPP_NAMESPACE
#endif

View file

@ -1,211 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "ControlPanel.h"
NAMESPACE_UPP
ValueSlider::ValueSlider()
{
pos = 0;
shaded = true;
immediate = false;
src = Color(255, 255, 0);
dst = Color(255, 153, 51);
}
void ValueSlider::Paint(Draw &w)
{
Size sz = GetSize();
/*w.DrawRect(0, 0, sz.cx, 1, Black);
w.DrawRect(0, sz.cy - 1, sz.cx, 1, Black);
w.DrawRect(0, 0, 1, sz.cy, Black);
w.DrawRect(sz.cx - 1, 0, 1, sz.cy, Black);*/
int t = (int) (((pos - minValue) * sz.cx) / (maxValue - minValue));
if(t < 1) t = 1;
if(t > sz.cx - 1) t = sz.cx - 1;
if(shaded)
{
for(int i = 1; i < t; i++)
w.DrawRect(i, 1, 1, sz.cy - 2, Blend(src, dst, 256 * i / (sz.cx - 1)));
}
else
{
w.DrawRect(Rect(1, 1, t, sz.cy - 1), dst);
}
if(t < sz.cx - 1)
w.DrawRect(Rect(t, 1, sz.cx - 1, sz.cy - 1), Color(245, 245, 255));
String s = Format("%s : %.2f", text, pos);
Size tsz = GetTextSize(s, StdFont());
w.DrawText((sz.cx - tsz.cx) / 2, (sz.cy - tsz.cy) / 2, s);
}
void ValueSlider::LeftDown(Point p, dword keyflags)
{
pos = minValue + (p.x * (maxValue - minValue)) / (float) GetSize().cx;
Refresh();
SetCapture();
if(immediate)
WhenAction();
}
void ValueSlider::LeftUp(Point p, dword keyflags)
{
ReleaseCapture();
if(!immediate)
WhenAction();
}
void ValueSlider::MouseMove(Point p, dword keyflags)
{
if(HasCapture())
{
pos = minValue + (p.x * (maxValue - minValue)) / (float) GetSize().cx;
if(pos > maxValue) pos = maxValue;
if(pos < minValue) pos = minValue;
Refresh();
if(immediate)
WhenAction();
}
}
void ValueSlider::SetPos(float p, float minv, float maxv)
{
pos = p;
minValue = minv;
maxValue = maxv;
Refresh();
}
float ValueSlider::GetPos()
{
return pos;
}
void SlimButton::Paint(Draw &w)
{
SystemDraw& sw = (SystemDraw&) w;
float a = sw.alpha;
sw.alpha = alpha;
Size sz = GetSize();
if(HasMouseIn(sz))
w.DrawRect(sz, bg);
sw.alpha = a;
Size tsz = GetTextSize(label, StdFont());
w.DrawText((sz.cx - tsz.cx) / 2, (sz.cy - tsz.cy) / 2, label, StdFont(), fg);
}
void SlimButton::LeftDown(Point p, dword keyflags)
{
SetCapture();
}
void SlimButton::LeftUp(Point p, dword keyflags)
{
ReleaseCapture();
Action();
}
void SlimButton::MouseMove(Point p, dword keyflags)
{
}
void SlimButton::SetLabel(const char* s)
{
label = s;
}
SlimButton::SlimButton()
{
fg = White;
bg = Black;
alpha = 255.f;
}
InfoPanel::InfoPanel() : init(true), parent(NULL)
{
Add(alphaSlider.RightPos(199, 100).VSizePos(1, 0));
Add(angleSlider.RightPos(100, 100).VSizePos(1, 0));
Add(scaleSlider.RightPos(1, 100).VSizePos(1, 0));
alphaSlider.text = "Alpha";
angleSlider.text = "Angle";
scaleSlider.text = "Scale";
alphaSlider.shaded = true;
angleSlider.shaded = true;
scaleSlider.shaded = true;
alphaSlider.immediate = true;
angleSlider.immediate = true;
scaleSlider.immediate = true;
alphaSlider.SetPos(255.f, 0.f, 255.f);
angleSlider.SetPos(0.f, 0.f, 360.f);
scaleSlider.SetPos(1.f, 1.f, 5.f);
}
void InfoPanel::Paint(Draw& w)
{
Size sz = GetSize();
Size wsz = screenRect.GetSize();
Color frameColor = Color(183, 183, 183);
Color bgColor = Color(102, 102, 102);
w.DrawRect(sz, bgColor);
w.DrawRect(0, 0, 1, sz.cy, frameColor);
w.DrawRect(0, 0, sz.cx, 1, frameColor);
w.DrawRect(sz.cx - 1, 0, 1, sz.cy, frameColor);
String info = Format("FPS: %.2f, Textures: %d (%d), Size: %d, %d", GetFps(), resources.textures.GetCount(), resources.bindedTextures, wsz.cx, wsz.cy);
w.DrawText(5, sz.cy - 18, info, StdFont(), White);
}
void InfoPanel::Init(Ctrl& parent, float angle, float scale, float alpha)
{
const int width = 585;
SetRect((screenRect.Width() - width) / 2, screenRect.Height() - 22, width, 22);
if(!init)
return;
init = false;
this->parent = &parent;
Show();
alphaSlider.SetPos(alpha, 0.f, 255.f);
angleSlider.SetPos(angle, 0.f, 360.f);
scaleSlider.SetPos(scale, 1.f, 5.f);
}
void InfoPanel::Show(bool b)
{
if(IsOpen())
{
if(!b)
Close();
}
else
{
if(b)
PopUp(parent, true, false);
}
}
float InfoPanel::GetAlpha()
{
return alphaSlider.GetPos();
}
float InfoPanel::GetAngle()
{
return angleSlider.GetPos();
}
float InfoPanel::GetScale()
{
return scaleSlider.GetPos();
}
END_UPP_NAMESPACE
#endif

View file

@ -1,71 +0,0 @@
#ifndef _rainbow_CoreGl_ControlPanel_h_
#define _rainbow_CoreGl_ControlPanel_h_
#include <CtrlLib/CtrlLib.h>
NAMESPACE_UPP
struct ValueSlider : Ctrl
{
bool shaded;
bool immediate;
Color src;
Color dst;
float pos;
float minValue;
float maxValue;
String text;
typedef ValueSlider CLASSNAME;
ValueSlider();
virtual void Paint(Draw &w);
virtual void LeftDown(Point p, dword keyflags);
virtual void LeftUp(Point p, dword keyflags);
virtual void MouseMove(Point p, dword keyflags);
void SetPos(float p, float minValue, float maxValue);
float GetPos();
Callback WhenLeftUp;
};
struct SlimButton : Ctrl
{
Color fg;
Color bg;
float alpha;
String label;
virtual void Paint(Draw &w);
virtual void LeftDown(Point p, dword keyflags);
virtual void LeftUp(Point p, dword keyflags);
virtual void MouseMove(Point p, dword keyflags);
void SetLabel(const char* s);
SlimButton();
};
struct InfoPanel : Ctrl
{
bool init;
Ctrl* parent;
ValueSlider alphaSlider;
ValueSlider angleSlider;
ValueSlider scaleSlider;
float GetAlpha();
float GetAngle();
float GetScale();
void Init(Ctrl& parent, float angle = 0.f, float scale = 1.f, float alpha = 255.f);
void Show(bool b = true);
virtual void Paint(Draw& w);
typedef InfoPanel CLASSNAME;
InfoPanel();
};
END_UPP_NAMESPACE
#endif

View file

@ -1,305 +0,0 @@
#ifndef _CoreGl_CoreGl_h_
#define _CoreGl_CoreGl_h_
#ifndef GLEW_STATIC
#define GLEW_STATIC
#endif
#define DRAW_ON_TIMER 0
#define DRAW_ON_IDLE 1
#define DRAW_ON_EVENT 2
#define CLIP_MODE 2
/*
0 - Scissor clip
1 - Plane clip
2 - Stencil clip
3 - Manual clip
*/
#include "Gl.h"
#include <Painter/Painter.h>
#include "Shaders.h"
#include "Fbo.h"
NAMESPACE_UPP
struct FrameInfo {
int64 curr_tick_count;
float fps;
float frame_factor;
float frame_skip;
int64 frame_time;
FrameInfo() : fps(0.f), frame_factor(1.f), frame_skip(60.f), frame_time(0), curr_tick_count(0)
{}
};
extern FrameInfo frameInfo;
float GetFps();
#define IMAGECLASS CoreGlImg
#define IMAGEFILE <CoreGl/CoreGl.iml>
#include <Draw/iml_header.h>
#include "Resources.brc"
typedef Rect_<float> RectF;
typedef Point_<float> PointF;
#include "FontGl.h"
#include "ResGl.h"
enum TransformState {
TS_BEFORE_CTRL_PAINT,
TS_AFTER_CTRL_PAINT,
TS_BEFORE_PAINT,
TS_AFTER_PAINT,
TS_BEFORE_SCREEN,
TS_AFTER_SCREEN
};
#define TEXEL_OFFSET 0.325f
class SystemDraw : public Draw {
public:
virtual dword GetInfo() const;
virtual Size GetPageSize() const;
bool CanSetSurface() { return false; }
void PlaneEquation(double eq[4], float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3);
void SetClipRect(const Rect& r);
void ScissorClip(const Rect& r);
void PlaneClip(const Rect& r);
void StencilClip(const Rect& r, int mode = 0, bool exlude = false);
void SetClip(const Rect& r, int mode = 0, bool exclude = false);
virtual void BeginOp();
virtual void EndOp();
virtual void OffsetOp(Point p);
virtual bool ClipOp(const Rect& r);
virtual bool ClipoffOp(const Rect& r);
virtual bool ExcludeClipOp(const Rect& r);
virtual bool IntersectClipOp(const Rect& r);
virtual bool IsPaintingOp(const Rect& r) const;
virtual Rect GetPaintRect() const;
virtual void DrawRectOp(int x, int y, int cx, int cy, Color color);
virtual void DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color);
virtual void DrawImageOp(float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, const Image& img, const Rect& src, Color color);
virtual void DrawTextureOp(const RectF& r, int textureId, int width, int height, const RectF& src);
virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color);
virtual void DrawPolyPolylineOp(const Point *vertices, int vertex_count,
const int *counts, int count_count,
int width, Color color, Color doxor);
virtual void DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count,
const int *subpolygon_counts, int scc,
const int *disjunct_polygon_counts, int dpcc,
Color color, int width, Color outline,
uint64 pattern, Color doxor);
virtual void DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color);
virtual void DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor);
virtual void DrawTextOp(int x, int y, int angle, const wchar *text, Font font,
Color ink, int n, const int *dx);
virtual Size GetNativeDpi() const;
virtual void BeginNative();
virtual void EndNative();
virtual int GetCloffLevel() const;
void Text(int x, int y, int angle, const wchar *text, Font font, Color ink,
int outlineStrength, Color outlineColor,
int glowStrength, Color glowColor,
int n, const int *dx);
void ImageColoring(bool b = true) { image_coloring = b; }
RectF UnProject(const RectF& r, float& depth);
void UnProject(float* vtx, float sx, float sy, float dx, float dy);
void UnProject(float& x, float& y, float &z);
void SetVtx(float* vtx, float sx, float sy, float dx, float dy);
void SetProjectionMode(int mode);
bool IsPerspectiveProjection() { return projection_mode == 1; }
bool IsOrthogonalProjection() { return projection_mode == 0; }
private:
static SystemDraw* systemDraw;
friend class FontInfo;
friend class Font;
OpenGLFont fi;
struct Cloff : Moveable<Cloff> {
bool clipping;
bool exclude;
Point org;
Rect drawing_clip;
};
struct MatrixStack : Moveable<MatrixStack>
{
double projection_matrix[16];
double modelview_matrix[16];
int projection_mode;
};
float current_color[4];
float vtx[8];
float crd[8];
double projection_matrix[16];
void SetVec(float* v, float sx, float sy, float dx, float dy);
void SetVec(float* v, int sx, int sy, int dx, int dy);
void SaveCurrentColor();
void RestoreLastColor();
public:
Rect drawing_clip;
Size drawing_size;
Point drawing_offset;
Rect clip;
float r, g, b, a;
float alpha;
float angle;
float scale;
static float blurStrength;
static float grayStrength;
private:
Array<Cloff> cloff;
Array<MatrixStack> mstack;
int ci;
int cn;
int cd;
int mi;
bool image_coloring;
int projection_mode;
void Reset();
protected:
SystemDraw();
void InitClip(const Rect& clip);
void Init();
public:
static SystemDraw& Get() { return *systemDraw; }
static void Flush() { /*glFlush();*/ }
Point GetOffset() const { return drawing_offset; }
SystemDraw(Size sz);
virtual ~SystemDraw();
void ViewPort(int width = -1, int height = -1);
void OrthogonalView(bool clear_modelview = true);
void PerspectiveView(bool clear_modelview = true);
void ApplyTransforms();
void Clear(bool ontransforms = false);
void PushContext();
void PopContext();
float GetAspect() { return drawing_size.cx / (float) drawing_size.cy; };
};
struct BackDraw__ : public SystemDraw {
BackDraw__() {}
};
class BackDraw : public BackDraw__ { // Dummy only, as we are running in GlobalBackBuffer mode
Size size;
Draw *painting;
Point painting_offset;
ImageBuffer ib;
public:
virtual bool IsPaintingOp(const Rect& r) const;
public:
void Put(SystemDraw& w, int x, int y) {}
void Put(SystemDraw& w, Point p) { Put(w, p.x, p.y); }
void Create(SystemDraw& w, int cx, int cy) {}
void Create(SystemDraw& w, Size sz) { Create(w, sz.cx, sz.cy); }
void Destroy() {}
void SetPaintingDraw(Draw& w, Point off) { painting = &w; painting_offset = off; }
BackDraw();
~BackDraw();
};
struct ImageDraw__ {
ImageBuffer image;
ImageBuffer alpha;
ImageDraw__(int cx, int cy) : image(cx, cy), alpha(cx, cy) {}
};
class ImageDraw : private ImageDraw__, public BufferPainter {
BufferPainter alpha_painter;
bool has_alpha;
Image Get(bool pm) const;
public:
Draw& Alpha();
operator Image() const { return Get(true); }
Image GetStraight() const { return Get(false); }
ImageDraw(Size sz);
ImageDraw(int cx, int cy);
};
void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rect& clip, int n, Color color, int type, int animation);
class PrinterJob { // Dummy only...
NilDraw nil;
Vector<int> pages;
public:
Draw& GetDraw() { return nil; }
operator Draw&() { return GetDraw(); }
const Vector<int>& GetPages() const { return pages; }
int operator[](int i) const { return 0; }
int GetPageCount() const { return 0; }
bool Execute() { return false; }
PrinterJob& Landscape(bool b = true) { return *this; }
PrinterJob& MinMaxPage(int minpage, int maxpage) { return *this; }
PrinterJob& PageCount(int n) { return *this; }
PrinterJob& CurrentPage(int currentpage) { return *this; }
PrinterJob& Name(const char *_name) { return *this; }
PrinterJob(const char *name = NULL) {}
~PrinterJob() {}
};
class TopWindowFrame;
struct InfoPanel;
struct Console;
void GlLog(int line, const char* text, Color ink = White);
void GlLog(const char* text, Color ink = White);
void GlLogF(Color ink, const char* fmt, ...);
void GlLogF(const char* fmt, ...);
#define GUIPLATFORM_CTRL_TOP_DECLS Ctrl *owner_window;
#define GUIPLATFORM_CTRL_DECLS_INCLUDE <CoreGl/Ctrl.h>
#define GUIPLATFORM_PASTECLIP_DECLS \
bool dnd; \
friend struct DnDLoop;
#define GUIPLATFORM_TOPWINDOW_DECLS_INCLUDE <CoreGl/Top.h>
#ifdef flagLINUXGL
#define GUIPLATFORM_INCLUDE_AFTER <LinuxGl/After.h>
#endif
#ifdef flagWINGL
#define GUIPLATFORM_INCLUDE_AFTER <WinGl/After.h>
#endif
END_UPP_NAMESPACE
#endif

View file

@ -1,60 +0,0 @@
PREMULTIPLIED
IMAGE_ID(arrow)
IMAGE_ID(ibeam)
IMAGE_ID(wait)
IMAGE_ID(no)
IMAGE_ID(sizeall)
IMAGE_ID(sizehorz)
IMAGE_ID(sizeright)
IMAGE_ID(sizeleft)
IMAGE_ID(sizevert)
IMAGE_ID(sizetopleft)
IMAGE_ID(sizetop)
IMAGE_ID(sizetopright)
IMAGE_ID(sizebottomleft)
IMAGE_ID(sizebottom)
IMAGE_ID(sizebottomright)
IMAGE_ID(overlap)
IMAGE_ID(maximize)
IMAGE_ID(close)
IMAGE_ID(bgtitle)
IMAGE_ID(title)
IMAGE_ID(border)
IMAGE_ID(hand)
IMAGE_ID(ResizeMarker)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,90,205,75,85,65,20,159,50,211,66,9,137,118,46,218,180,233,79,136,160,109,203,192,130,32,218,228,34,90)
IMAGE_DATA(180,171,69,148,249,130,136,32,66,131,44,9,75,203,2,53,107,241,54,34,42,234,194,15,4,63,240,3,30,162,8,34)
IMAGE_DATA(136,136,160,43,221,157,230,61,223,199,120,238,220,51,231,204,187,207,10,238,25,14,58,119,126,191,51,103,126,231,220,123)
IMAGE_DATA(159,31,170,74,93,80,105,59,173,78,164,191,128,146,25,8,57,0,32,226,192,193,193,69,216,223,191,196,229,192,222,222)
IMAGE_DATA(21,216,221,189,6,59,59,215,57,28,216,222,190,1,91,91,55,97,115,243,14,172,175,215,187,56,176,177,81,175,113,247)
IMAGE_DATA(97,109,237,33,172,174,62,130,84,234,41,197,129,149,149,199,176,188,252,68,227,26,97,113,241,21,204,207,191,133,217,217)
IMAGE_DATA(230,48,14,44,45,189,132,133,133,215,48,55,215,4,51,51,173,48,53,213,9,147,147,223,97,98,162,221,198,209,152,102)
IMAGE_DATA(152,158,126,175,113,109,48,62,222,13,35,35,35,89,255,5,195,195,157,152,163,99,181,106,92,27,140,141,117,194,232,232)
IMAGE_DATA(239,60,94,21,106,105,114,52,230,179,246,14,24,26,250,1,131,131,63,161,191,63,73,158,119,96,160,29,250,250,190,230)
IMAGE_DATA(227,36,147,221,36,62,153,252,18,200,177,171,235,91,168,62,54,13,58,58,62,81,120,235,190,45,45,239,68,125,216,212)
IMAGE_DATA(244,70,220,235,137,196,115,209,30,13,13,207,196,123,8,176,65,43,87,231,212,73,85,145,113,133,10,175,50,55,235,161)
IMAGE_DATA(161,239,243,155,163,249,127,127,45,228,188,1,93,84,149,22,174,92,139,86,126,84,56,174,103,56,181,61,31,72,55,176)
IMAGE_DATA(199,129,39,57,22,108,40,135,192,6,56,12,108,158,35,193,250,228,226,115,86,31,45,255,66,125,101,253,89,163,71,101)
IMAGE_DATA(118,80,194,89,156,107,220,155,132,195,47,102,93,146,103,177,252,64,1,25,49,236,79,31,127,126,88,94,82,62,55,134)
IMAGE_DATA(100,221,181,7,39,71,234,156,148,185,52,150,240,109,57,73,122,197,118,205,151,207,141,227,115,223,249,220,183,174,88,118)
IMAGE_DATA(99,62,144,14,163,6,95,239,34,51,95,255,197,240,115,46,141,131,249,62,113,192,48,52,117,198,192,56,155,30,84,172)
IMAGE_DATA(48,60,231,154,121,29,231,109,59,11,198,98,190,143,219,226,248,228,17,149,30,81,213,197,22,203,118,22,23,23,239,143)
IMAGE_DATA(93,18,195,22,71,202,199,113,124,249,40,14,109,53,250,99,127,165,42,203,56,38,187,2,80,24,238,33,194,112,84,211)
IMAGE_DATA(218,76,169,227,191,121,56,121,68,165,135,185,238,85,151,184,208,113,161,253,2,50,19,118,225,138,21,216,188,230,227,182)
IMAGE_DATA(56,62,121,68,165,135,185,238,85,151,10,93,234,178,108,169,45,27,178,19,193,194,186,4,183,9,132,230,206,131,255,235)
IMAGE_DATA(107,212,249,40,93,40,61,57,185,24,235,5,171,214,227,116,118,4,50,65,162,19,1,201,164,92,28,23,190,88,14,22)
IMAGE_DATA(219,197,193,197,226,238,23,182,119,177,60,73,29,36,103,53,121,170,132,181,240,237,17,107,47,198,79,166,210,173,81,231)
IMAGE_DATA(163,116,161,244,228,228,98,172,23,204,124,50,81,22,200,18,21,132,216,236,88,159,66,92,14,22,223,197,161,10,201,197)
IMAGE_DATA(227,117,28,75,146,3,7,111,114,212,49,235,207,205,77,218,83,113,195,198,13,91,18,14,55,55,113,195,198,175,210,210)
IMAGE_DATA(173,81,231,163,116,161,244,228,228,98,172,23,44,254,144,31,228,224,98,113,247,11,219,187,88,158,164,14,146,179,154,60)
IMAGE_DATA(85,194,90,248,246,136,181,23,171,244,136,200,172,119,154,225,54,60,21,203,23,207,201,3,227,93,123,70,133,231,232,83)
IMAGE_DATA(42,93,204,107,146,58,241,45,130,102,114,37,39,17,203,134,137,241,209,227,37,245,226,91,20,79,166,171,213,213,161,155)
IMAGE_DATA(227,181,244,60,231,54,172,109,205,118,157,138,131,215,93,216,48,14,133,149,226,37,249,72,206,235,171,39,149,39,117,14)
IMAGE_DATA(210,78,233,145,179,186,186,86,184,253,160,23,238,190,232,133,123,31,123,65,58,207,7,43,203,252,109,38,1,103,46,247)
IMAGE_DATA(192,249,91,75,80,219,152,126,9,11,231,233,54,47,215,35,251,179,44,247,126,58,242,230,119,153,249,255,212,185,57,229)
IMAGE_DATA(137,68,34,198,151,8,159,155,187,220,167,23,50,205,228,248,197,8,245,233,5,227,32,149,74,29,249,26,134,197,56,3)
IMAGE_DATA(111,253,4,18,134,71,251,228,99,112,241,46,156,13,159,115,41,62,204,209,153,165,120,39,135,210,148,137,229,225,207,234)
IMAGE_DATA(225,99,250,161,6,148,199,56,26,199,177,63,147,104,81,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(1056, 23)

View file

@ -1,57 +0,0 @@
uses
Painter;
options(WIN32) "-D_WIN32 -DGLEW_STATIC";
file
Gl.h,
CoreGl.h,
FontGl.h,
ResGl.h,
ControlPanel.h,
ControlPanel.cpp,
Scrollbar.h,
Scrollbar.cpp,
Console.h,
Console.cpp,
Draw.cpp,
DrawOp.cpp,
DrawText.cpp,
Clip.cpp,
Ctrl.h,
Ctrl.cpp,
Dnd.cpp,
Event.cpp,
Wnd.cpp,
Image.cpp,
Top.h,
Top.cpp,
TopFrame.h,
TopFrame.cpp,
ChSysInit.cpp,
Util.cpp,
Glew readonly separator,
glew.h,
glxew.h,
wglew.h,
glew.c,
SceneGraph readonly separator,
SceneGraph.h,
SceneGraph.cpp,
Resources readonly separator,
Resources.cpp,
Resources.brc,
Fbo.h,
Fbo.cpp,
Shaders.h,
Shaders.cpp,
AlphaMag.vert,
AlphaMag.frag,
Blur.vert,
Blur.frag,
Fonts/TahomaB.fnt,
Fonts/TahomaB_0.png,
Fonts/TahomaN.fnt,
Fonts/TahomaN_0.png,
CoreGl.iml;

View file

@ -1,97 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
#define LLOG(x) // DLOG(x)
NAMESPACE_UPP
int Ctrl::Xbuttons;
int Ctrl::Xbuttontime;
Point Ctrl::Xbuttonpos;
void Ctrl::GuiPlatformConstruct()
{
cliptobounds = true;
}
void Ctrl::GuiPlatformRemove()
{
}
void Ctrl::GuiPlatformGetTopRect(Rect& r) const
{
}
bool Ctrl::GuiPlatformRefreshFrameSpecial(const Rect& r)
{
return true;
}
bool Ctrl::GuiPlatformSetFullRefreshSpecial()
{
return false;
}
void Ctrl::PaintCaret(SystemDraw& w)
{
}
String GuiPlatformGetKeyDesc(dword key)
{
return Null;
}
void Ctrl::GuiPlatformSelection(PasteClip&)
{
}
void GuiPlatformAdjustDragImage(ImageBuffer&)
{
}
bool GuiPlatformHasSizeGrip()
{
return true;
}
void GuiPlatformGripResize(TopWindow *q)
{
q->GripResize();
}
Color GuiPlatformGetScreenPixel(int x, int y)
{
return Black;
}
void GuiPlatformAfterMenuPopUp()
{
}
void Ctrl::InstallPanicBox()
{
}
void Ctrl::ApplyLayout()
{
GuiLock __;
for(Ctrl *q = GetFirstChild(); q; q = q->GetNext())
q->ApplyLayout();
}
String Ctrl::Name() const {
GuiLock __;
#ifdef CPU_64
String s = String(typeid(*this).name()) + " : 0x" + FormatIntHex(this);
#else
String s = String(typeid(*this).name()) + " : " + Format("0x%x", (int) this);
#endif
if(IsChild())
s << "(parent " << String(typeid(*parent).name()) << ")";
return s;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,83 +0,0 @@
//$ class Ctrl {
static Ptr<Ctrl> desktop;
static Vector<Ctrl *> topctrl;
static InfoPanel infoPanel;
static float angle;
static float scale;
static float alpha;
static Point glCursorPos;
static Image glCursorImage;
static Rect glCaretRect;
static int glCaretTm;
static int64 glEventLoop;
static int64 glEndSessionLoop;
bool cliptobounds:1;
int FindTopCtrl() const;
static void SyncTopWindows();
void DestroyWnd();
void NewTop() { top = new Top; top->owner_window = NULL; }
void PutForeground();
static void MouseEventGl(Ptr<Ctrl> t, int event, Point p, int zdelta);
static void DrawLine(const Vector<Rect>& clip, int x, int y, int cx, int cy, bool horz,
const byte *pattern, int animation);
static void DragRectDraw0(const Vector<Rect>& clip, const Rect& rect, int n,
const byte *pattern, int animation);
friend class TopWindowFrame;
friend class SystemDraw;
friend struct DnDLoop;
void SetOpen(bool b) { isopen = b; }
protected:
static int PaintLock;
public:
static int Xbuttons;
static int Xbuttontime;
static Point Xbuttonpos;
static Console console;
static Rect screenRect;
static bool screenReady;
static void InitGl();
static void ExitGl();
static void EndSession();
static bool DoMouseGl(Ctrl* q, int event, Point p, int zdelta);
static void DoMouseGl(int event, Point p, int zdelta = 0);
static bool DoKeyGl(dword key, int cnt);
static void CursorSync(Draw& w);
static void MouseSync(Draw& w);
static void SetDesktop(Ctrl& q);
static Ctrl *GetDesktop() { return desktop; }
static void SetWindowSize(Size sz);
static Size GetScreenSize() { return screenRect.GetSize(); }
static dword GetCaretTm() { return glCaretTm; }
static void ResetCaretTm() { glCaretTm = GetTickCount(); }
static void DrawScreen();
Ctrl& ClipToBounds(bool b = true) { cliptobounds = b; return *this; }
bool IsClipToBounds() const { return cliptobounds; }
virtual void ApplyTransform(TransformState state) {}
virtual void PostPaint(Draw& w) {}
virtual void ApplyLayout();
void DragRectDraw(const Rect& rect1, const Rect& rect2, const Rect& clip, int n,
Color color, int type, int animation);
static Ctrl *FindMouseTopCtrl();
enum { DRAWDRAGRECT_SCREEN = 0x8000 };
//$ };

View file

@ -1,150 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
// --------------------------------------------------------------------------------------------
Ptr<Ctrl> sDnDSource;
Ctrl * Ctrl::GetDragAndDropSource()
{
return sDnDSource;
}
struct DnDLoop : LocalLoop {
const VectorMap<String, ClipData> *data;
Vector<String> fmts;
Image move, copy, reject;
Ptr<Ctrl> target;
int action;
byte actions;
void Sync();
String GetData(const String& f);
void DnD(bool paste);
virtual void LeftUp(Point, dword);
virtual bool Key(dword, int);
virtual void MouseMove(Point p, dword);
virtual Image CursorImage(Point, dword);
};
Ptr<DnDLoop> dndloop;
bool PasteClip::IsAvailable(const char *fmt) const
{
GuiLock __;
return dnd ? dndloop && FindIndex(dndloop->fmts, fmt) >= 0
: IsClipboardAvailable(fmt);
}
String DnDLoop::GetData(const String& f)
{
GuiLock __;
int i = data->Find(f);
String d;
if(i >= 0)
d = (*data)[i].Render();
else
if(sDnDSource)
d = sDnDSource->GetDropData(f);
return d;
}
String PasteClip::Get(const char *fmt) const
{
return dnd ? dndloop ? dndloop->GetData(fmt) : String() : ReadClipboard(fmt);
}
void PasteClip::GuiPlatformConstruct()
{
dnd = false;
}
void DnDLoop::DnD(bool paste)
{
PasteClip d;
d.paste = paste;
d.accepted = false;
d.allowed = (byte)actions;
d.action = GetCtrl() ? DND_COPY : DND_MOVE;
d.dnd = true;
if(target)
target->DnD(GetMousePos(), d);
action = d.IsAccepted() ? d.GetAction() : DND_NONE;
}
void DnDLoop::Sync()
{
GuiLock __;
Ptr<Ctrl> t = FindMouseTopCtrl();
if(t != target)
if(target)
target->DnDLeave();
target = t;
DnD(false);
}
void DnDLoop::LeftUp(Point, dword)
{
GuiLock __;
LLOG("DnDLoop::LeftUp");
DnD(true);
EndLoop();
}
void DnDLoop::MouseMove(Point p, dword)
{
GuiLock __;
LLOG("DnDLoop::MouseMove");
Sync();
}
bool DnDLoop::Key(dword, int)
{
GuiLock __;
LLOG("DnDLoop::Key");
Sync();
return false;
}
Image DnDLoop::CursorImage(Point, dword)
{
GuiLock __;
return action == DND_MOVE ? move : action == DND_COPY ? copy : reject;
}
int Ctrl::DoDragAndDrop(const char *fmts, const Image& sample, dword actions,
const VectorMap<String, ClipData>& data)
{
GuiLock __;
DnDLoop d;
d.actions = (byte)actions;
d.reject = actions & DND_EXACTIMAGE ? CtrlCoreImg::DndNone() : MakeDragImage(CtrlCoreImg::DndNone(), sample);
if(actions & DND_COPY)
d.copy = actions & DND_EXACTIMAGE ? sample : MakeDragImage(CtrlCoreImg::DndCopy(), sample);
if(actions & DND_MOVE)
d.move = actions & DND_EXACTIMAGE ? sample : MakeDragImage(CtrlCoreImg::DndMoveX11(), sample);
d.SetMaster(*this);
d.data = &data;
d.action = DND_NONE;
d.fmts = Split(fmts, ';');
dndloop = &d;
sDnDSource = this;
d.Run();
sDnDSource = NULL;
SyncCaret();
LLOG("DoDragAndDrop finished");
return d.action;
}
void Ctrl::SetSelectionSource(const char *fmts) {}
END_UPP_NAMESPACE
#endif

View file

@ -1,189 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlCore/CtrlCore.h>
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
#define LTIMING(x) // RTIMING(x)
FrameInfo frameInfo;
SystemDraw* SystemDraw::systemDraw = NULL;
float SystemDraw::blurStrength = 0;
float SystemDraw::grayStrength = 0;
dword SystemDraw::GetInfo() const
{
return 0;
}
Size SystemDraw::GetPageSize() const
{
return Size(0, 0);
}
Size SystemDraw::GetNativeDpi() const
{
return Size(96, 96);
}
void SystemDraw::BeginNative()
{
}
void SystemDraw::EndNative()
{
}
int SystemDraw::GetCloffLevel() const
{
return ci;
}
void SystemDraw::InitClip(const Rect& clip)
{
GuiLock __;
drawing_clip = clip;
}
void SystemDraw::Reset() {
systemDraw = this;
cloff.SetCount(32);
mstack.SetCount(32);
ci = 0;
cn = 0;
cd = 0;
mi = 0;
drawing_offset = Point(0, 0);
alpha = 255;
r = g = b = a = 255;
angle = 0;
scale = 1;
image_coloring = true;
projection_mode = 0;
}
SystemDraw::SystemDraw() {
GuiLock __;
Reset();
}
SystemDraw::SystemDraw(Size sz) {
GuiLock __;
Reset();
drawing_clip = sz;
drawing_size = sz;
clip = sz;
Init();
}
void SystemDraw::Init()
{
//glVertexPointer(2, GL_FLOAT, 0, vtx);
//glTexCoordPointer(2, GL_FLOAT, 0, crd);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glDisable(GL_ALPHA_TEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
#if CLIP_MODE == 0
glEnable(GL_SCISSOR_TEST);
#elif CLIP_MODE == 1
glEnable(GL_CLIP_PLANE0);
glEnable(GL_CLIP_PLANE1);
glEnable(GL_CLIP_PLANE2);
glEnable(GL_CLIP_PLANE3);
#elif CLIP_MODE == 2
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glClearStencil(0);
#endif
glEnable(GL_LINE_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.f, 0.f, 0.f, 1.f);
glClearDepth(1.0f);
glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glColor4f(1.f, 1.f, 1.f, 1.f);
}
void SystemDraw::Clear(bool ontransforms)
{
GuiLock __;
if(ontransforms && (angle == 0 && scale == 1))
return;
#if CLIP_MODE == 0
glDisable(GL_SCISSOR_TEST);
#endif
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
#if CLIP_MODE == 0
glEnable(GL_SCISSOR_TEST);
#endif
}
void SystemDraw::ViewPort(int width, int height)
{
GuiLock __;
glViewport(0, 0, (GLsizei) width < 0 ? drawing_size.cx : width, (GLsizei) height < 0 ? drawing_size.cy : height);
}
void SystemDraw::OrthogonalView(bool clear_modelview)
{
GuiLock __;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, drawing_size.cx, drawing_size.cy, 0, -100, 100);
glMatrixMode(GL_MODELVIEW);
if(clear_modelview)
glLoadIdentity();
}
void SystemDraw::PerspectiveView(bool clear_modelview)
{
GuiLock __;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, GetAspect(), 1.f, 100.0f);
glMatrixMode(GL_MODELVIEW);
if(clear_modelview)
glLoadIdentity();
}
void SystemDraw::ApplyTransforms()
{
GuiLock __;
float dx = (float) drawing_size.cx / 2;
float dy = (float) drawing_size.cy / 2;
glTranslatef(dx, dy, 0.f);
glRotatef(angle, 0, 0, 1);
glScalef(scale, scale, 1);
glTranslatef(-dx, -dy, 0.f);
}
void SystemDraw::PushContext()
{
GuiLock __;
MatrixStack& m = mstack[mi++];
glGetDoublev(GL_PROJECTION_MATRIX, m.projection_matrix);
glGetDoublev(GL_MODELVIEW_MATRIX, m.modelview_matrix);
m.projection_mode = projection_mode;
}
void SystemDraw::PopContext()
{
GuiLock __;
MatrixStack& m = mstack[--mi];
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(m.projection_matrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(m.modelview_matrix);
projection_mode = m.projection_mode;
}
SystemDraw::~SystemDraw() {
}
END_UPP_NAMESPACE
#endif

View file

@ -1,657 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlCore/CtrlCore.h>
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
#define LTIMING(x) // RTIMING(x)
void SystemDraw::PlaneEquation(double eq[4], float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3)
{
eq[0] = y1 * (z2 - z3) +
y2 * (z3 - z1) +
y3 * (z1 - z2);
eq[1] = z1 * (x2 - x3) +
z2 * (x3 - x1) +
z3 * (x1 - x2);
eq[2] = x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2);
eq[3] = -(x1 * (y2 * z3 - y3 * z2) +
x2 * (y3 * z1 - y1 * z3) +
x3 * (y1 * z2 - y2 * z1));
}
void SystemDraw::SetClipRect(const Rect& r)
{
clip = r;
#if CLIP_MODE != 2
for(int i = 0; i < ci; i++)
if(!cloff[i].exclude)
clip &= cloff[i].drawing_clip;
#endif
}
void SystemDraw::ScissorClip(const Rect& r)
{
glScissor(r.left, drawing_size.cy - r.top - r.Height(), r.Width(), r.Height());
}
void SystemDraw::PlaneClip(const Rect& r)
{
float cl = (float) r.left;
float ct = (float) r.top;
float cr = (float) r.right;
float cb = (float) r.bottom;
double eq[4];
PlaneEquation(eq, cl, ct, 0, cl, cb, 0, cl, cb, +1.0f);
glClipPlane(GL_CLIP_PLANE0, eq);
PlaneEquation(eq, cr, ct, 0, cr, cb, 0, cr, cb, -1.0f);
glClipPlane(GL_CLIP_PLANE1, eq);
PlaneEquation(eq, cl, ct, 0, cr, ct, 0, cr, ct, -1.0f);
glClipPlane(GL_CLIP_PLANE2, eq);
PlaneEquation(eq, cl, cb, 0, cr, cb, 0, cr, cb, +1.0f);
glClipPlane(GL_CLIP_PLANE3, eq);
}
void SystemDraw::SetVec(float* v, float sx, float sy, float dx, float dy)
{
v[0] = sx; v[1] = dy;
v[2] = sx; v[3] = sy;
v[4] = dx; v[5] = dy;
v[6] = dx; v[7] = sy;
}
void SystemDraw::SetVec(float* v, int sx, int sy, int dx, int dy)
{
v[0] = (float) sx; v[1] = (float) dy;
v[2] = (float) sx; v[3] = (float) sy;
v[4] = (float) dx; v[5] = (float) dy;
v[6] = (float) dx; v[7] = (float) sy;
}
void SystemDraw::StencilClip(const Rect& r, int mode, bool exclude)
{
float vtx[12];
SetVtx(vtx, (float) r.left, (float) r.top, (float) r.right, (float) r.bottom);
glVertexPointer(projection_mode ? 3 : 2, GL_FLOAT, 0, vtx);
int prev_cn = cn;
glColorMask(0, 0, 0, 0);
if(mode == 0)
{
if(exclude)
{
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 255, ~0);
}
else
{
++cn;
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
glStencilFunc(GL_GEQUAL, cn, ~0);
}
}
else
{
if(exclude)
{
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
glStencilFunc(GL_ALWAYS, cn, ~0);
}
else
{
--cn;
glStencilOp(GL_KEEP, GL_DECR, GL_DECR);
glStencilFunc(GL_ALWAYS, cn, ~0);
}
}
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
if(exclude)
glStencilFunc(GL_GREATER, 255, ~0);
else
glStencilFunc(GL_EQUAL, cn, ~0);
glColorMask(1, 1, 1, 1);
}
void SystemDraw::SetClip(const Rect& r, int mode, bool exclude)
{
SetClipRect(r);
#if CLIP_MODE == 0
ScissorClip(clip);
#elif CLIP_MODE == 1
PlaneClip(clip);
#elif CLIP_MODE == 2
StencilClip(clip, mode, exclude);
#endif
}
void SystemDraw::BeginOp()
{
Cloff& w = cloff[ci++];
w.clipping = false;
w.exclude = false;
w.org = drawing_offset;
w.drawing_clip = drawing_clip;
}
void SystemDraw::EndOp()
{
ASSERT(ci);
#if CLIP_MODE == 2
if(cloff[ci - 1].clipping)
SetClip(drawing_clip, 1, cloff[ci - 1].exclude);
#endif
Cloff& w = cloff[--ci];
drawing_offset = w.org;
drawing_clip = w.drawing_clip;
#if CLIP_MODE != 2
if(cloff[ci].clipping)
SetClip(drawing_clip);
#endif
}
void SystemDraw::OffsetOp(Point p)
{
GuiLock __;
BeginOp();
drawing_offset += p;
}
bool SystemDraw::ClipOp(const Rect& r)
{
GuiLock __;
BeginOp();
cloff[ci - 1].clipping = true;
drawing_clip = r + drawing_offset;
SetClip(drawing_clip);
return true;
}
bool SystemDraw::ClipoffOp(const Rect& r)
{
GuiLock __;
BeginOp();
cloff[ci - 1].clipping = true;
drawing_clip = r + drawing_offset;
drawing_offset += r.TopLeft();
SetClip(drawing_clip);
return true;
}
bool SystemDraw::ExcludeClipOp(const Rect& r)
{
GuiLock __;
ASSERT(ci > 0);
cloff[ci - 1].clipping = true;
cloff[ci - 1].exclude = true;
drawing_clip = r + drawing_offset;
SetClip(drawing_clip, 0, true);
return true;
}
bool SystemDraw::IntersectClipOp(const Rect& r)
{
GuiLock __;
Cloff& w = cloff[ci];
drawing_clip = r + drawing_offset;
SetClip(drawing_clip);
return true;
}
bool SystemDraw::IsPaintingOp(const Rect& r) const
{
return true;
}
Rect SystemDraw::GetPaintRect() const
{
GuiLock __;
return drawing_clip;
}
void SystemDraw::DrawRectOp(int x, int y, int cx, int cy, Color color)
{
GuiLock __;
if(IsNull(color))
return;
if(cx <= 0 || cy <= 0) return;
float sx = (float) x + drawing_offset.x;
float sy = (float) y + drawing_offset.y;
float dx = sx + cx;
float dy = sy + cy;
#if CLIP_MODE == 3
float cl = (float) clip.left;
float ct = (float) clip.top;
float cr = (float) clip.right;
float cb = (float) clip.bottom;
if(sx > cr || sy > cb)
return;
if(dx < cl || dy < ct)
return;
if(sx < cl)
sx = cl;
if(sy < ct)
sy = ct;
if(dx > cr)
dx = cr;
if(dy > cb)
dy = cb;
#endif
#ifdef COLOR_ALPHA
glColor4ub(color.GetR(), color.GetG(), color.GetB(), color.GetA() >= 255 ? (int) alpha : color.GetA());
#else
glColor4ub(color.GetR(), color.GetG(), color.GetB(), (int) alpha);
#endif
float vtx[12];
SetVtx(vtx, sx, sy, dx, dy);
glVertexPointer(projection_mode ? 3 : 2, GL_FLOAT, 0, vtx);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#ifdef COLOR_ALPHA
glColor4ub(255, 255, 255, 255);
#else
glColor4ub(255, 255, 255, (int) alpha);
#endif
}
void SystemDraw::DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color)
{
GuiLock __;
if(cx <= 0 || cy <= 0) return;
float sx = (float) x + drawing_offset.x;
float sy = (float) y + drawing_offset.y;
float dx = sx + cx;
float dy = sy + cy;
#if CLIP_MODE == 3
if(sx > clip.right || sy > clip.bottom)
return;
if(dx < clip.left || dy < clip.top)
return;
#endif
float tl = (float) src.left;
float tr = (float) src.right;
float tt = (float) src.top;
float tb = (float) src.bottom;
float sw = (float) src.GetWidth();
float sh = (float) src.GetHeight();
#if CLIP_MODE == 3
float cl = (float) clip.left;
float ct = (float) clip.top;
float cr = (float) clip.right;
float cb = (float) clip.bottom;
if(sx < cl)
{
float dl = cl - sx;
tl += dl * sw / (float) cx;
sx = cl;
}
if(sy < ct)
{
float dt = ct - sy;
tt += dt * sh / (float) cy;
sy = ct;
}
if(dx > cr)
{
float dr = dx - cr;
tr -= dr * sw / (float) cx;
dx = cr;
}
if(dy > cb)
{
float db = dy - cb;
tb -= db * sh / (float) cy;
dy = cb;
}
#endif
const TextureResource& t = resources.Bind(img, Resources::AUTO_ATLAS | Resources::NEAREST_FILTERING);
float tw = 1.f / (float) t.realWidth;
float th = 1.f / (float) t.realHeight;
tl = (tl + t.x + TEXEL_OFFSET) * tw;
tr = (tr + t.x - TEXEL_OFFSET) * tw;
tt = (tt + t.y + TEXEL_OFFSET) * th;
tb = (tb + t.y - TEXEL_OFFSET) * th;
if(image_coloring)
{
if(IsNull(color))
glColor4ub(255, 255, 255, (int) alpha);
else
{
#ifdef COLOR_ALPHA
glColor4ub(color.GetR(), color.GetG(), color.GetB(), color.GetA() >= 255 ? (int) alpha : color.GetA());
#else
glColor4ub(color.GetR(), color.GetG(), color.GetB(), (int) alpha);
#endif
}
}
else
glColor4ub(255, 255, 255, 255);
float vtx[12];
SetVtx(vtx, sx, sy, dx, dy);
float crd[] = {
tl, tb,
tl, tt,
tr, tb,
tr, tt
};
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, crd);
glVertexPointer(projection_mode ? 3 : 2, GL_FLOAT, 0, vtx);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
void SystemDraw::DrawTextureOp(const RectF& r, int textureId, int width, int height, const RectF& src)
{
GuiLock __;
float sx = r.left + drawing_offset.x;
float sy = r.top + drawing_offset.y;
float dx = sx + r.GetWidth();
float dy = sy + r.GetHeight();
float tl = src.left;
float tr = src.right;
float tt = src.top;
float tb = src.bottom;
resources.Bind(textureId, Resources::NEAREST_FILTERING);
float tw = 1.f / (float) (width);
float th = 1.f / (float) (height);
tl = (tl + TEXEL_OFFSET) * tw;
tr = (tr - TEXEL_OFFSET) * tw;
tt = (tt + TEXEL_OFFSET) * th;
tb = (tb - TEXEL_OFFSET) * th;
float vtx[12];
SetVtx(vtx, sx, sy, dx, dy);
float crd[] = {
tl, tt,
tl, tb,
tr, tt,
tr, tb
};
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, crd);
glVertexPointer(projection_mode ? 3 : 2, GL_FLOAT, 0, vtx);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
void SystemDraw::DrawImageOp(float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, const Image& img, const Rect& src, Color color)
{
GuiLock __;
float tl = (float) src.left;
float tr = (float) src.right;
float tt = (float) src.top;
float tb = (float) src.bottom;
float sw = (float) src.GetWidth();
float sh = (float) src.GetHeight();
const TextureResource& t = resources.Bind(img, Resources::AUTO_ATLAS | Resources::NEAREST_FILTERING);
float tw = 1.f / (float) t.realWidth;
float th = 1.f / (float) t.realHeight;
tl = (tl + t.x + TEXEL_OFFSET) * tw;
tr = (tr + t.x - TEXEL_OFFSET) * tw;
tt = (tt + t.y + TEXEL_OFFSET) * th;
tb = (tb + t.y - TEXEL_OFFSET) * th;
if(image_coloring)
{
if(IsNull(color))
glColor4ub(255, 255, 255, (int) alpha);
else
{
#ifdef COLOR_ALPHA
glColor4ub(color.GetR(), color.GetG(), color.GetB(), color.GetA());
#else
glColor4ub(color.GetR(), color.GetG(), color.GetB(), (int) alpha);
#endif
}
}
glEnable(GL_TEXTURE_2D);
float vtx[] = {
x3, y3, z3,
x0, y0, z0,
x2, y2, z2,
x1, y1, z1
};
float crd[] = {
tl, tb,
tl, tt,
tr, tb,
tr, tt
};
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, crd);
glVertexPointer(3, GL_FLOAT, 0, vtx);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
void SystemDraw::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color)
{
GuiLock __;
#ifdef COLOR_ALPHA
glColor4ub(color.GetR(), color.GetG(), color.GetB(), color.GetA());
#else
glColor4ub(color.GetR(), color.GetG(), color.GetB(), (int) alpha);
#endif
glLineWidth((GLfloat) width);
glBegin(GL_LINES);
glVertex2i(x1 + drawing_offset.x, y1 + drawing_offset.y);
glVertex2i(x2 + drawing_offset.x, y2 + drawing_offset.y);
glEnd();
}
void SystemDraw::DrawPolyPolylineOp(const Point *vertices, int vertex_count, const int *counts, int count_count, int width, Color color, Color doxor)
{
GuiLock __;
}
void SystemDraw::DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count, const int *subpolygon_counts, int scc, const int *disjunct_polygon_counts, int dpcc, Color color, int width, Color outline, uint64 pattern, Color doxor)
{
GuiLock __;
}
void SystemDraw::DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color)
{
GuiLock __;
}
void SystemDraw::DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor)
{
GuiLock __;
}
void SystemDraw::SaveCurrentColor()
{
GuiLock __;
glGetFloatv(GL_CURRENT_COLOR, current_color);
}
void SystemDraw::RestoreLastColor()
{
GuiLock __;
glColor4f(current_color[0], current_color[1], current_color[2], current_color[3]);
}
RectF SystemDraw::UnProject(const RectF& r, float& depth)
{
GuiLock __;
double projMat[16];
double modelMat[16];
int viewPort[4];
glGetDoublev(GL_PROJECTION_MATRIX, projMat);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMat);
glGetIntegerv(GL_VIEWPORT, viewPort);
RectF fr;
double x, y, z;
gluUnProject(r.left, r.top, 0.99f, modelMat, projMat, viewPort, &x, &y, &z);
depth = (float) z;
fr.left = (float) x;
fr.top = (float) y;
gluUnProject(r.right, r.bottom, 0.99f, modelMat, projMat, viewPort, &x, &y, &z);
fr.right = (float) x;
fr.bottom = (float) y;
return fr;
}
void SystemDraw::UnProject(float* vtx, float sx, float sy, float dx, float dy)
{
GuiLock __;
double projMat[16];
double modelMat[16] = {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
int viewPort[4];
glGetDoublev(GL_PROJECTION_MATRIX, projMat);
//glGetDoublev(GL_MODELVIEW_MATRIX, modelMat);
glGetIntegerv(GL_VIEWPORT, viewPort);
double xs, ys, xd, yd, z;
gluUnProject(sx, drawing_size.cy - sy, 0.99, modelMat, projMat, viewPort, &xs, &ys, &z);
gluUnProject(dx, drawing_size.cy - dy, 0.99, modelMat, projMat, viewPort, &xd, &yd, &z);
vtx[0] = (float) xs;
vtx[1] = (float) yd;
vtx[2] = (float) z;
vtx[3] = (float) xs;
vtx[4] = (float) ys;
vtx[5] = (float) z;
vtx[6] = (float) xd;
vtx[7] = (float) yd;
vtx[8] = (float) z;
vtx[9] = (float) xd;
vtx[10] = (float) ys;
vtx[11] = (float) z;
}
void SystemDraw::UnProject(float& x, float& y, float &z)
{
GuiLock __;
double projMat[16];
double modelMat[16] = {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
int viewPort[4];
glGetDoublev(GL_PROJECTION_MATRIX, projMat);
glGetIntegerv(GL_VIEWPORT, viewPort);
double xd, yd, zd;
gluUnProject(x, drawing_size.cy - y, 0.99, modelMat, projMat, viewPort, &xd, &yd, &zd);
x = (float) xd;
y = (float) yd;
z = (float) zd;
}
void SystemDraw::SetVtx(float* vtx, float sx, float sy, float dx, float dy)
{
if(projection_mode == 1)
{
UnProject(vtx, sx, sy, dx, dy);
}
else
{
vtx[0] = sx;
vtx[1] = dy;
vtx[2] = sx;
vtx[3] = sy;
vtx[4] = dx;
vtx[5] = dy;
vtx[6] = dx;
vtx[7] = sy;
}
}
void SystemDraw::SetProjectionMode(int mode)
{
if(mode != projection_mode)
{
projection_mode = mode;
if(projection_mode)
PerspectiveView(false);
else
OrthogonalView(false);
}
}
END_UPP_NAMESPACE
#endif

View file

@ -1,321 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlCore/CtrlCore.h>
NAMESPACE_UPP
void OpenGLFont::LoadBrc(const byte* xml, const byte** imagesData, const int* imagesSize, int imagesCount)
{
Parse((const char*) xml, false);
for(int i = 0; i < imagesCount; i++)
{
MemStream ms((void*) imagesData[i], imagesSize[i]);
Image img = StreamRaster::LoadAny(ms);
images.Add(img);
if(preload)
resources.Add(img, true);
}
}
void OpenGLFont::Load(const String& fileName, bool preload)
{
String filePath = GetDataFile(fileName);
String xml = LoadFile(filePath);
Parse(xml, true);
}
void OpenGLFont::Parse(const char* xml, bool parsePages)
{
chars.SetCount(512);
XmlParser p(xml);
while(!p.IsTag())
p.Skip();
p.PassTag("font");
while(!p.End())
{
if(p.TagE("common"))
{
scaleW = (float) p.Double("scaleW");
scaleH = (float) p.Double("scaleH");
lineHeight = (float) p.Double("lineHeight");
base = (float) p.Double("base");
}
else if(p.Tag("pages"))
{
while(!p.End())
{
if(p.TagE("page"))
{
if(parsePages)
{
String fileName = p["file"];
Image img = StreamRaster::LoadFileAny(GetDataFile(fileName));
images.Add(img);
if(preload)
resources.Add(img, true);
}
pages.Add(StrInt(p["id"]));
}
else
p.Skip();
}
}
else if(p.Tag("chars"))
{
while(!p.End())
{
if(p.TagE("char"))
{
int id = p.Int("id");
CharInfo& ci = chars[id];
ci.id = id;
ci.x = (float) p.Double("x");
ci.y = (float) p.Double("y");
ci.width = (float) p.Double("width");
ci.height = (float) p.Double("height");
ci.xoffset = (float) p.Double("xoffset");
ci.yoffset = (float) p.Double("yoffset");
ci.xadvance = (float) p.Double("xadvance");
ci.page = p.Int("page");
}
else
p.Skip();
}
}
else if(p.Tag("kernings"))
{
while(!p.End())
{
if(p.TagE("kerning"))
{
int first = p.Int("first");
int second = p.Int("second");
float amount = (float) p.Double("amount");
VectorMap<int, float>& vm = kerns.GetAdd(first);
vm.Add(second, amount);
}
else
p.Skip();
}
}
else
p.Skip();
}
}
void OpenGLFont::UpdateTextures()
{
if(texturesUpdated)
return;
for(int i = 0; i < images.GetCount(); i++)
{
const TextureResource& t = resources.Bind(images[i], Resources::LINEAR_FILTERING);
pages[i] = t.serialId;
}
texturesUpdated = true;
}
float ConvStrength(float min, float max, float p)
{
return min + (max - min) * p / 100.f;
}
void SystemDraw::Text(int x, int y, int angle, const wchar *text, Font font, Color ink, int outlineStrength, Color outlineColor, int glowStrength, Color glowColor, int n, const int *dx)
{
if(!text)
return;
const wchar* s = text;
OpenGLFont& fi = resources.GetFont(font);
glEnable(GL_TEXTURE_2D);
#if CLIP_MODE == 3
float cl = (float) clip.left;
float ct = (float) clip.top;
float cr = (float) clip.right;
float cb = (float) clip.bottom;
#endif
fi.UpdateTextures();
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
alphaMagProg.Start();
const float ic = 1.f / 255.f;
float outlineCenter = ConvStrength(0.1f, 0.45f, (float) 100 - min(outlineStrength, 100));
float glowCenter = ConvStrength(0.55f, 0.95f, (float) 100 - min(glowStrength, 100));
#ifdef COLOR_ALPHA
float ac = alpha / 255.f;
int inkA = ink.GetA();
int outlineA = outlineColor.GetA();
int glowA = glowColor.GetA();
#else
float ac = alpha;
int inkA = 1;
int outlineA = 1;
int glowA = 1;
#endif
alphaMagProg.SetUniform("GlyphColor", ink.GetR() * ic, ink.GetG() * ic, ink.GetB() * ic, inkA * ic * ac);
alphaMagProg.SetUniform("OutlineColor", outlineColor.GetR() * ic, outlineColor.GetG() * ic, outlineColor.GetB() * ic, outlineA * ic * ac);
alphaMagProg.SetUniform("GlowColor", glowColor.GetR() * ic, glowColor.GetG() * ic, glowColor.GetB() * ic, glowA * ic * ac);
alphaMagProg.SetUniform("Outline", outlineStrength > 0); //0.1 - 0.45
alphaMagProg.SetUniform("Glow", glowStrength > 0); //0.55 - 0.095
alphaMagProg.SetUniform("Shadow", false);
alphaMagProg.SetUniform("OutlineCenter", outlineCenter);
alphaMagProg.SetUniform("GlowCenter", glowCenter);
float xp = (float) x;
float yp = (float) y;
int page = -1;
float sw = (float) fi.scaleW;
float sh = (float) fi.scaleH;
float tw = 1.f / sw;
float th = 1.f / sh;
while(*s && n > 0)
{
int cn = *s;
if(cn >= 0 && cn < fi.chars.GetCount())
{
const OpenGLFont::CharInfo& ci = fi.chars[cn];
cn <<= 3;
if(ci.page != page)
{
resources.Bind(fi.pages[ci.page], Resources::LINEAR_FILTERING);
glActiveTexture(GL_TEXTURE0);
alphaMagProg.SetUniform("Texture", 0);
page = ci.page;
}
float sx = (float) ci.xoffset * fi.scale + xp + drawing_offset.x;
float sy = (float) ci.yoffset * fi.scale + yp + drawing_offset.y;
float dx = sx + ci.width * fi.scale;
float dy = sy + ci.height * fi.scale;
#if CLIP_MODE == 3
if(sx <= clip.right && sy <= clip.bottom && dx >= clip.left && dy >= clip.top)
#endif
{
float tl = (float) ci.x;
float tt = (float) ci.y;
float tr = (float) ci.x + ci.width;
float tb = (float) ci.y + ci.height;
#if CLIP_MODE == 3
if(sx < cl)
{
tl += (cl - sx);
sx = cl;
}
if(sy < ct)
{
tt += (ct - sy);
sy = ct;
}
if(dx > cr)
{
tr -= dx - cr;
dx = cr;
}
if(dy > cb)
{
tb -= dy - cb;
dy = cb;
}
#endif
tl = (tl + TEXEL_OFFSET) * tw;
tr = (tr - TEXEL_OFFSET) * tw;
tt = (tt + TEXEL_OFFSET) * th;
tb = (tb - TEXEL_OFFSET) * th;
/*
float vtx[] = {
sx, dy,
sx, sy,
dx, dy,
dx, sy
};*/
float vtx[12];
SetVtx(vtx, sx, sy, dx, dy);
float crd[] = {
tl, tb,
tl, tt,
tr, tb,
tr, tt
};
glTexCoordPointer(2, GL_FLOAT, 0, crd);
glVertexPointer(projection_mode ? 3: 2, GL_FLOAT, 0, vtx);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
xp += int(ci.xadvance * fi.scale + 0.5f);
int k = fi.kerns.Find(*s);
if(k >= 0)
xp += int(fi.kerns[k].Get(*(s + 1), 0) * fi.scale);
}
++s;
--n;
}
alphaMagProg.Stop();
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
void SystemDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, int n, const int *dx)
{
GuiLock __;
Text(x, y, angle, text, font, ink, 0, White, 0, White, n, dx);
}
Size GetTextSize(const wchar *text, const OpenGLFont& fi, int n)
{
if(n < 0)
n = wstrlen(text);
Size sz;
sz.cx = 0;
const wchar *wtext = (const wchar *)text;
while(n > 0) {
int cn = *wtext++;
if(cn >= 0 && cn < fi.chars.GetCount())
{
const OpenGLFont::CharInfo& ci = fi.chars[cn];
sz.cx += int(ci.xadvance * fi.scale + 0.5f);
int k = fi.kerns.Find(cn);
if(k >= 0)
sz.cx += int(fi.kerns[k].Get(*wtext, 0) * fi.scale);
}
n--;
}
sz.cy = int(fi.lineHeight * fi.scale + 0.5f);
return sz;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,174 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
NAMESPACE_UPP
#define LLOG(x) //LOG(x)
static Point glmousepos;
Point GetMousePos() {
return glmousepos;
}
void Ctrl::SysEndLoop()
{
}
void WakeUpGuiThread()
{
}
void Ctrl::MouseEventGl(Ptr<Ctrl> t, int event, Point p, int zdelta)
{
if(!t->IsEnabled() && (t != (Ctrl*) &infoPanel && t != (Ctrl*) &console))
return;
Rect rr = t->GetRect();
if((event & Ctrl::ACTION) == DOWN) {
Ptr<Ctrl> q = t;
TopWindowFrame *wf = dynamic_cast<TopWindowFrame *>(~t);
if(wf)
q = wf->window;
if(q) q->ClickActivateWnd();
if(q) q->SetForeground();
if(ignoreclick)
return;
}
if(t)
t->DispatchMouse(event, p - rr.TopLeft(), zdelta);
if(t)
t->PostInput();
}
Ctrl *Ctrl::FindMouseTopCtrl()
{
for(int i = topctrl.GetCount() - 1; i >= 0; i--) {
Ctrl *t = topctrl[i];
if(t->GetRect().Contains(glmousepos))
return t->IsEnabled() ? t : NULL;
}
return desktop->IsEnabled() ? desktop : NULL;
}
bool Ctrl::DoMouseGl(Ctrl* q, int event, Point p, int zdelta)
{
Rect rr = q->GetRect();
if(rr.Contains(p)) {
MouseEventGl(q, event, p, zdelta);
return true;
}
return false;
}
void Ctrl::DoMouseGl(int event, Point p, int zdelta)
{
glmousepos = p;
int a = event & Ctrl::ACTION;
if(a == Ctrl::UP && Ctrl::ignoreclick) {
EndIgnore();
return;
}
else
if(a == Ctrl::DOWN && ignoreclick)
return;
LLOG("### Mouse event: " << event << " position " << p << " zdelta " << zdelta << ", capture " << Upp::Name(captureCtrl));
if(captureCtrl)
MouseEventGl(captureCtrl->GetTopCtrl(), event, p, zdelta);
else
{
bool processed = consoleActive && DoMouseGl((Ctrl*) &console, event, p, zdelta);
if(!processed && controlPanelActive)
processed = DoMouseGl((Ctrl*) &infoPanel, event, p, zdelta);
if(!processed)
{
for(int i = topctrl.GetCount() - 1; i >= 0; i--) {
Ptr<Ctrl> t = topctrl[i];
if(t != (Ctrl*) &infoPanel && t != (Ctrl*) &console && t->GetRect().Contains(p) &&
DoMouseGl(t, event, p, zdelta))
return;
}
Ctrl *desktop = GetDesktop();
if(desktop) {
desktop->DispatchMouse(event, p, zdelta);
desktop->PostInput();
}
}
}
}
bool Ctrl::DoKeyGl(dword key, int cnt)
{
if(key == K_CTRL_GRAVE)
{
controlPanelActive = !controlPanelActive;
consoleActive = !consoleActive;
return true;
}
else if(key == K_CTRL_F12)
{
consoleActive = !consoleActive;
return true;
}
else if(key == K_CTRL_F11)
{
controlPanelActive = !controlPanelActive;
return true;
}
bool b = DispatchKey(key, cnt);
SyncCaret();
Ctrl *desktop = GetDesktop();
if(desktop)
desktop->PostInput();
return b;
}
void Ctrl::SetCaret(int x, int y, int cx, int cy)
{
GuiLock __;
caretx = x;
carety = y;
caretcx = cx;
caretcy = cy;
glCaretTm = GetTickCount();
SyncCaret();
}
void Ctrl::SyncCaret() {
GuiLock __;
}
void Ctrl::CursorSync(Draw& w)
{
Rect cr = Null;
if(focusCtrl && (((GetTickCount() - glCaretTm) / 500) & 1) == 0)
cr = (RectC(focusCtrl->caretx, focusCtrl->carety, focusCtrl->caretcx, focusCtrl->caretcy)
+ focusCtrl->GetScreenView().TopLeft()) & focusCtrl->GetScreenView();
glCaretRect = cr;
if(!cr.IsEmpty())
w.DrawRect(cr, Black);
}
void Ctrl::MouseSync(Draw& w)
{
glCursorPos = GetMousePos() - glCursorImage.GetHotSpot();
Size sz = glCursorImage.GetSize();
w.DrawImage(glCursorPos.x, glCursorPos.y, sz.cx, sz.cy, glCursorImage);
}
void Ctrl::SetMouseCursor(const Image& image)
{
GuiLock __;
if(image.GetSerialId() != glCursorImage.GetSerialId()) {
glCursorImage = image;
glCursorPos = Null;
}
}
END_UPP_NAMESPACE
#endif

View file

@ -1,103 +0,0 @@
#include "Fbo.h"
NAMESPACE_UPP
bool Fbo::Create(int width, int height, bool resize)
{
this->width = width;
this->height = height;
if(!resize)
{
glGenFramebuffers(1, &fbId);
glGenRenderbuffers(1, &rbId);
glGenTextures(1, &texId);
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
glBindRenderbuffer(GL_RENDERBUFFER, rbId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbId, 0);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbId);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbId);
status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
ready = true;
return status == GL_FRAMEBUFFER_COMPLETE;
}
void Fbo::Resize(int width, int height)
{
if(ready)
Create(width, height, true);
}
void Fbo::Bind()
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbId);
}
void Fbo::Unbind()
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
void Fbo::Clear()
{
glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
void Fbo::BlitToScreen()
{
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbId);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}
void Fbo::BlitTo(const Fbo& fbo)
{
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbId);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo.fbId);
glBlitFramebuffer(0, 0, width, height, 0, 0, fbo.width, fbo.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}
void Fbo::Remove()
{
glDeleteTextures(1, &texId);
glDeleteRenderbuffers(1, &rbId);
glDeleteFramebuffers(1, &fbId);
}
String Fbo::GetError()
{
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE:
return "Framebuffer complete";
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return "Framebuffer incomplete attachment";
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return "Framebuffer incomplete missing attachment";
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
return "Framebuffer incomplete draw buffer";
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
return "Framebuffer incomplete read buffer";
case GL_FRAMEBUFFER_UNSUPPORTED:
return "Framebuffer unsupported";
default:
return "Unknown error";
}
}
END_UPP_NAMESPACE

View file

@ -1,36 +0,0 @@
#ifndef _CoreGl_Fbo_h_
#define _CoreGl_Fbo_h_
#include <Core/Core.h>
#include <Draw/Draw.h>
#include "Gl.h"
NAMESPACE_UPP
struct Fbo : Moveable<Fbo>
{
GLuint texId;
GLuint fbId;
GLuint rbId;
GLenum status;
int width;
int height;
bool ready;
bool Create(int width, int height, bool resize = false);
void Resize(int width, int height);
void Bind();
void Unbind();
void Clear();
void BlitToScreen();
void BlitTo(const Fbo& fbo);
void Remove();
String GetError();
Fbo() : width(0), height(0), ready(false)
{}
};
END_UPP_NAMESPACE
#endif

View file

@ -1,57 +0,0 @@
#ifndef _CoreGl_FontGl_h_
#define _CoreGl_FontGl_h_
struct OpenGLFont : Moveable<OpenGLFont>
{
float scaleW;
float scaleH;
float lineHeight;
float base;
float scale;
bool texturesUpdated;
float vtx[1024 * 4 * 2];
float crd[1024 * 4 * 2];
struct CharInfo : Moveable<CharInfo>
{
int id;
float x;
float y;
float width;
float height;
float xoffset;
float yoffset;
float xadvance;
int page;
};
struct BrcImage : Moveable<BrcImage>
{
const byte* data;
int length;
};
Vector<CharInfo> chars;
VectorMap<int, VectorMap<int, float> > kerns;
Vector<Image> images;
Vector<int64> pages;
bool preload;
OpenGLFont() : texturesUpdated(false), preload(false), scale(1.0f)
{}
~OpenGLFont()
{}
void LoadBrc(const byte* xml, const byte** imagesData, const int* imagesSize, int imagesCount);
void Load(const String& fileName, bool preload = false);
void Parse(const char* xml, bool parsePages);
void UpdateTextures();
void BuildVertices();
};
Size GetTextSize(const wchar *text, const OpenGLFont& fi, int n);
#endif

View file

@ -1,4 +0,0 @@
BINARY(resTahoma14Fnt, "tahoma14.fnt")
BINARY(resTahoma14BoldFnt, "tahoma14b.fnt")
BINARY(resTahoma14Img, "tahoma14.png")
BINARY(resTahoma14BoldImg, "tahoma14b.png")

View file

@ -1,329 +0,0 @@
<?xml version="1.0"?>
<font>
<info face="Tahoma" size="64" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="0" aa="1" padding="64,64,64,64" spacing="1,1" outline="0" />
<common lineHeight="64" base="53" scaleW="1024" scaleH="1024" pages="1" packed="0" alphaChnl="0" redChnl="0" greenChnl="0" blueChnl="0" />
<pages>
<page id="0" file="TahomaB_0.png" />
</pages>
<chars count="319">
<char id="32" x="1006" y="16,25" width="16,125" height="16,125" xoffset="-8" yoffset="45" xadvance="15,5" page="0" chnl="15" />
<char id="33" x="793" y="681,375" width="26,25" height="54,5" xoffset="-4" yoffset="6,5" xadvance="18,125" page="0" chnl="15" />
<char id="34" x="654,875" y="783,75" width="35,375" height="31,25" xoffset="-4,75" yoffset="4,75" xadvance="25,875" page="0" chnl="15" />
<char id="35" x="608,75" y="628,375" width="52,875" height="54,5" xoffset="-4,75" yoffset="6,5" xadvance="43,375" page="0" chnl="15" />
<char id="36" x="862,5" y="206,25" width="45,25" height="66,125" xoffset="-5,5" yoffset="4,25" xadvance="33,75" page="0" chnl="15" />
<char id="37" x="878,125" y="514,625" width="73,875" height="56,125" xoffset="-5,25" yoffset="5,75" xadvance="63,5" page="0" chnl="15" />
<char id="38" x="952,125" y="513,625" width="56,625" height="56,125" xoffset="-5,75" yoffset="5,75" xadvance="41,375" page="0" chnl="15" />
<char id="39" x="690,375" y="783,75" width="24,5" height="31,25" xoffset="-4,875" yoffset="4,75" xadvance="14,625" page="0" chnl="15" />
<char id="40" x="291,75" y="208,125" width="35,125" height="66,875" xoffset="-5,125" yoffset="4,75" xadvance="24,125" page="0" chnl="15" />
<char id="41" x="327" y="208" width="35,125" height="66,875" xoffset="-6" yoffset="4,75" xadvance="24,125" page="0" chnl="15" />
<char id="42" x="160" y="795,25" width="41,875" height="41,375" xoffset="-4,625" yoffset="4,75" xadvance="33,75" page="0" chnl="15" />
<char id="43" x="148,25" y="746" width="49,375" height="49,125" xoffset="-3" yoffset="11,375" xadvance="43,375" page="0" chnl="15" />
<char id="44" x="523,625" y="787,375" width="30,625" height="35,75" xoffset="-8,125" yoffset="34,875" xadvance="16,625" page="0" chnl="15" />
<char id="45" x="891,625" y="780,75" width="33,125" height="23,125" xoffset="-5,125" yoffset="24,375" xadvance="22,875" page="0" chnl="15" />
<char id="46" x="830,5" y="781,25" width="25,125" height="26,125" xoffset="-4,25" yoffset="34,875" xadvance="16,625" page="0" chnl="15" />
<char id="47" x="942" y="272,375" width="38,75" height="64,625" xoffset="-5" yoffset="4,75" xadvance="30,625" page="0" chnl="15" />
<char id="48" x="152" y="578,375" width="45,75" height="56,125" xoffset="-6" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="49" x="688,25" y="682,875" width="41,5" height="54,5" xoffset="-3" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="50" x="755" y="571,375" width="44,25" height="55,25" xoffset="-4,125" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="51" x="289,125" y="577,25" width="44,625" height="56,125" xoffset="-5,375" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="52" x="138" y="636,625" width="47,625" height="54,625" xoffset="-6,875" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="53" x="598,375" y="572,875" width="44,25" height="55,375" xoffset="-4,875" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="54" x="197,875" y="577,875" width="45,5" height="56,125" xoffset="-5,5" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="55" x="475,875" y="685,875" width="44,375" height="54,5" xoffset="-5" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="56" x="486,375" y="518,375" width="46,5" height="56,25" xoffset="-6,375" yoffset="5,625" xadvance="33,75" page="0" chnl="15" />
<char id="57" x="243,5" y="577,375" width="45,5" height="56,125" xoffset="-6,25" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="58" x="989,75" y="680,75" width="25,125" height="45,125" xoffset="-3" yoffset="15,875" xadvance="19,25" page="0" chnl="15" />
<char id="59" x="983,875" y="569,875" width="30,625" height="54,75" xoffset="-6,875" yoffset="15,875" xadvance="19,25" page="0" chnl="15" />
<char id="60" x="49,5" y="747,875" width="49,25" height="49,25" xoffset="-3,375" yoffset="11,375" xadvance="43,375" page="0" chnl="15" />
<char id="61" x="554,375" y="787,25" width="47,75" height="35,5" xoffset="-2,25" yoffset="18,25" xadvance="43,375" page="0" chnl="15" />
<char id="62" x="98,875" y="747" width="49,25" height="49,25" xoffset="-2,5" yoffset="11,375" xadvance="43,375" page="0" chnl="15" />
<char id="63" x="843,625" y="571,125" width="41,125" height="55,25" xoffset="-5,125" yoffset="5,75" xadvance="30" page="0" chnl="15" />
<char id="64" x="173,375" y="341,75" width="58,25" height="61,125" xoffset="-5" yoffset="5,75" xadvance="48,75" page="0" chnl="15" />
<char id="65" x="767,25" y="626,75" width="52,5" height="54,5" xoffset="-8,125" yoffset="6,5" xadvance="36,25" page="0" chnl="15" />
<char id="66" x="244,375" y="689,25" width="46,875" height="54,5" xoffset="-4" yoffset="6,5" xadvance="36,375" page="0" chnl="15" />
<char id="67" x="104" y="580,375" width="47,875" height="56,125" xoffset="-6,25" yoffset="5,75" xadvance="35,375" page="0" chnl="15" />
<char id="68" x="924,125" y="626,125" width="50,375" height="54,5" xoffset="-4" yoffset="6,5" xadvance="40,125" page="0" chnl="15" />
<char id="69" x="520,375" y="685,75" width="42,125" height="54,5" xoffset="-4" yoffset="6,5" xadvance="32,625" page="0" chnl="15" />
<char id="70" x="562,625" y="683" width="41,75" height="54,5" xoffset="-4" yoffset="6,5" xadvance="30,75" page="0" chnl="15" />
<char id="71" x="53,375" y="581,25" width="50,5" height="56,125" xoffset="-6,25" yoffset="5,75" xadvance="39,5" page="0" chnl="15" />
<char id="72" x="98,75" y="692,375" width="48,5" height="54,5" xoffset="-4" yoffset="6,5" xadvance="40,5" page="0" chnl="15" />
<char id="73" x="729,875" y="682,75" width="36,625" height="54,5" xoffset="-5,5" yoffset="6,5" xadvance="25,625" page="0" chnl="15" />
<char id="74" x="944,875" y="570,875" width="38,875" height="55,125" xoffset="-7,875" yoffset="6,5" xadvance="26,5" page="0" chnl="15" />
<char id="75" x="0" y="693,25" width="49,75" height="54,5" xoffset="-4" yoffset="6,5" xadvance="36,875" page="0" chnl="15" />
<char id="76" x="646,375" y="683" width="41,75" height="54,5" xoffset="-4" yoffset="6,5" xadvance="30,375" page="0" chnl="15" />
<char id="77" x="443,5" y="631,25" width="55,375" height="54,5" xoffset="-4" yoffset="6,5" xadvance="47,375" page="0" chnl="15" />
<char id="78" x="974,625" y="626,125" width="48,875" height="54,5" xoffset="-4" yoffset="6,5" xadvance="40,875" page="0" chnl="15" />
<char id="79" x="0" y="582,125" width="53,25" height="56,125" xoffset="-6,25" yoffset="5,75" xadvance="40,75" page="0" chnl="15" />
<char id="80" x="430,125" y="686,125" width="45,625" height="54,5" xoffset="-4" yoffset="6,5" xadvance="34,875" page="0" chnl="15" />
<char id="81" x="663,625" y="206,5" width="53,25" height="66,125" xoffset="-6,25" yoffset="5,75" xadvance="40,75" page="0" chnl="15" />
<char id="82" x="872,375" y="626,5" width="51,625" height="54,5" xoffset="-4" yoffset="6,5" xadvance="38,5" page="0" chnl="15" />
<char id="83" x="333,875" y="576,5" width="46,75" height="56" xoffset="-6,125" yoffset="5,75" xadvance="33,625" page="0" chnl="15" />
<char id="84" x="147,375" y="691,375" width="48,375" height="54,5" xoffset="-8" yoffset="6,5" xadvance="32,5" page="0" chnl="15" />
<char id="85" x="550,125" y="572,875" width="48,125" height="55,375" xoffset="-4,5" yoffset="6,5" xadvance="39,125" page="0" chnl="15" />
<char id="86" x="714,625" y="628,125" width="52,5" height="54,5" xoffset="-8,375" yoffset="6,5" xadvance="35,75" page="0" chnl="15" />
<char id="87" x="185,75" y="634,625" width="69" height="54,5" xoffset="-7,25" yoffset="6,5" xadvance="54,5" page="0" chnl="15" />
<char id="88" x="661,75" y="628,25" width="52,75" height="54,5" xoffset="-8,25" yoffset="6,5" xadvance="36,25" page="0" chnl="15" />
<char id="89" x="819,875" y="626,75" width="52,375" height="54,5" xoffset="-8,5" yoffset="6,5" xadvance="35,5" page="0" chnl="15" />
<char id="90" x="291,375" y="688,25" width="46,5" height="54,5" xoffset="-6,625" yoffset="6,5" xadvance="33" page="0" chnl="15" />
<char id="91" x="584,5" y="207,25" width="32,25" height="66,375" xoffset="-3,75" yoffset="4,75" xadvance="24,125" page="0" chnl="15" />
<char id="92" x="903,125" y="272,5" width="38,75" height="64,625" xoffset="-3" yoffset="4,75" xadvance="30,625" page="0" chnl="15" />
<char id="93" x="552,125" y="207,25" width="32,25" height="66,375" xoffset="-4,5" yoffset="4,75" xadvance="24,125" page="0" chnl="15" />
<char id="94" x="386,75" y="789,75" width="50,375" height="37,125" xoffset="-3,5" yoffset="6,5" xadvance="43,375" page="0" chnl="15" />
<char id="95" x="958,125" y="779,5" width="50,5" height="21,25" xoffset="-8,375" yoffset="48,75" xadvance="33,75" page="0" chnl="15" />
<char id="96" x="745,25" y="782,625" width="29,875" height="26,125" xoffset="-1" yoffset="1,625" xadvance="28,875" page="0" chnl="15" />
<char id="97" x="420" y="742,75" width="43,125" height="46,875" xoffset="-6,625" yoffset="15" xadvance="31,75" page="0" chnl="15" />
<char id="98" x="845,25" y="457,625" width="44,5" height="56,875" xoffset="-4,5" yoffset="4,75" xadvance="33,5" page="0" chnl="15" />
<char id="99" x="508,125" y="740,5" width="41,75" height="46,75" xoffset="-6,625" yoffset="15" xadvance="28" page="0" chnl="15" />
<char id="100" x="532,125" y="459,25" width="44,5" height="57,125" xoffset="-6,625" yoffset="4,75" xadvance="33,375" page="0" chnl="15" />
<char id="101" x="463,25" y="740,75" width="44,75" height="46,75" xoffset="-6,625" yoffset="15" xadvance="31,5" page="0" chnl="15" />
<char id="102" x="260,25" y="520,625" width="37,5" height="56,5" xoffset="-7,5" yoffset="4,5" xadvance="20,25" page="0" chnl="15" />
<char id="103" x="889,875" y="457" width="44,5" height="56,875" xoffset="-6,625" yoffset="15" xadvance="33,375" page="0" chnl="15" />
<char id="104" x="624,75" y="516,375" width="43,125" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="33,875" page="0" chnl="15" />
<char id="105" x="407,375" y="518,875" width="25,625" height="56,375" xoffset="-4,75" yoffset="4,625" xadvance="16" page="0" chnl="15" />
<char id="106" x="818,625" y="139,125" width="33,875" height="67,25" xoffset="-10,125" yoffset="4,625" xadvance="19,25" page="0" chnl="15" />
<char id="107" x="579,625" y="516,5" width="45" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="31,875" page="0" chnl="15" />
<char id="108" x="853" y="514,625" width="25" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="16" page="0" chnl="15" />
<char id="109" x="591" y="737,625" width="59,75" height="46" xoffset="-4,625" yoffset="15" xadvance="50,5" page="0" chnl="15" />
<char id="110" x="694,125" y="737,5" width="43,125" height="46" xoffset="-4,5" yoffset="15" xadvance="33,875" page="0" chnl="15" />
<char id="111" x="373,875" y="742,75" width="46" height="46,875" xoffset="-6,625" yoffset="15" xadvance="32,75" page="0" chnl="15" />
<char id="112" x="172,375" y="521,125" width="44,5" height="56,625" xoffset="-4,5" yoffset="15" xadvance="33,375" page="0" chnl="15" />
<char id="113" x="127,75" y="521,625" width="44,5" height="56,625" xoffset="-6,625" yoffset="15" xadvance="33,375" page="0" chnl="15" />
<char id="114" x="981,625" y="733,5" width="35,5" height="45,125" xoffset="-4,5" yoffset="15,875" xadvance="23" page="0" chnl="15" />
<char id="115" x="550" y="740,375" width="40,875" height="46,75" xoffset="-6,5" yoffset="15" xadvance="27,25" page="0" chnl="15" />
<char id="116" x="819,375" y="681,375" width="37,25" height="54" xoffset="-7,5" yoffset="7,625" xadvance="22" page="0" chnl="15" />
<char id="117" x="650,875" y="737,625" width="43,125" height="46" xoffset="-4,75" yoffset="15,875" xadvance="33,875" page="0" chnl="15" />
<char id="118" x="848,25" y="735,5" width="46,625" height="45,125" xoffset="-8" yoffset="15,875" xadvance="30,625" page="0" chnl="15" />
<char id="119" x="737,375" y="737,375" width="62,375" height="45,125" xoffset="-7,625" yoffset="15,875" xadvance="47,125" page="0" chnl="15" />
<char id="120" x="799,875" y="736" width="48,25" height="45,125" xoffset="-8,125" yoffset="15,875" xadvance="32" page="0" chnl="15" />
<char id="121" x="416,375" y="575,375" width="46,75" height="55,75" xoffset="-8,125" yoffset="15,875" xadvance="30,5" page="0" chnl="15" />
<char id="122" x="940,125" y="734,25" width="41,375" height="45,125" xoffset="-6,75" yoffset="15,875" xadvance="27,875" page="0" chnl="15" />
<char id="123" x="463,875" y="207,375" width="44" height="66,375" xoffset="-6,5" yoffset="4,75" xadvance="33" page="0" chnl="15" />
<char id="124" x="616,875" y="207,25" width="23,25" height="66,375" xoffset="5,25" yoffset="4,75" xadvance="33,75" page="0" chnl="15" />
<char id="125" x="508" y="207,375" width="44" height="66,375" xoffset="-4,5" yoffset="4,75" xadvance="33" page="0" chnl="15" />
<char id="126" x="602,25" y="783,75" width="52,5" height="33" xoffset="-4,5" yoffset="19,375" xadvance="43,375" page="0" chnl="15" />
<char id="160" x="1002,125" y="0" width="16,125" height="16,125" xoffset="-8" yoffset="45" xadvance="15,5" page="0" chnl="15" />
<char id="161" x="766,625" y="682,75" width="26,25" height="54,5" xoffset="-4" yoffset="6,5" xadvance="18,125" page="0" chnl="15" />
<char id="162" x="44,75" y="342,25" width="42" height="63,375" xoffset="-4,125" yoffset="6,875" xadvance="33,75" page="0" chnl="15" />
<char id="163" x="799,375" y="571,375" width="44,125" height="55,25" xoffset="-4,875" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="164" x="25,125" y="797,875" width="43,75" height="43,75" xoffset="-5" yoffset="14" xadvance="33,75" page="0" chnl="15" />
<char id="165" x="49,875" y="693,25" width="48,75" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="166" x="640,25" y="207,25" width="23,25" height="66,375" xoffset="5,25" yoffset="4,75" xadvance="33,75" page="0" chnl="15" />
<char id="167" x="636,875" y="273,75" width="44,375" height="65,375" xoffset="-5,25" yoffset="5,75" xadvance="33,75" page="0" chnl="15" />
<char id="168" x="855,75" y="780,75" width="35,75" height="23,125" xoffset="-3,5" yoffset="4,625" xadvance="28,875" page="0" chnl="15" />
<char id="169" x="292,625" y="341,25" width="60,75" height="60,75" xoffset="-5,75" yoffset="5,75" xadvance="49,25" page="0" chnl="15" />
<char id="170" x="314,875" y="789,875" width="37,75" height="40,5" xoffset="-6,125" yoffset="5,75" xadvance="26,875" page="0" chnl="15" />
<char id="171" x="114,5" y="796,375" width="45,375" height="42,375" xoffset="-4,625" yoffset="14,75" xadvance="37,25" page="0" chnl="15" />
<char id="172" x="474,375" y="787,625" width="49,125" height="35,875" xoffset="-3" yoffset="23,875" xadvance="43,375" page="0" chnl="15" />
<char id="173" x="924,875" y="779,5" width="33,125" height="23,125" xoffset="-5,125" yoffset="24,375" xadvance="22,875" page="0" chnl="15" />
<char id="174" x="231,75" y="341,625" width="60,75" height="60,75" xoffset="-5,75" yoffset="5,75" xadvance="49,25" page="0" chnl="15" />
<char id="175" x="0" y="843,125" width="50,5" height="21,25" xoffset="-8,375" yoffset="-2,375" xadvance="33,75" page="0" chnl="15" />
<char id="176" x="437,25" y="789,75" width="37" height="36,875" xoffset="-4,75" yoffset="5,75" xadvance="27,5" page="0" chnl="15" />
<char id="177" x="894,125" y="681,125" width="49,375" height="53" xoffset="-3" yoffset="8" xadvance="43,375" page="0" chnl="15" />
<char id="178" x="278,25" y="790,875" width="36,5" height="40,625" xoffset="-3,375" yoffset="5,75" xadvance="28,625" page="0" chnl="15" />
<char id="179" x="202" y="791,125" width="36" height="41,25" xoffset="-3,625" yoffset="5,75" xadvance="28,625" page="0" chnl="15" />
<char id="180" x="775,25" y="782,625" width="29,875" height="26,125" xoffset="0,875" yoffset="1,625" xadvance="28,875" page="0" chnl="15" />
<char id="181" x="463,25" y="575,25" width="43,5" height="55,75" xoffset="-4,5" yoffset="15,875" xadvance="34,5" page="0" chnl="15" />
<char id="182" x="0" y="342,25" width="44,625" height="63,875" xoffset="-6,25" yoffset="6,5" xadvance="33,75" page="0" chnl="15" />
<char id="183" x="805,25" y="781,25" width="25,125" height="26,125" xoffset="-3" yoffset="15,875" xadvance="19,25" page="0" chnl="15" />
<char id="184" x="715" y="783,625" width="30,125" height="27,375" xoffset="-0,625" yoffset="44,5" xadvance="28,875" page="0" chnl="15" />
<char id="185" x="352,75" y="789,875" width="33,875" height="39,875" xoffset="-2,125" yoffset="6,5" xadvance="28,625" page="0" chnl="15" />
<char id="186" x="238,125" y="791,125" width="40" height="40,625" xoffset="-5,375" yoffset="5,75" xadvance="28,625" page="0" chnl="15" />
<char id="187" x="69" y="797,25" width="45,375" height="42,375" xoffset="-3,25" yoffset="14,75" xadvance="37,25" page="0" chnl="15" />
<char id="188" x="69,75" y="637,5" width="68,125" height="54,75" xoffset="-3,75" yoffset="6,25" xadvance="59,75" page="0" chnl="15" />
<char id="189" x="0" y="638,375" width="69,625" height="54,75" xoffset="-4,25" yoffset="6,25" xadvance="59,75" page="0" chnl="15" />
<char id="190" x="684" y="572,75" width="70,875" height="55,25" xoffset="-4,375" yoffset="5,75" xadvance="59,75" page="0" chnl="15" />
<char id="191" x="642,75" y="572,75" width="41,125" height="55,375" xoffset="-6" yoffset="6,5" xadvance="30" page="0" chnl="15" />
<char id="192" x="113,75" y="70,375" width="52,5" height="69" xoffset="-8,125" yoffset="-8" xadvance="36,25" page="0" chnl="15" />
<char id="193" x="166,375" y="70,125" width="52,5" height="69" xoffset="-8,125" yoffset="-8" xadvance="36,25" page="0" chnl="15" />
<char id="194" x="255,75" y="139,25" width="52,5" height="68,75" xoffset="-8,125" yoffset="-7,75" xadvance="36,25" page="0" chnl="15" />
<char id="195" x="925,125" y="139" width="52,5" height="67" xoffset="-8,125" yoffset="-6" xadvance="36,25" page="0" chnl="15" />
<char id="196" x="907,875" y="206,25" width="52,5" height="66" xoffset="-8,125" yoffset="-5" xadvance="36,25" page="0" chnl="15" />
<char id="197" x="960,5" y="206,125" width="52,5" height="66" xoffset="-8,125" yoffset="-5" xadvance="36,25" page="0" chnl="15" />
<char id="198" x="321,625" y="633,5" width="66,25" height="54,5" xoffset="-8,5" yoffset="6,5" xadvance="52,375" page="0" chnl="15" />
<char id="199" x="767,625" y="206,5" width="47,875" height="66,125" xoffset="-6,25" yoffset="5,75" xadvance="35,375" page="0" chnl="15" />
<char id="200" x="757,125" y="70" width="42,125" height="69" xoffset="-4" yoffset="-8" xadvance="32,625" page="0" chnl="15" />
<char id="201" x="799,375" y="70" width="42,125" height="69" xoffset="-4" yoffset="-8" xadvance="32,625" page="0" chnl="15" />
<char id="202" x="883,875" y="69,875" width="42,125" height="69" xoffset="-4" yoffset="-8" xadvance="32,625" page="0" chnl="15" />
<char id="203" x="141,375" y="275,625" width="42,125" height="66" xoffset="-4" yoffset="-5" xadvance="32,625" page="0" chnl="15" />
<char id="204" x="36,75" y="139,875" width="36,625" height="69" xoffset="-5,5" yoffset="-8" xadvance="25,625" page="0" chnl="15" />
<char id="205" x="0" y="139,875" width="36,625" height="69" xoffset="-5,5" yoffset="-8" xadvance="25,625" page="0" chnl="15" />
<char id="206" x="968" y="69,75" width="37,875" height="69" xoffset="-6,125" yoffset="-8" xadvance="25,625" page="0" chnl="15" />
<char id="207" x="183,625" y="275,5" width="36,625" height="66" xoffset="-5,5" yoffset="-5" xadvance="25,625" page="0" chnl="15" />
<char id="208" x="499" y="631,125" width="54,75" height="54,5" xoffset="-7,5" yoffset="6,5" xadvance="41" page="0" chnl="15" />
<char id="209" x="642,375" y="139,125" width="48,875" height="67,25" xoffset="-4" yoffset="-6,25" xadvance="40,875" page="0" chnl="15" />
<char id="210" x="326,125" y="0" width="53,25" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="40,75" page="0" chnl="15" />
<char id="211" x="272,75" y="0" width="53,25" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="40,75" page="0" chnl="15" />
<char id="212" x="219,375" y="0" width="53,25" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="40,75" page="0" chnl="15" />
<char id="213" x="360,875" y="139,125" width="53,25" height="68,125" xoffset="-6,25" yoffset="-6,25" xadvance="40,75" page="0" chnl="15" />
<char id="214" x="46,875" y="209" width="53,25" height="66,875" xoffset="-6,25" yoffset="-5" xadvance="40,75" page="0" chnl="15" />
<char id="215" x="197,75" y="743,875" width="47,125" height="47,125" xoffset="-1,875" yoffset="12,375" xadvance="43,375" page="0" chnl="15" />
<char id="216" x="353,5" y="341" width="53,25" height="60,5" xoffset="-6,25" yoffset="3,875" xadvance="40,75" page="0" chnl="15" />
<char id="217" x="580" y="0" width="48,125" height="69,875" xoffset="-4,5" yoffset="-8" xadvance="39,125" page="0" chnl="15" />
<char id="218" x="531,75" y="0" width="48,125" height="69,875" xoffset="-4,5" yoffset="-8" xadvance="39,125" page="0" chnl="15" />
<char id="219" x="483,5" y="0" width="48,125" height="69,875" xoffset="-4,5" yoffset="-8" xadvance="39,125" page="0" chnl="15" />
<char id="220" x="150,875" y="208,5" width="48,125" height="66,875" xoffset="-4,5" yoffset="-5" xadvance="39,125" page="0" chnl="15" />
<char id="221" x="308,375" y="139,125" width="52,375" height="68,75" xoffset="-8,5" yoffset="-7,75" xadvance="35,5" page="0" chnl="15" />
<char id="222" x="384,25" y="688,125" width="45,75" height="54,5" xoffset="-4" yoffset="6,5" xadvance="34,875" page="0" chnl="15" />
<char id="223" x="799,75" y="457,75" width="45,375" height="56,875" xoffset="-4,5" yoffset="4,5" xadvance="34,25" page="0" chnl="15" />
<char id="224" x="591,375" y="339,25" width="43,125" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="31,75" page="0" chnl="15" />
<char id="225" x="850,875" y="338" width="43,125" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="31,75" page="0" chnl="15" />
<char id="226" x="634,625" y="339,25" width="43,125" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="31,75" page="0" chnl="15" />
<char id="227" x="924,375" y="398" width="43,125" height="58,5" xoffset="-6,625" yoffset="3,375" xadvance="31,75" page="0" chnl="15" />
<char id="228" x="202,375" y="463,25" width="43,125" height="57,25" xoffset="-6,625" yoffset="4,625" xadvance="31,75" page="0" chnl="15" />
<char id="229" x="130,125" y="342,125" width="43,125" height="61,25" xoffset="-6,625" yoffset="0,625" xadvance="31,75" page="0" chnl="15" />
<char id="230" x="310,625" y="742,875" width="63,125" height="46,875" xoffset="-6,625" yoffset="15" xadvance="49,625" page="0" chnl="15" />
<char id="231" x="0" y="525,125" width="41,75" height="56,875" xoffset="-6,625" yoffset="15" xadvance="28" page="0" chnl="15" />
<char id="232" x="0" y="406,25" width="44,75" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="31,5" page="0" chnl="15" />
<char id="233" x="939" y="337,25" width="44,75" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="31,5" page="0" chnl="15" />
<char id="234" x="894,125" y="337,75" width="44,75" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="31,5" page="0" chnl="15" />
<char id="235" x="487,25" y="459,625" width="44,75" height="57,125" xoffset="-6,625" yoffset="4,625" xadvance="31,5" page="0" chnl="15" />
<char id="236" x="670,75" y="399,625" width="29,875" height="59,375" xoffset="-8,125" yoffset="1,625" xadvance="16" page="0" chnl="15" />
<char id="237" x="640,75" y="399,625" width="29,875" height="59,375" xoffset="-5,625" yoffset="1,625" xadvance="16" page="0" chnl="15" />
<char id="238" x="606,5" y="399,625" width="34,125" height="59,375" xoffset="-9,125" yoffset="1,625" xadvance="16" page="0" chnl="15" />
<char id="239" x="373,375" y="518,875" width="33,875" height="56,375" xoffset="-8,875" yoffset="4,625" xadvance="16" page="0" chnl="15" />
<char id="240" x="75,5" y="466" width="46,125" height="57,5" xoffset="-6,625" yoffset="4,375" xadvance="32,875" page="0" chnl="15" />
<char id="241" x="32,25" y="466,5" width="43,125" height="57,625" xoffset="-4,5" yoffset="3,375" xadvance="33,875" page="0" chnl="15" />
<char id="242" x="499,125" y="339,375" width="46" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="32,75" page="0" chnl="15" />
<char id="243" x="453" y="339,75" width="46" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="32,75" page="0" chnl="15" />
<char id="244" x="406,875" y="339,75" width="46" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="32,75" page="0" chnl="15" />
<char id="245" x="878,25" y="398,375" width="46" height="58,5" xoffset="-6,625" yoffset="3,375" xadvance="32,75" page="0" chnl="15" />
<char id="246" x="156,25" y="463,75" width="46" height="57,25" xoffset="-6,625" yoffset="4,625" xadvance="32,75" page="0" chnl="15" />
<char id="247" x="0" y="747,875" width="49,375" height="49,875" xoffset="-3" yoffset="11" xadvance="43,375" page="0" chnl="15" />
<char id="248" x="943,625" y="680,75" width="46" height="52,625" xoffset="-6,625" yoffset="12,5" xadvance="32,75" page="0" chnl="15" />
<char id="249" x="677,875" y="339,25" width="43,125" height="60,25" xoffset="-4,75" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="250" x="721,125" y="338,25" width="43,125" height="60,25" xoffset="-4,75" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="251" x="764,375" y="338" width="43,125" height="60,25" xoffset="-4,75" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="252" x="245,625" y="463,25" width="43,125" height="57,25" xoffset="-4,75" yoffset="4,625" xadvance="33,875" page="0" chnl="15" />
<char id="253" x="172,5" y="0" width="46,75" height="70" xoffset="-8,125" yoffset="1,625" xadvance="30,5" page="0" chnl="15" />
<char id="254" x="247,125" y="208,25" width="44,5" height="66,875" xoffset="-4,5" yoffset="4,75" xadvance="33,375" page="0" chnl="15" />
<char id="255" x="0" y="209" width="46,75" height="67" xoffset="-8,125" yoffset="4,625" xadvance="30,5" page="0" chnl="15" />
<char id="256" x="257,125" y="275,25" width="52,5" height="65,875" xoffset="-8,125" yoffset="-4,875" xadvance="36,25" page="0" chnl="15" />
<char id="257" x="620" y="459,125" width="43,125" height="57,125" xoffset="-6,625" yoffset="4,75" xadvance="31,75" page="0" chnl="15" />
<char id="258" x="510,75" y="139,125" width="52,5" height="68" xoffset="-8,125" yoffset="-7" xadvance="36,25" page="0" chnl="15" />
<char id="259" x="746,875" y="398,625" width="43,125" height="59,25" xoffset="-6,625" yoffset="2,625" xadvance="31,75" page="0" chnl="15" />
<char id="260" x="723,25" y="272,75" width="52,5" height="65,125" xoffset="-8,125" yoffset="6,5" xadvance="36,25" page="0" chnl="15" />
<char id="261" x="217" y="520,625" width="43,125" height="56,625" xoffset="-6,625" yoffset="15" xadvance="31,75" page="0" chnl="15" />
<char id="262" x="724,5" y="0" width="47,875" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="263" x="174" y="403" width="41,75" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="28" page="0" chnl="15" />
<char id="264" x="676,5" y="0" width="47,875" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="265" x="131,875" y="403,5" width="42" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="28" page="0" chnl="15" />
<char id="266" x="199,125" y="208,5" width="47,875" height="66,875" xoffset="-6,25" yoffset="-5" xadvance="35,375" page="0" chnl="15" />
<char id="267" x="663,25" y="459,125" width="41,75" height="57,125" xoffset="-6,625" yoffset="4,625" xadvance="28" page="0" chnl="15" />
<char id="268" x="772,5" y="0" width="47,875" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="269" x="89,75" y="403,75" width="42" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="28" page="0" chnl="15" />
<char id="270" x="375" y="70" width="50,375" height="69" xoffset="-4" yoffset="-8" xadvance="40,125" page="0" chnl="15" />
<char id="271" x="288,875" y="462,75" width="59,25" height="57,125" xoffset="-6,625" yoffset="4,75" xadvance="43,375" page="0" chnl="15" />
<char id="272" x="553,875" y="628,375" width="54,75" height="54,5" xoffset="-7,5" yoffset="6,5" xadvance="41" page="0" chnl="15" />
<char id="273" x="348,25" y="461,625" width="47,875" height="57,125" xoffset="-6,625" yoffset="4,75" xadvance="33,125" page="0" chnl="15" />
<char id="274" x="309,75" y="275,125" width="42,125" height="65,875" xoffset="-4" yoffset="-4,875" xadvance="32,625" page="0" chnl="15" />
<char id="275" x="705,125" y="459" width="44,75" height="57" xoffset="-6,625" yoffset="4,75" xadvance="31,5" page="0" chnl="15" />
<char id="276" x="563,375" y="139,125" width="42,125" height="68" xoffset="-4" yoffset="-7" xadvance="32,625" page="0" chnl="15" />
<char id="277" x="833,375" y="398,375" width="44,75" height="59,125" xoffset="-6,625" yoffset="2,625" xadvance="31,5" page="0" chnl="15" />
<char id="278" x="99,125" y="276" width="42,125" height="66" xoffset="-4" yoffset="-5" xadvance="32,625" page="0" chnl="15" />
<char id="279" x="442,375" y="461,125" width="44,75" height="57,125" xoffset="-6,625" yoffset="4,625" xadvance="31,5" page="0" chnl="15" />
<char id="280" x="824,125" y="272,75" width="42,125" height="65,125" xoffset="-4" yoffset="6,5" xadvance="32,625" page="0" chnl="15" />
<char id="281" x="82,875" y="523,625" width="44,75" height="56,625" xoffset="-6,625" yoffset="15" xadvance="31,5" page="0" chnl="15" />
<char id="282" x="841,625" y="69,875" width="42,125" height="69" xoffset="-4" yoffset="-8" xadvance="32,625" page="0" chnl="15" />
<char id="283" x="44,875" y="405,75" width="44,75" height="60,125" xoffset="-6,625" yoffset="1,625" xadvance="31,5" page="0" chnl="15" />
<char id="284" x="432,875" y="0" width="50,5" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="39,5" page="0" chnl="15" />
<char id="285" x="44,625" y="0" width="44,5" height="70,25" xoffset="-6,625" yoffset="1,625" xadvance="33,375" page="0" chnl="15" />
<char id="286" x="156,875" y="139,5" width="50,5" height="68,875" xoffset="-6,25" yoffset="-7" xadvance="39,5" page="0" chnl="15" />
<char id="287" x="0" y="70,5" width="44,5" height="69,25" xoffset="-6,625" yoffset="2,625" xadvance="33,375" page="0" chnl="15" />
<char id="288" x="100,25" y="208,625" width="50,5" height="66,875" xoffset="-6,25" yoffset="-5" xadvance="39,5" page="0" chnl="15" />
<char id="289" x="691,375" y="139,125" width="44,5" height="67,25" xoffset="-6,625" yoffset="4,625" xadvance="33,375" page="0" chnl="15" />
<char id="290" x="717" y="206,5" width="50,5" height="66,125" xoffset="-6,25" yoffset="5,75" xadvance="39,5" page="0" chnl="15" />
<char id="291" x="0" y="0" width="44,5" height="70,375" xoffset="-6,625" yoffset="1,5" xadvance="33,375" page="0" chnl="15" />
<char id="292" x="523,5" y="70" width="48,5" height="69" xoffset="-4" yoffset="-8" xadvance="40,5" page="0" chnl="15" />
<char id="293" x="713,875" y="70" width="43,125" height="69" xoffset="-4,5" yoffset="-8" xadvance="33,875" page="0" chnl="15" />
<char id="294" x="388" y="631,5" width="55,375" height="54,5" xoffset="-7" yoffset="6,5" xadvance="41,375" page="0" chnl="15" />
<char id="295" x="533" y="516,5" width="46,5" height="56,25" xoffset="-8,125" yoffset="4,75" xadvance="33,625" page="0" chnl="15" />
<char id="296" x="779,75" y="139,125" width="38,75" height="67,25" xoffset="-6,5" yoffset="-6,25" xadvance="25,625" page="0" chnl="15" />
<char id="297" x="121,75" y="464" width="34,375" height="57,5" xoffset="-9,125" yoffset="3,5" xadvance="16" page="0" chnl="15" />
<char id="298" x="352" y="275" width="36,625" height="65,875" xoffset="-5,5" yoffset="-4,875" xadvance="25,625" page="0" chnl="15" />
<char id="299" x="821,625" y="514,75" width="31,25" height="56,25" xoffset="-7,625" yoffset="4,75" xadvance="16" page="0" chnl="15" />
<char id="300" x="605,625" y="139,125" width="36,625" height="68" xoffset="-5,5" yoffset="-7" xadvance="25,625" page="0" chnl="15" />
<char id="301" x="0" y="466,5" width="32,125" height="58,5" xoffset="-8" yoffset="2,5" xadvance="16" page="0" chnl="15" />
<char id="302" x="866,375" y="272,5" width="36,625" height="65,125" xoffset="-5,5" yoffset="6,5" xadvance="25,625" page="0" chnl="15" />
<char id="303" x="977,75" y="138,875" width="26,375" height="67" xoffset="-5,5" yoffset="4,625" xadvance="16" page="0" chnl="15" />
<char id="304" x="220,375" y="275,5" width="36,625" height="66" xoffset="-5,5" yoffset="-5" xadvance="25,625" page="0" chnl="15" />
<char id="305" x="0" y="797,875" width="25" height="45,125" xoffset="-4,5" yoffset="15,875" xadvance="16" page="0" chnl="15" />
<char id="306" x="884,875" y="570,875" width="59,875" height="55,125" xoffset="-5,5" yoffset="6,5" xadvance="49,875" page="0" chnl="15" />
<char id="307" x="736" y="139,125" width="43,625" height="67,25" xoffset="-4,75" yoffset="4,625" xadvance="34,375" page="0" chnl="15" />
<char id="308" x="961,125" y="0" width="40,875" height="69,625" xoffset="-7,875" yoffset="-8" xadvance="26,5" page="0" chnl="15" />
<char id="309" x="89,25" y="0" width="36,25" height="70,25" xoffset="-10,125" yoffset="1,625" xadvance="19,25" page="0" chnl="15" />
<char id="310" x="440,5" y="274,25" width="49,75" height="65,375" xoffset="-4" yoffset="6,5" xadvance="36,875" page="0" chnl="15" />
<char id="311" x="852,625" y="139" width="45" height="67,125" xoffset="-4,5" yoffset="4,75" xadvance="31,875" page="0" chnl="15" />
<char id="312" x="895" y="734,25" width="45" height="45,125" xoffset="-4,5" yoffset="15,875" xadvance="31,875" page="0" chnl="15" />
<char id="313" x="926,125" y="69,875" width="41,75" height="69" xoffset="-4" yoffset="-8" xadvance="30,375" page="0" chnl="15" />
<char id="314" x="73,5" y="139,5" width="29,875" height="69" xoffset="-5,5" yoffset="-8" xadvance="16" page="0" chnl="15" />
<char id="315" x="681,375" y="272,75" width="41,75" height="65,375" xoffset="-4" yoffset="6,5" xadvance="30,375" page="0" chnl="15" />
<char id="316" x="897,75" y="139" width="27,25" height="67,125" xoffset="-5,5" yoffset="4,75" xadvance="16" page="0" chnl="15" />
<char id="317" x="668" y="516,375" width="43" height="56,25" xoffset="-4" yoffset="4,75" xadvance="30,375" page="0" chnl="15" />
<char id="318" x="711,125" y="516,125" width="39,75" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="26" page="0" chnl="15" />
<char id="319" x="604,5" y="683" width="41,75" height="54,5" xoffset="-4" yoffset="6,5" xadvance="30,375" page="0" chnl="15" />
<char id="320" x="751" y="515" width="37,5" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="25,875" page="0" chnl="15" />
<char id="321" x="338" y="688,125" width="46,125" height="54,5" xoffset="-7,5" yoffset="6,5" xadvance="31,25" page="0" chnl="15" />
<char id="322" x="788,625" y="515" width="32,875" height="56,25" xoffset="-7,5" yoffset="4,75" xadvance="17,75" page="0" chnl="15" />
<char id="323" x="425,5" y="70" width="48,875" height="69" xoffset="-4" yoffset="-8" xadvance="40,875" page="0" chnl="15" />
<char id="324" x="401,375" y="401,625" width="43,125" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="325" x="490,375" y="273,875" width="48,875" height="65,375" xoffset="-4" yoffset="6,5" xadvance="40,875" page="0" chnl="15" />
<char id="326" x="934,5" y="456,625" width="43,125" height="56,875" xoffset="-4,5" yoffset="15" xadvance="33,875" page="0" chnl="15" />
<char id="327" x="474,5" y="70" width="48,875" height="69" xoffset="-4" yoffset="-8" xadvance="40,875" page="0" chnl="15" />
<char id="328" x="444,625" y="400,125" width="43,125" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="329" x="433,125" y="518,875" width="53,125" height="56,25" xoffset="-9" yoffset="4,75" xadvance="39,375" page="0" chnl="15" />
<char id="330" x="539,375" y="273,875" width="48,875" height="65,375" xoffset="-4" yoffset="6,5" xadvance="40,875" page="0" chnl="15" />
<char id="331" x="977,75" y="456,125" width="43,125" height="56,875" xoffset="-4,5" yoffset="15" xadvance="33,875" page="0" chnl="15" />
<char id="332" x="362,25" y="207,375" width="53,25" height="66,75" xoffset="-6,25" yoffset="-4,875" xadvance="40,75" page="0" chnl="15" />
<char id="333" x="396,25" y="461,625" width="46" height="57,125" xoffset="-6,625" yoffset="4,75" xadvance="32,75" page="0" chnl="15" />
<char id="334" x="103,5" y="139,5" width="53,25" height="68,875" xoffset="-6,25" yoffset="-7" xadvance="40,75" page="0" chnl="15" />
<char id="335" x="700,75" y="399,625" width="46" height="59,25" xoffset="-6,625" yoffset="2,625" xadvance="32,75" page="0" chnl="15" />
<char id="336" x="379,5" y="0" width="53,25" height="69,875" xoffset="-6,25" yoffset="-8" xadvance="40,75" page="0" chnl="15" />
<char id="337" x="545,25" y="339,375" width="46" height="60,25" xoffset="-6,625" yoffset="1,625" xadvance="32,75" page="0" chnl="15" />
<char id="338" x="254,875" y="633,625" width="66,625" height="54,5" xoffset="-6,25" yoffset="6,5" xadvance="55" page="0" chnl="15" />
<char id="339" x="245" y="743,875" width="65,5" height="46,875" xoffset="-6,625" yoffset="15" xadvance="52,25" page="0" chnl="15" />
<char id="340" x="323,25" y="70" width="51,625" height="69" xoffset="-4" yoffset="-8" xadvance="38,5" page="0" chnl="15" />
<char id="341" x="570,875" y="399,75" width="35,5" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="23" page="0" chnl="15" />
<char id="342" x="388,75" y="274,25" width="51,625" height="65,375" xoffset="-4" yoffset="6,5" xadvance="38,5" page="0" chnl="15" />
<char id="343" x="380,75" y="575,375" width="35,5" height="56" xoffset="-4,5" yoffset="15,875" xadvance="23" page="0" chnl="15" />
<char id="344" x="271,5" y="70" width="51,625" height="69" xoffset="-4" yoffset="-8" xadvance="38,5" page="0" chnl="15" />
<char id="345" x="983,875" y="336,625" width="38,875" height="59,375" xoffset="-6,625" yoffset="1,625" xadvance="23" page="0" chnl="15" />
<char id="346" x="867,375" y="0" width="46,75" height="69,75" xoffset="-6,125" yoffset="-8" xadvance="33,625" page="0" chnl="15" />
<char id="347" x="256,875" y="402,5" width="40,875" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,25" page="0" chnl="15" />
<char id="348" x="820,5" y="0" width="46,75" height="69,75" xoffset="-6,125" yoffset="-8" xadvance="33,625" page="0" chnl="15" />
<char id="349" x="215,875" y="403" width="40,875" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,25" page="0" chnl="15" />
<char id="350" x="815,625" y="206,5" width="46,75" height="66,125" xoffset="-6,125" yoffset="5,75" xadvance="33,625" page="0" chnl="15" />
<char id="351" x="41,875" y="524,25" width="40,875" height="56,875" xoffset="-6,5" yoffset="15" xadvance="27,25" page="0" chnl="15" />
<char id="352" x="914,25" y="0" width="46,75" height="69,75" xoffset="-6,125" yoffset="-8" xadvance="33,625" page="0" chnl="15" />
<char id="353" x="297,875" y="402,125" width="40,875" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,25" page="0" chnl="15" />
<char id="354" x="588,375" y="273,75" width="48,375" height="65,375" xoffset="-8" yoffset="6,5" xadvance="32,5" page="0" chnl="15" />
<char id="355" x="980,875" y="272,25" width="37,25" height="64,25" xoffset="-7,5" yoffset="7,625" xadvance="22" page="0" chnl="15" />
<char id="356" x="572,125" y="70" width="48,375" height="69" xoffset="-8" yoffset="-8" xadvance="32,5" page="0" chnl="15" />
<char id="357" x="750" y="458" width="49,625" height="56,875" xoffset="-7,5" yoffset="4,75" xadvance="32,875" page="0" chnl="15" />
<char id="358" x="195,875" y="689,25" width="48,375" height="54,5" xoffset="-8" yoffset="6,5" xadvance="32,5" page="0" chnl="15" />
<char id="359" x="856,75" y="681,375" width="37,25" height="54" xoffset="-7,5" yoffset="7,625" xadvance="22" page="0" chnl="15" />
<char id="360" x="414,25" y="139,125" width="48,125" height="68,125" xoffset="-4,5" yoffset="-6,25" xadvance="39,125" page="0" chnl="15" />
<char id="361" x="967,625" y="397,5" width="43,125" height="58,5" xoffset="-4,75" yoffset="3,375" xadvance="33,875" page="0" chnl="15" />
<char id="362" x="415,625" y="207,375" width="48,125" height="66,75" xoffset="-4,5" yoffset="-4,875" xadvance="39,125" page="0" chnl="15" />
<char id="363" x="576,75" y="459,25" width="43,125" height="57,125" xoffset="-4,75" yoffset="4,75" xadvance="33,875" page="0" chnl="15" />
<char id="364" x="207,5" y="139,25" width="48,125" height="68,875" xoffset="-4,5" yoffset="-7" xadvance="39,125" page="0" chnl="15" />
<char id="365" x="790,125" y="398,375" width="43,125" height="59,25" xoffset="-4,75" yoffset="2,625" xadvance="33,875" page="0" chnl="15" />
<char id="366" x="462,5" y="139,125" width="48,125" height="68,125" xoffset="-4,5" yoffset="-6,25" xadvance="39,125" page="0" chnl="15" />
<char id="367" x="86,875" y="342,125" width="43,125" height="61,5" xoffset="-4,75" yoffset="0,375" xadvance="33,875" page="0" chnl="15" />
<char id="368" x="628,25" y="0" width="48,125" height="69,875" xoffset="-4,5" yoffset="-8" xadvance="39,125" page="0" chnl="15" />
<char id="369" x="807,625" y="338" width="43,125" height="60,25" xoffset="-4,75" yoffset="1,625" xadvance="33,875" page="0" chnl="15" />
<char id="370" x="775,875" y="272,75" width="48,125" height="65,125" xoffset="-4,5" yoffset="6,5" xadvance="39,125" page="0" chnl="15" />
<char id="371" x="506,875" y="574,75" width="43,125" height="55,75" xoffset="-4,75" yoffset="15,875" xadvance="33,875" page="0" chnl="15" />
<char id="372" x="44,625" y="70,375" width="69" height="69" xoffset="-7,25" yoffset="-8" xadvance="54,5" page="0" chnl="15" />
<char id="373" x="338,875" y="402,125" width="62,375" height="59,375" xoffset="-7,625" yoffset="1,625" xadvance="47,125" page="0" chnl="15" />
<char id="374" x="219" y="70,125" width="52,375" height="69" xoffset="-8,5" yoffset="-8" xadvance="35,5" page="0" chnl="15" />
<char id="375" x="125,625" y="0" width="46,75" height="70" xoffset="-8,125" yoffset="1,625" xadvance="30,5" page="0" chnl="15" />
<char id="376" x="0" y="276,125" width="52,375" height="66" xoffset="-8,5" yoffset="-5" xadvance="35,5" page="0" chnl="15" />
<char id="377" x="667,25" y="70" width="46,5" height="69" xoffset="-6,625" yoffset="-8" xadvance="33" page="0" chnl="15" />
<char id="378" x="529,375" y="399,75" width="41,375" height="59,375" xoffset="-6,75" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="379" x="52,5" y="276" width="46,5" height="66" xoffset="-6,625" yoffset="-5" xadvance="33" page="0" chnl="15" />
<char id="380" x="331,875" y="520" width="41,375" height="56,375" xoffset="-6,75" yoffset="4,625" xadvance="27,875" page="0" chnl="15" />
<char id="381" x="620,625" y="70" width="46,5" height="69" xoffset="-6,625" yoffset="-8" xadvance="33" page="0" chnl="15" />
<char id="382" x="487,875" y="400,125" width="41,375" height="59,375" xoffset="-6,75" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="383" x="297,875" y="520" width="33,875" height="56,5" xoffset="-4,5" yoffset="4,5" xadvance="17,125" page="0" chnl="15" />
</chars>
</font>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 KiB

View file

@ -1,796 +0,0 @@
<?xml version="1.0"?>
<font>
<info face="Tahoma" size="64" bold="0" italic="0" charset="" unicode="1" stretchH="100" smooth="0" aa="1" padding="64,64,64,64" spacing="1,1" outline="0" />
<common lineHeight="64" base="53" scaleW="1024" scaleH="1024" pages="1" packed="0" alphaChnl="0" redChnl="0" greenChnl="0" blueChnl="0" />
<pages>
<page id="0" file="TahomaN_0.png" />
</pages>
<chars count="319">
<char id="32" x="1005,625" y="0" width="16,125" height="16,125" xoffset="-8" yoffset="45" xadvance="16,625" page="0" chnl="15" />
<char id="33" x="667,125" y="619,5" width="21,75" height="54,5" xoffset="-2,125" yoffset="6,5" xadvance="17,625" page="0" chnl="15" />
<char id="34" x="338,875" y="724,5" width="31,375" height="31" xoffset="-5" yoffset="4,75" xadvance="21,25" page="0" chnl="15" />
<char id="35" x="647,25" y="564,875" width="47,25" height="54,5" xoffset="-4,375" yoffset="6,5" xadvance="38,5" page="0" chnl="15" />
<char id="36" x="42,25" y="208,375" width="39,75" height="66,125" xoffset="-5,25" yoffset="4,125" xadvance="28,875" page="0" chnl="15" />
<char id="37" x="538,875" y="453,5" width="62,5" height="56" xoffset="-5,375" yoffset="5,75" xadvance="51,75" page="0" chnl="15" />
<char id="38" x="601,5" y="453,375" width="51,625" height="56" xoffset="-6,25" yoffset="5,75" xadvance="35,75" page="0" chnl="15" />
<char id="39" x="370,375" y="724,5" width="21,625" height="31" xoffset="-5,25" yoffset="4,75" xadvance="11,125" page="0" chnl="15" />
<char id="40" x="686,25" y="139" width="31,625" height="66,875" xoffset="-5,25" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="41" x="718" y="139" width="31,625" height="66,875" xoffset="-6,125" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="42" x="66,75" y="727,125" width="39,375" height="40" xoffset="-5,125" yoffset="4,75" xadvance="28,875" page="0" chnl="15" />
<char id="43" x="973,75" y="613,75" width="46,5" height="46,375" xoffset="-4" yoffset="12,875" xadvance="38,5" page="0" chnl="15" />
<char id="44" x="267" y="725,875" width="27" height="33" xoffset="-6,125" yoffset="37,625" xadvance="16" page="0" chnl="15" />
<char id="45" x="598,875" y="719,5" width="30,625" height="20,625" xoffset="-5,625" yoffset="25,75" xadvance="19,25" page="0" chnl="15" />
<char id="46" x="522,375" y="722,5" width="22,125" height="23,375" xoffset="-3,125" yoffset="37,625" xadvance="16" page="0" chnl="15" />
<char id="47" x="79,5" y="274,625" width="35,5" height="64,625" xoffset="-8,625" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="48" x="920,5" y="447,75" width="40,625" height="56" xoffset="-5,875" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="49" x="0" y="571,625" width="34,875" height="54,625" xoffset="-2,25" yoffset="6,375" xadvance="28,875" page="0" chnl="15" />
<char id="50" x="581,375" y="509,625" width="39,75" height="55,25" xoffset="-5,125" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="51" x="961,25" y="447,125" width="39,375" height="56" xoffset="-5,5" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="52" x="131" y="625,875" width="42,625" height="54,5" xoffset="-7" yoffset="6,5" xadvance="28,875" page="0" chnl="15" />
<char id="53" x="660,375" y="506,375" width="39" height="55,25" xoffset="-4,75" yoffset="6,5" xadvance="28,875" page="0" chnl="15" />
<char id="54" x="879,375" y="447,75" width="41" height="56" xoffset="-5,75" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="55" x="341,375" y="624,125" width="40,5" height="54,5" xoffset="-5,375" yoffset="6,5" xadvance="28,875" page="0" chnl="15" />
<char id="56" x="497,625" y="453,625" width="41,125" height="56,125" xoffset="-6,125" yoffset="5,625" xadvance="28,875" page="0" chnl="15" />
<char id="57" x="838,25" y="448,375" width="41" height="56" xoffset="-6,25" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="58" x="723" y="670,25" width="22,125" height="44,875" xoffset="-1,75" yoffset="16,125" xadvance="18,75" page="0" chnl="15" />
<char id="59" x="640" y="619,625" width="27" height="54,5" xoffset="-4,875" yoffset="16,125" xadvance="18,75" page="0" chnl="15" />
<char id="60" x="354,625" y="678,75" width="43,75" height="45,625" xoffset="-2,75" yoffset="13,375" xadvance="38,5" page="0" chnl="15" />
<char id="61" x="294,125" y="725,875" width="44,625" height="31" xoffset="-3" yoffset="20,625" xadvance="38,5" page="0" chnl="15" />
<char id="62" x="310,75" y="678,75" width="43,75" height="45,625" xoffset="-2,375" yoffset="13,375" xadvance="38,5" page="0" chnl="15" />
<char id="63" x="775,125" y="506" width="36,75" height="55,25" xoffset="-5,125" yoffset="5,75" xadvance="25,125" page="0" chnl="15" />
<char id="64" x="708,375" y="271,375" width="57,75" height="61,125" xoffset="-4,625" yoffset="5,75" xadvance="48,125" page="0" chnl="15" />
<char id="65" x="550,625" y="565" width="48,25" height="54,5" xoffset="-8,25" yoffset="6,5" xadvance="31,75" page="0" chnl="15" />
<char id="66" x="216,5" y="625,5" width="42,125" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="31,25" page="0" chnl="15" />
<char id="67" x="750,625" y="449,875" width="45,25" height="56" xoffset="-6,25" yoffset="5,75" xadvance="31,875" page="0" chnl="15" />
<char id="68" x="836,375" y="560,125" width="46,375" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="36" page="0" chnl="15" />
<char id="69" x="422,5" y="622,875" width="40,125" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="29,75" page="0" chnl="15" />
<char id="70" x="462,75" y="622,875" width="39,125" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="27,625" page="0" chnl="15" />
<char id="71" x="703,375" y="450,25" width="47,125" height="56" xoffset="-6,25" yoffset="5,75" xadvance="35,375" page="0" chnl="15" />
<char id="72" x="0" y="626,375" width="44" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="35,75" page="0" chnl="15" />
<char id="73" x="579" y="619,625" width="30,875" height="54,5" xoffset="-5,5" yoffset="6,5" xadvance="19,75" page="0" chnl="15" />
<char id="74" x="901,75" y="503,875" width="34,25" height="55,125" xoffset="-7,75" yoffset="6,5" xadvance="22,125" page="0" chnl="15" />
<char id="75" x="975,25" y="558,125" width="44,125" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="31,125" page="0" chnl="15" />
<char id="76" x="540,5" y="619,875" width="38,375" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="26,375" page="0" chnl="15" />
<char id="77" x="501,375" y="565,25" width="49,125" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="40,875" page="0" chnl="15" />
<char id="78" x="44,125" y="626" width="43,625" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="35,375" page="0" chnl="15" />
<char id="79" x="653,25" y="450,25" width="50" height="56" xoffset="-6,25" yoffset="5,75" xadvance="37,5" page="0" chnl="15" />
<char id="80" x="382" y="624" width="40,375" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="29,25" page="0" chnl="15" />
<char id="81" x="213,125" y="207,75" width="50,125" height="65,375" xoffset="-6,25" yoffset="5,75" xadvance="37,5" page="0" chnl="15" />
<char id="82" x="929,25" y="559,125" width="45,875" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="32,875" page="0" chnl="15" />
<char id="83" x="796" y="448,75" width="42,125" height="56" xoffset="-6" yoffset="5,75" xadvance="29,5" page="0" chnl="15" />
<char id="84" x="789,125" y="561,375" width="47,125" height="54,5" xoffset="-8,125" yoffset="6,5" xadvance="31" page="0" chnl="15" />
<char id="85" x="455,125" y="511" width="43,75" height="55,25" xoffset="-4,5" yoffset="6,5" xadvance="34,75" page="0" chnl="15" />
<char id="86" x="599" y="565" width="48,125" height="54,5" xoffset="-8,25" yoffset="6,5" xadvance="31,625" page="0" chnl="15" />
<char id="87" x="163,125" y="570,875" width="62,5" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="47,75" page="0" chnl="15" />
<char id="88" x="882,875" y="559,75" width="46,25" height="54,5" xoffset="-7,75" yoffset="6,5" xadvance="30,75" page="0" chnl="15" />
<char id="89" x="741,875" y="561,75" width="47,125" height="54,5" xoffset="-8,25" yoffset="6,5" xadvance="30,5" page="0" chnl="15" />
<char id="90" x="87,875" y="626" width="43" height="54,5" xoffset="-6,5" yoffset="6,5" xadvance="29,625" page="0" chnl="15" />
<char id="91" x="824,75" y="139" width="29,5" height="66,375" xoffset="-3,75" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="92" x="43,875" y="274,625" width="35,5" height="64,625" xoffset="-6,625" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="93" x="854,375" y="139" width="29,5" height="66,375" xoffset="-5,5" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="94" x="137,125" y="727,125" width="47,625" height="36,875" xoffset="-4,5" yoffset="6,5" xadvance="38,5" page="0" chnl="15" />
<char id="95" x="706,25" y="719,125" width="45,625" height="19,375" xoffset="-8,375" yoffset="49,375" xadvance="28,875" page="0" chnl="15" />
<char id="96" x="495,375" y="722,5" width="26,875" height="25,625" xoffset="-1,625" yoffset="1,625" xadvance="28,875" page="0" chnl="15" />
<char id="97" x="101,625" y="680,625" width="39" height="46,375" xoffset="-6,5" yoffset="15,375" xadvance="27,875" page="0" chnl="15" />
<char id="98" x="690,375" y="393,125" width="40,25" height="57" xoffset="-4,5" yoffset="4,75" xadvance="29,25" page="0" chnl="15" />
<char id="99" x="181,75" y="680,125" width="38,125" height="46,25" xoffset="-6,5" yoffset="15,375" xadvance="24,5" page="0" chnl="15" />
<char id="100" x="650" y="393,125" width="40,25" height="57" xoffset="-6,5" yoffset="4,75" xadvance="29,25" page="0" chnl="15" />
<char id="101" x="140,75" y="680,5" width="40,875" height="46,25" xoffset="-6,5" yoffset="15,375" xadvance="27,875" page="0" chnl="15" />
<char id="102" x="966" y="390,5" width="34" height="56,5" xoffset="-7,25" yoffset="4,5" xadvance="16,875" page="0" chnl="15" />
<char id="103" x="772,875" y="392,125" width="40,25" height="56,5" xoffset="-6,5" yoffset="15,375" xadvance="29,25" page="0" chnl="15" />
<char id="104" x="324,125" y="457,125" width="38,625" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="29,5" page="0" chnl="15" />
<char id="105" x="1000,75" y="446,125" width="21,5" height="54,75" xoffset="-4,625" yoffset="6,25" xadvance="12,125" page="0" chnl="15" />
<char id="106" x="159,125" y="208" width="29,75" height="65,625" xoffset="-10,375" yoffset="6,25" xadvance="14,875" page="0" chnl="15" />
<char id="107" x="284" y="457,5" width="40" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="26,375" page="0" chnl="15" />
<char id="108" x="1000,125" y="389,75" width="20,875" height="56,25" xoffset="-4,375" yoffset="4,75" xadvance="12,125" page="0" chnl="15" />
<char id="109" x="257" y="680,125" width="53,625" height="45,625" xoffset="-4,5" yoffset="15,375" xadvance="44,5" page="0" chnl="15" />
<char id="110" x="437,25" y="677,5" width="38,625" height="45,625" xoffset="-4,5" yoffset="15,375" xadvance="29,5" page="0" chnl="15" />
<char id="111" x="59,75" y="680,625" width="41,75" height="46,375" xoffset="-6,5" yoffset="15,375" xadvance="28,75" page="0" chnl="15" />
<char id="112" x="203,25" y="458,125" width="40,25" height="56,25" xoffset="-4,5" yoffset="15,375" xadvance="29,25" page="0" chnl="15" />
<char id="113" x="243,625" y="457,625" width="40,25" height="56,25" xoffset="-6,5" yoffset="15,375" xadvance="29,25" page="0" chnl="15" />
<char id="114" x="691,5" y="674,125" width="31,375" height="44,875" xoffset="-4,5" yoffset="16,125" xadvance="19,125" page="0" chnl="15" />
<char id="115" x="220" y="680,125" width="36,875" height="46,25" xoffset="-6,25" yoffset="15,375" xadvance="23,625" page="0" chnl="15" />
<char id="116" x="710,875" y="616,375" width="33" height="53,75" xoffset="-7,375" yoffset="7,875" xadvance="17,75" page="0" chnl="15" />
<char id="117" x="398,5" y="678,625" width="38,625" height="45,625" xoffset="-4,625" yoffset="16,125" xadvance="29,5" page="0" chnl="15" />
<char id="118" x="530" y="674,5" width="42,125" height="44,875" xoffset="-7,875" yoffset="16,125" xadvance="26,375" page="0" chnl="15" />
<char id="119" x="476" y="677,5" width="53,875" height="44,875" xoffset="-7,25" yoffset="16,125" xadvance="39,375" page="0" chnl="15" />
<char id="120" x="572,25" y="674,5" width="41,75" height="44,875" xoffset="-7,75" yoffset="16,125" xadvance="26,25" page="0" chnl="15" />
<char id="121" x="71,875" y="515,625" width="42,125" height="55,5" xoffset="-7,875" yoffset="16,125" xadvance="26,375" page="0" chnl="15" />
<char id="122" x="654,25" y="674,25" width="37,125" height="44,875" xoffset="-6,75" yoffset="16,125" xadvance="23,5" page="0" chnl="15" />
<char id="123" x="749,75" y="139" width="37,375" height="66,375" xoffset="-6,5" yoffset="4,75" xadvance="25,5" page="0" chnl="15" />
<char id="124" x="884" y="139" width="20,375" height="66,375" xoffset="0" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="125" x="787,25" y="139" width="37,375" height="66,375" xoffset="-5,5" yoffset="4,75" xadvance="25,5" page="0" chnl="15" />
<char id="126" x="392,125" y="724,5" width="47,5" height="29,75" xoffset="-4,5" yoffset="21" xadvance="38,5" page="0" chnl="15" />
<char id="160" x="1003,5" y="501" width="16,125" height="16,125" xoffset="-8" yoffset="45" xadvance="16,625" page="0" chnl="15" />
<char id="161" x="689" y="619,5" width="21,75" height="54,5" xoffset="-2,125" yoffset="6,5" xadvance="17,625" page="0" chnl="15" />
<char id="162" x="592,125" y="271,625" width="38,25" height="63,5" xoffset="-5" yoffset="6,875" xadvance="28,875" page="0" chnl="15" />
<char id="163" x="540,875" y="509,625" width="40,375" height="55,25" xoffset="-5,75" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="164" x="810,25" y="668,25" width="41,625" height="41,75" xoffset="-6,25" yoffset="15,125" xadvance="28,875" page="0" chnl="15" />
<char id="165" x="258,75" y="624,75" width="41,875" height="54,5" xoffset="-6,625" yoffset="6,5" xadvance="28,875" page="0" chnl="15" />
<char id="166" x="904,5" y="139" width="20,375" height="66,375" xoffset="0" yoffset="4,75" xadvance="20,25" page="0" chnl="15" />
<char id="167" x="701,875" y="206" width="38,75" height="65,25" xoffset="-4,875" yoffset="5,75" xadvance="28,875" page="0" chnl="15" />
<char id="168" x="566,875" y="719,5" width="31,875" height="21" xoffset="-1,5" yoffset="6,25" xadvance="28,875" page="0" chnl="15" />
<char id="169" x="766,25" y="271,375" width="60,75" height="60,75" xoffset="-5,75" yoffset="5,75" xadvance="49,25" page="0" chnl="15" />
<char id="170" x="970,875" y="660,875" width="35,625" height="41,25" xoffset="-5" yoffset="5,75" xadvance="26,125" page="0" chnl="15" />
<char id="171" x="852" y="665" width="40,375" height="41,375" xoffset="-5,375" yoffset="15,375" xadvance="30,375" page="0" chnl="15" />
<char id="172" x="220,75" y="726,5" width="46,125" height="34,25" xoffset="-3,875" yoffset="25,25" xadvance="38,5" page="0" chnl="15" />
<char id="173" x="629,625" y="719,25" width="30,625" height="20,625" xoffset="-5,625" yoffset="25,75" xadvance="19,25" page="0" chnl="15" />
<char id="174" x="827,125" y="270,75" width="60,75" height="60,75" xoffset="-5,75" yoffset="5,75" xadvance="49,25" page="0" chnl="15" />
<char id="175" x="660,375" y="719,25" width="45,75" height="19,375" xoffset="-8,375" yoffset="-1,25" xadvance="28,875" page="0" chnl="15" />
<char id="176" x="184,875" y="726,5" width="35,75" height="35,625" xoffset="-5,375" yoffset="5,75" xadvance="25" page="0" chnl="15" />
<char id="177" x="865,875" y="614,75" width="46,5" height="48,25" xoffset="-4" yoffset="8,625" xadvance="38,5" page="0" chnl="15" />
<char id="178" x="33" y="727,5" width="33,625" height="40,625" xoffset="-3,25" yoffset="5,75" xadvance="26,125" page="0" chnl="15" />
<char id="179" x="0" y="727,5" width="32,875" height="41,25" xoffset="-3,25" yoffset="5,75" xadvance="26,125" page="0" chnl="15" />
<char id="180" x="468,375" y="723,25" width="26,875" height="25,625" xoffset="3,625" yoffset="1,625" xadvance="28,875" page="0" chnl="15" />
<char id="181" x="156" y="515,25" width="39,125" height="55,5" xoffset="-4,5" yoffset="16,125" xadvance="30,125" page="0" chnl="15" />
<char id="182" x="519,125" y="272" width="39,875" height="63,875" xoffset="-6,5" yoffset="6,5" xadvance="28,875" page="0" chnl="15" />
<char id="183" x="544,625" y="719,5" width="22,125" height="23,375" xoffset="-1,75" yoffset="16,125" xadvance="18,75" page="0" chnl="15" />
<char id="184" x="439,75" y="723,25" width="28,5" height="27,375" xoffset="-0,5" yoffset="44,5" xadvance="28,875" page="0" chnl="15" />
<char id="185" x="106,25" y="727,125" width="30,75" height="39,875" xoffset="-1,625" yoffset="6,5" xadvance="26,125" page="0" chnl="15" />
<char id="186" x="933" y="660,875" width="37,75" height="41,25" xoffset="-5,75" yoffset="5,75" xadvance="26,125" page="0" chnl="15" />
<char id="187" x="892,5" y="663,125" width="40,375" height="41,375" xoffset="-4,625" yoffset="15,375" xadvance="30,375" page="0" chnl="15" />
<char id="188" x="287,75" y="569,5" width="59,25" height="54,5" xoffset="-3,5" yoffset="6,5" xadvance="53" page="0" chnl="15" />
<char id="189" x="225,75" y="570,125" width="61,875" height="54,5" xoffset="-3,5" yoffset="6,5" xadvance="53" page="0" chnl="15" />
<char id="190" x="393,375" y="512,875" width="61,625" height="55,25" xoffset="-4,375" yoffset="5,75" xadvance="53" page="0" chnl="15" />
<char id="191" x="738,25" y="506,375" width="36,75" height="55,25" xoffset="-6,5" yoffset="6,5" xadvance="25,125" page="0" chnl="15" />
<char id="192" x="62,625" y="70,25" width="48,25" height="69" xoffset="-8,25" yoffset="-8" xadvance="31,75" page="0" chnl="15" />
<char id="193" x="111" y="70,25" width="48,25" height="69" xoffset="-8,25" yoffset="-8" xadvance="31,75" page="0" chnl="15" />
<char id="194" x="141,25" y="139,375" width="48,25" height="68,5" xoffset="-8,25" yoffset="-7,5" xadvance="31,75" page="0" chnl="15" />
<char id="195" x="597,5" y="139" width="48,25" height="66,875" xoffset="-8,25" yoffset="-5,875" xadvance="31,75" page="0" chnl="15" />
<char id="196" x="430,5" y="272,5" width="48,25" height="63,875" xoffset="-8,25" yoffset="-2,875" xadvance="31,75" page="0" chnl="15" />
<char id="197" x="403,875" y="139" width="48,25" height="67,5" xoffset="-8,25" yoffset="-6,5" xadvance="31,75" page="0" chnl="15" />
<char id="198" x="99,375" y="571,25" width="63,625" height="54,5" xoffset="-9" yoffset="6,5" xadvance="48,375" page="0" chnl="15" />
<char id="199" x="972,25" y="138,875" width="45,25" height="66,125" xoffset="-6,25" yoffset="5,75" xadvance="31,875" page="0" chnl="15" />
<char id="200" x="778,25" y="69,875" width="40,125" height="69" xoffset="-4,125" yoffset="-8" xadvance="29,75" page="0" chnl="15" />
<char id="201" x="738" y="69,875" width="40,125" height="69" xoffset="-4,125" yoffset="-8" xadvance="29,75" page="0" chnl="15" />
<char id="202" x="657,5" y="69,875" width="40,125" height="69" xoffset="-4,125" yoffset="-8" xadvance="29,75" page="0" chnl="15" />
<char id="203" x="245,75" y="273,25" width="40,125" height="64,375" xoffset="-4,125" yoffset="-3,375" xadvance="29,75" page="0" chnl="15" />
<char id="204" x="960,5" y="69,75" width="30,875" height="69" xoffset="-5,5" yoffset="-8" xadvance="19,75" page="0" chnl="15" />
<char id="205" x="929,5" y="69,75" width="30,875" height="69" xoffset="-5,5" yoffset="-8" xadvance="19,75" page="0" chnl="15" />
<char id="206" x="895,75" y="69,875" width="33,625" height="69" xoffset="-6,75" yoffset="-8" xadvance="19,75" page="0" chnl="15" />
<char id="207" x="286" y="272,75" width="31,875" height="64,375" xoffset="-6" yoffset="-3,375" xadvance="19,75" page="0" chnl="15" />
<char id="208" x="399,875" y="568,25" width="50,625" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="37" page="0" chnl="15" />
<char id="209" x="487,75" y="139" width="43,625" height="67,375" xoffset="-4,125" yoffset="-6,375" xadvance="35,375" page="0" chnl="15" />
<char id="210" x="298,875" y="0" width="50" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="37,5" page="0" chnl="15" />
<char id="211" x="248,75" y="0" width="50" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="37,5" page="0" chnl="15" />
<char id="212" x="198,625" y="0" width="50" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="37,5" page="0" chnl="15" />
<char id="213" x="233,5" y="139" width="50" height="68,125" xoffset="-6,25" yoffset="-6,375" xadvance="37,5" page="0" chnl="15" />
<char id="214" x="771,75" y="205,5" width="50" height="65,125" xoffset="-6,25" yoffset="-3,375" xadvance="37,5" page="0" chnl="15" />
<char id="215" x="766,25" y="670,25" width="43,875" height="43,875" xoffset="-2,625" yoffset="14,25" xadvance="38,5" page="0" chnl="15" />
<char id="216" x="705,125" y="332,875" width="50" height="59,875" xoffset="-6,25" yoffset="4,125" xadvance="37,5" page="0" chnl="15" />
<char id="217" x="670,25" y="0" width="43,75" height="69,75" xoffset="-4,5" yoffset="-8" xadvance="34,75" page="0" chnl="15" />
<char id="218" x="626,375" y="0" width="43,75" height="69,75" xoffset="-4,5" yoffset="-8" xadvance="34,75" page="0" chnl="15" />
<char id="219" x="758" y="0" width="43,75" height="69,75" xoffset="-4,5" yoffset="-8" xadvance="34,75" page="0" chnl="15" />
<char id="220" x="914,5" y="205,5" width="43,75" height="65,125" xoffset="-4,5" yoffset="-3,375" xadvance="34,75" page="0" chnl="15" />
<char id="221" x="206,625" y="69,875" width="47,125" height="69" xoffset="-8,25" yoffset="-8" xadvance="30,5" page="0" chnl="15" />
<char id="222" x="300,75" y="624,125" width="40,5" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="30" page="0" chnl="15" />
<char id="223" x="512,375" y="396,25" width="40,125" height="57,125" xoffset="-4,5" yoffset="4,5" xadvance="29" page="0" chnl="15" />
<char id="224" x="120,875" y="338,625" width="39" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="225" x="81,75" y="339,375" width="39" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="226" x="160" y="338,625" width="39" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="227" x="292,125" y="398" width="39" height="59" xoffset="-6,5" yoffset="2,75" xadvance="27,875" page="0" chnl="15" />
<char id="228" x="195,25" y="514,5" width="39" height="55,5" xoffset="-6,5" yoffset="6,25" xadvance="27,875" page="0" chnl="15" />
<char id="229" x="630,5" y="271,375" width="39" height="61,5" xoffset="-6,5" yoffset="0,25" xadvance="27,875" page="0" chnl="15" />
<char id="230" x="0" y="681" width="59,625" height="46,375" xoffset="-6,5" yoffset="15,375" xadvance="46,625" page="0" chnl="15" />
<char id="231" x="890,75" y="391,125" width="38,125" height="56,5" xoffset="-6,5" yoffset="15,375" xadvance="24,5" page="0" chnl="15" />
<char id="232" x="397,375" y="336,625" width="40,875" height="60" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="233" x="438,375" y="336,5" width="40,875" height="60" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="234" x="315,375" y="337,25" width="40,875" height="60" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="235" x="314,125" y="513,875" width="40,875" height="55,375" xoffset="-6,5" yoffset="6,25" xadvance="27,875" page="0" chnl="15" />
<char id="236" x="62,5" y="399,625" width="26,875" height="59,375" xoffset="-8,125" yoffset="1,625" xadvance="12,125" page="0" chnl="15" />
<char id="237" x="995" y="330,25" width="26,875" height="59,375" xoffset="-4,75" yoffset="1,625" xadvance="12,125" page="0" chnl="15" />
<char id="238" x="31,5" y="399,625" width="30,875" height="59,375" xoffset="-9,375" yoffset="1,625" xadvance="12,125" page="0" chnl="15" />
<char id="239" x="973,375" y="503,25" width="30" height="54,75" xoffset="-9" yoffset="6,25" xadvance="12,125" page="0" chnl="15" />
<char id="240" x="439,375" y="396,625" width="41,75" height="57,25" xoffset="-6,5" yoffset="4,5" xadvance="28,875" page="0" chnl="15" />
<char id="241" x="370" y="396,875" width="38,625" height="58,25" xoffset="-4,5" yoffset="2,75" xadvance="29,5" page="0" chnl="15" />
<char id="242" x="971,75" y="270" width="41,75" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="28,75" page="0" chnl="15" />
<char id="243" x="929,875" y="270,75" width="41,75" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="28,75" page="0" chnl="15" />
<char id="244" x="888" y="270,75" width="41,75" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="28,75" page="0" chnl="15" />
<char id="245" x="209,25" y="398,5" width="41,75" height="59" xoffset="-6,5" yoffset="2,75" xadvance="28,75" page="0" chnl="15" />
<char id="246" x="114,125" y="515,25" width="41,75" height="55,5" xoffset="-6,5" yoffset="6,25" xadvance="28,75" page="0" chnl="15" />
<char id="247" x="819,375" y="616" width="46,375" height="48,875" xoffset="-3,875" yoffset="11,625" xadvance="38,5" page="0" chnl="15" />
<char id="248" x="777,125" y="616,375" width="42,125" height="51,75" xoffset="-6,875" yoffset="13" xadvance="28,75" page="0" chnl="15" />
<char id="249" x="276,625" y="337,75" width="38,625" height="60,125" xoffset="-4,625" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="250" x="237,875" y="338,125" width="38,625" height="60,125" xoffset="-4,625" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="251" x="199,125" y="338,25" width="38,625" height="60,125" xoffset="-4,625" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="252" x="234,375" y="514,5" width="38,625" height="55,5" xoffset="-4,625" yoffset="6,25" xadvance="29,5" page="0" chnl="15" />
<char id="253" x="114,125" y="0" width="42,125" height="70" xoffset="-7,875" yoffset="1,625" xadvance="26,375" page="0" chnl="15" />
<char id="254" x="645,875" y="139" width="40,25" height="66,875" xoffset="-4,5" yoffset="4,75" xadvance="29,25" page="0" chnl="15" />
<char id="255" x="488,375" y="206,5" width="42,125" height="65,375" xoffset="-7,875" yoffset="6,25" xadvance="26,375" page="0" chnl="15" />
<char id="256" x="382,125" y="272,625" width="48,25" height="63,875" xoffset="-8,25" yoffset="-2,875" xadvance="31,75" page="0" chnl="15" />
<char id="257" x="621,25" y="509,5" width="39" height="55,25" xoffset="-6,5" yoffset="6,5" xadvance="27,875" page="0" chnl="15" />
<char id="258" x="283,625" y="139" width="48,25" height="68" xoffset="-8,25" yoffset="-7" xadvance="31,75" page="0" chnl="15" />
<char id="259" x="131,375" y="398,875" width="39" height="59,125" xoffset="-6,5" yoffset="2,625" xadvance="27,875" page="0" chnl="15" />
<char id="260" x="569,125" y="206,25" width="48,5" height="65,25" xoffset="-8,25" yoffset="6,5" xadvance="31,75" page="0" chnl="15" />
<char id="261" x="71,875" y="459,125" width="39,625" height="56,375" xoffset="-6,5" yoffset="15,375" xadvance="27,875" page="0" chnl="15" />
<char id="262" x="446,375" y="0" width="45,25" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="31,875" page="0" chnl="15" />
<char id="263" x="479,375" y="336,125" width="38,125" height="60" xoffset="-6,5" yoffset="1,625" xadvance="24,5" page="0" chnl="15" />
<char id="264" x="491,75" y="0" width="45,25" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="31,875" page="0" chnl="15" />
<char id="265" x="517,625" y="336,125" width="38,125" height="60" xoffset="-6,5" yoffset="1,625" xadvance="24,5" page="0" chnl="15" />
<char id="266" x="869,125" y="205,5" width="45,25" height="65,125" xoffset="-6,25" yoffset="-3,375" xadvance="31,875" page="0" chnl="15" />
<char id="267" x="355,125" y="513,5" width="38,125" height="55,375" xoffset="-6,5" yoffset="6,25" xadvance="24,5" page="0" chnl="15" />
<char id="268" x="537,125" y="0" width="45,25" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="31,875" page="0" chnl="15" />
<char id="269" x="555,875" y="336" width="38,125" height="60" xoffset="-6,5" yoffset="1,625" xadvance="24,5" page="0" chnl="15" />
<char id="270" x="301,125" y="69,875" width="46,375" height="69" xoffset="-4,125" yoffset="-8" xadvance="36" page="0" chnl="15" />
<char id="271" x="552,625" y="396,25" width="52,625" height="57" xoffset="-6,5" yoffset="4,75" xadvance="36,375" page="0" chnl="15" />
<char id="272" x="450,625" y="568,25" width="50,625" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="37" page="0" chnl="15" />
<char id="273" x="605,375" y="395,375" width="44,5" height="57" xoffset="-6,5" yoffset="4,75" xadvance="30,375" page="0" chnl="15" />
<char id="274" x="478,875" y="272,125" width="40,125" height="63,875" xoffset="-4,125" yoffset="-2,875" xadvance="29,75" page="0" chnl="15" />
<char id="275" x="860,75" y="504,5" width="40,875" height="55,125" xoffset="-6,5" yoffset="6,5" xadvance="27,875" page="0" chnl="15" />
<char id="276" x="332" y="139" width="40,125" height="68" xoffset="-4,125" yoffset="-7" xadvance="29,75" page="0" chnl="15" />
<char id="277" x="251,125" y="398,375" width="40,875" height="59" xoffset="-6,5" yoffset="2,625" xadvance="27,875" page="0" chnl="15" />
<char id="278" x="205,5" y="273,625" width="40,125" height="64,375" xoffset="-4,125" yoffset="-3,375" xadvance="29,75" page="0" chnl="15" />
<char id="279" x="273,125" y="514" width="40,875" height="55,375" xoffset="-6,5" yoffset="6,25" xadvance="27,875" page="0" chnl="15" />
<char id="280" x="661,625" y="206" width="40,125" height="65,25" xoffset="-4,125" yoffset="6,5" xadvance="29,75" page="0" chnl="15" />
<char id="281" x="30,875" y="459,125" width="40,875" height="56,375" xoffset="-6,5" yoffset="15,375" xadvance="27,875" page="0" chnl="15" />
<char id="282" x="697,75" y="69,875" width="40,125" height="69" xoffset="-4,125" yoffset="-8" xadvance="29,75" page="0" chnl="15" />
<char id="283" x="356,375" y="336,75" width="40,875" height="60" xoffset="-6,5" yoffset="1,625" xadvance="27,875" page="0" chnl="15" />
<char id="284" x="399,125" y="0" width="47,125" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="285" x="0" y="0" width="40,25" height="70,25" xoffset="-6,5" yoffset="1,625" xadvance="29,25" page="0" chnl="15" />
<char id="286" x="50,125" y="139,5" width="47,125" height="68,75" xoffset="-6,25" yoffset="-7" xadvance="35,375" page="0" chnl="15" />
<char id="287" x="965,25" y="0" width="40,25" height="69,25" xoffset="-6,5" yoffset="2,625" xadvance="29,25" page="0" chnl="15" />
<char id="288" x="821,875" y="205,5" width="47,125" height="65,125" xoffset="-6,25" yoffset="-3,375" xadvance="35,375" page="0" chnl="15" />
<char id="289" x="82,125" y="208,375" width="40,25" height="65,625" xoffset="-6,5" yoffset="6,25" xadvance="29,25" page="0" chnl="15" />
<char id="290" x="925" y="139" width="47,125" height="66,125" xoffset="-6,25" yoffset="5,75" xadvance="35,375" page="0" chnl="15" />
<char id="291" x="40,375" y="0" width="40,25" height="70,125" xoffset="-6,5" yoffset="1,75" xadvance="29,25" page="0" chnl="15" />
<char id="292" x="439,625" y="69,875" width="44" height="69" xoffset="-4,125" yoffset="-8" xadvance="35,75" page="0" chnl="15" />
<char id="293" x="818,5" y="69,875" width="38,625" height="69" xoffset="-4,5" yoffset="-8" xadvance="29,5" page="0" chnl="15" />
<char id="294" x="347,125" y="569,375" width="52,625" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="37,875" page="0" chnl="15" />
<char id="295" x="160,25" y="458,125" width="42,875" height="56,25" xoffset="-7,625" yoffset="4,75" xadvance="30,625" page="0" chnl="15" />
<char id="296" x="452,25" y="139" width="35,375" height="67,5" xoffset="-7,75" yoffset="-6,5" xadvance="19,75" page="0" chnl="15" />
<char id="297" x="481,25" y="396,25" width="31" height="57,25" xoffset="-9,375" yoffset="3,75" xadvance="12,125" page="0" chnl="15" />
<char id="298" x="559,125" y="272" width="32,875" height="63,875" xoffset="-6,5" yoffset="-2,875" xadvance="19,75" page="0" chnl="15" />
<char id="299" x="610" y="619,625" width="29,875" height="54,5" xoffset="-8,875" yoffset="6,5" xadvance="12,125" page="0" chnl="15" />
<char id="300" x="372,25" y="139" width="31,5" height="67,875" xoffset="-5,75" yoffset="-6,875" xadvance="19,75" page="0" chnl="15" />
<char id="301" x="408,75" y="396,75" width="30,5" height="57,75" xoffset="-9,25" yoffset="3,25" xadvance="12,125" page="0" chnl="15" />
<char id="302" x="740,75" y="206" width="30,875" height="65,25" xoffset="-5,5" yoffset="6,5" xadvance="19,75" page="0" chnl="15" />
<char id="303" x="189" y="208" width="24" height="65,5" xoffset="-6,75" yoffset="6,25" xadvance="12,125" page="0" chnl="15" />
<char id="304" x="318" y="272,625" width="30,875" height="64,375" xoffset="-5,5" yoffset="-3,375" xadvance="19,75" page="0" chnl="15" />
<char id="305" x="745,25" y="670,25" width="20,875" height="44,875" xoffset="-4,375" yoffset="16,125" xadvance="12,125" page="0" chnl="15" />
<char id="306" x="812" y="504,875" width="48,625" height="55,125" xoffset="-5,5" yoffset="6,5" xadvance="38,75" page="0" chnl="15" />
<char id="307" x="122,5" y="208,25" width="36,5" height="65,625" xoffset="-4,625" yoffset="6,25" xadvance="27,375" page="0" chnl="15" />
<char id="308" x="928,625" y="0" width="36,5" height="69,625" xoffset="-7,75" yoffset="-8" xadvance="22,125" page="0" chnl="15" />
<char id="309" x="80,75" y="0" width="33,25" height="70,125" xoffset="-10,375" yoffset="1,75" xadvance="14,875" page="0" chnl="15" />
<char id="310" x="356,625" y="207,125" width="44,125" height="65,375" xoffset="-4,125" yoffset="6,5" xadvance="31,125" page="0" chnl="15" />
<char id="311" x="531,5" y="139" width="40" height="67,125" xoffset="-4,5" yoffset="4,75" xadvance="26,375" page="0" chnl="15" />
<char id="312" x="614,125" y="674,25" width="40" height="44,875" xoffset="-4,5" yoffset="16,125" xadvance="26,375" page="0" chnl="15" />
<char id="313" x="857,25" y="69,875" width="38,375" height="69" xoffset="-4,125" yoffset="-8" xadvance="26,375" page="0" chnl="15" />
<char id="314" x="991,5" y="69,375" width="26,875" height="69" xoffset="-4,875" yoffset="-8" xadvance="12,125" page="0" chnl="15" />
<char id="315" x="530,625" y="206,5" width="38,375" height="65,375" xoffset="-4,125" yoffset="6,5" xadvance="26,375" page="0" chnl="15" />
<char id="316" x="571,625" y="139" width="25,75" height="67,125" xoffset="-6,125" yoffset="4,75" xadvance="12,125" page="0" chnl="15" />
<char id="317" x="362,875" y="456,5" width="38,375" height="56,25" xoffset="-4,125" yoffset="4,75" xadvance="26,375" page="0" chnl="15" />
<char id="318" x="434,75" y="454,625" width="33,25" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="19,125" page="0" chnl="15" />
<char id="319" x="502" y="619,875" width="38,375" height="54,5" xoffset="-4,125" yoffset="6,5" xadvance="26,375" page="0" chnl="15" />
<char id="320" x="401,375" y="455,25" width="33,25" height="56,25" xoffset="-4,5" yoffset="4,75" xadvance="23,625" page="0" chnl="15" />
<char id="321" x="173,75" y="625,5" width="42,625" height="54,5" xoffset="-7,375" yoffset="6,5" xadvance="27,375" page="0" chnl="15" />
<char id="322" x="468,125" y="454" width="29,375" height="56,25" xoffset="-7,375" yoffset="4,75" xadvance="14,5" page="0" chnl="15" />
<char id="323" x="527,5" y="69,875" width="43,625" height="69" xoffset="-4,125" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="324" x="848" y="331,625" width="38,625" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="325" x="400,875" y="207" width="43,625" height="65,375" xoffset="-4,125" yoffset="6,5" xadvance="35,375" page="0" chnl="15" />
<char id="326" x="813,25" y="391,75" width="38,625" height="56,5" xoffset="-4,5" yoffset="15,375" xadvance="29,5" page="0" chnl="15" />
<char id="327" x="483,75" y="69,875" width="43,625" height="69" xoffset="-4,125" yoffset="-8" xadvance="35,375" page="0" chnl="15" />
<char id="328" x="809,25" y="332,25" width="38,625" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="329" x="111,625" y="458,875" width="48,5" height="56,25" xoffset="-7,125" yoffset="4,75" xadvance="36,75" page="0" chnl="15" />
<char id="330" x="444,625" y="206,625" width="43,625" height="65,375" xoffset="-4,125" yoffset="6,5" xadvance="35,375" page="0" chnl="15" />
<char id="331" x="852" y="391,125" width="38,625" height="56,5" xoffset="-4,5" yoffset="15,375" xadvance="29,5" page="0" chnl="15" />
<char id="332" x="958,375" y="205,25" width="50" height="64,625" xoffset="-6,25" yoffset="-2,875" xadvance="37,5" page="0" chnl="15" />
<char id="333" x="499" y="509,875" width="41,75" height="55,25" xoffset="-6,5" yoffset="6,5" xadvance="28,75" page="0" chnl="15" />
<char id="334" x="0" y="139,5" width="50" height="68,75" xoffset="-6,25" yoffset="-7" xadvance="37,5" page="0" chnl="15" />
<char id="335" x="89,5" y="399,625" width="41,75" height="59,125" xoffset="-6,5" yoffset="2,625" xadvance="28,75" page="0" chnl="15" />
<char id="336" x="349" y="0" width="50" height="69,75" xoffset="-6,25" yoffset="-8" xadvance="37,5" page="0" chnl="15" />
<char id="337" x="0" y="339,375" width="41,75" height="60,125" xoffset="-6,5" yoffset="1,625" xadvance="28,75" page="0" chnl="15" />
<char id="338" x="35" y="571,375" width="64,25" height="54,5" xoffset="-6,25" yoffset="6,5" xadvance="51,75" page="0" chnl="15" />
<char id="339" x="912,5" y="614,375" width="61,125" height="46,375" xoffset="-6,5" yoffset="15,375" xadvance="48,125" page="0" chnl="15" />
<char id="340" x="393,625" y="69,875" width="45,875" height="69" xoffset="-4,125" yoffset="-8" xadvance="32,875" page="0" chnl="15" />
<char id="341" x="0" y="399,625" width="31,375" height="59,375" xoffset="-4,5" yoffset="1,625" xadvance="19,125" page="0" chnl="15" />
<char id="342" x="310,625" y="207,125" width="45,875" height="65,375" xoffset="-4,125" yoffset="6,5" xadvance="32,875" page="0" chnl="15" />
<char id="343" x="0" y="515,75" width="32,25" height="55,75" xoffset="-5,375" yoffset="16,125" xadvance="19,125" page="0" chnl="15" />
<char id="344" x="347,625" y="69,875" width="45,875" height="69" xoffset="-4,125" yoffset="-8" xadvance="32,875" page="0" chnl="15" />
<char id="345" x="961,25" y="331" width="33,625" height="59,375" xoffset="-6,5" yoffset="1,625" xadvance="19,125" page="0" chnl="15" />
<char id="346" x="801,875" y="0" width="42,125" height="69,75" xoffset="-6" yoffset="-8" xadvance="29,5" page="0" chnl="15" />
<char id="347" x="594,125" y="335,25" width="36,875" height="60" xoffset="-6,25" yoffset="1,625" xadvance="23,625" page="0" chnl="15" />
<char id="348" x="886,375" y="0" width="42,125" height="69,75" xoffset="-6" yoffset="-8" xadvance="29,5" page="0" chnl="15" />
<char id="349" x="631,125" y="333" width="36,875" height="60" xoffset="-6,25" yoffset="1,625" xadvance="23,625" page="0" chnl="15" />
<char id="350" x="0" y="208,375" width="42,125" height="66,125" xoffset="-6" yoffset="5,75" xadvance="29,5" page="0" chnl="15" />
<char id="351" x="929" y="390,5" width="36,875" height="56,5" xoffset="-6,25" yoffset="15,375" xadvance="23,625" page="0" chnl="15" />
<char id="352" x="844,125" y="0" width="42,125" height="69,75" xoffset="-6" yoffset="-8" xadvance="29,5" page="0" chnl="15" />
<char id="353" x="668,125" y="333" width="36,875" height="60" xoffset="-6,25" yoffset="1,625" xadvance="23,625" page="0" chnl="15" />
<char id="354" x="263,375" y="207,25" width="47,125" height="65,375" xoffset="-8,125" yoffset="6,5" xadvance="31" page="0" chnl="15" />
<char id="355" x="349" y="272,625" width="33" height="64" xoffset="-7,375" yoffset="7,875" xadvance="17,75" page="0" chnl="15" />
<char id="356" x="253,875" y="69,875" width="47,125" height="69" xoffset="-8,125" yoffset="-8" xadvance="31" page="0" chnl="15" />
<char id="357" x="730,75" y="392,875" width="42" height="56,875" xoffset="-7,375" yoffset="4,75" xadvance="24,875" page="0" chnl="15" />
<char id="358" x="694,625" y="561,75" width="47,125" height="54,5" xoffset="-8,125" yoffset="6,5" xadvance="31" page="0" chnl="15" />
<char id="359" x="744" y="616,375" width="33" height="53,75" xoffset="-7,125" yoffset="7,875" xadvance="18" page="0" chnl="15" />
<char id="360" x="189,625" y="139,25" width="43,75" height="68,375" xoffset="-4,5" yoffset="-6,625" xadvance="34,75" page="0" chnl="15" />
<char id="361" x="331,25" y="397,375" width="38,625" height="59" xoffset="-4,625" yoffset="2,75" xadvance="29,5" page="0" chnl="15" />
<char id="362" x="0" y="274,625" width="43,75" height="64,625" xoffset="-4,5" yoffset="-2,875" xadvance="34,75" page="0" chnl="15" />
<char id="363" x="699,5" y="506,375" width="38,625" height="55,25" xoffset="-4,625" yoffset="6,5" xadvance="29,5" page="0" chnl="15" />
<char id="364" x="97,375" y="139,375" width="43,75" height="68,75" xoffset="-4,5" yoffset="-7" xadvance="34,75" page="0" chnl="15" />
<char id="365" x="170,5" y="398,875" width="38,625" height="59,125" xoffset="-4,625" yoffset="2,625" xadvance="29,5" page="0" chnl="15" />
<char id="366" x="582,5" y="0" width="43,75" height="69,75" xoffset="-4,5" yoffset="-8" xadvance="34,75" page="0" chnl="15" />
<char id="367" x="669,625" y="271,375" width="38,625" height="61,375" xoffset="-4,625" yoffset="0,375" xadvance="29,5" page="0" chnl="15" />
<char id="368" x="714,125" y="0" width="43,75" height="69,75" xoffset="-4,5" yoffset="-8" xadvance="34,75" page="0" chnl="15" />
<char id="369" x="41,875" y="339,375" width="39,75" height="60,125" xoffset="-4,625" yoffset="1,625" xadvance="29,5" page="0" chnl="15" />
<char id="370" x="617,75" y="206" width="43,75" height="65,25" xoffset="-4,5" yoffset="6,5" xadvance="34,75" page="0" chnl="15" />
<char id="371" x="32,375" y="515,625" width="39,375" height="55,625" xoffset="-4,625" yoffset="16,125" xadvance="29,5" page="0" chnl="15" />
<char id="372" x="0" y="70,375" width="62,5" height="69" xoffset="-7,375" yoffset="-8" xadvance="47,75" page="0" chnl="15" />
<char id="373" x="755,25" y="332,625" width="53,875" height="59,375" xoffset="-7,25" yoffset="1,625" xadvance="39,375" page="0" chnl="15" />
<char id="374" x="159,375" y="70,125" width="47,125" height="69" xoffset="-8,25" yoffset="-8" xadvance="30,5" page="0" chnl="15" />
<char id="375" x="156,375" y="0" width="42,125" height="70" xoffset="-7,875" yoffset="1,625" xadvance="26,375" page="0" chnl="15" />
<char id="376" x="115,125" y="274,125" width="47,125" height="64,375" xoffset="-8,25" yoffset="-3,375" xadvance="30,5" page="0" chnl="15" />
<char id="377" x="571,25" y="69,875" width="43" height="69" xoffset="-6,5" yoffset="-8" xadvance="29,625" page="0" chnl="15" />
<char id="378" x="924" y="331" width="37,125" height="59,375" xoffset="-6,75" yoffset="1,625" xadvance="23,5" page="0" chnl="15" />
<char id="379" x="162,375" y="273,75" width="43" height="64,375" xoffset="-6,5" yoffset="-3,375" xadvance="29,625" page="0" chnl="15" />
<char id="380" x="936,125" y="503,875" width="37,125" height="54,75" xoffset="-6,75" yoffset="6,25" xadvance="23,5" page="0" chnl="15" />
<char id="381" x="614,375" y="69,875" width="43" height="69" xoffset="-6,5" yoffset="-8" xadvance="29,625" page="0" chnl="15" />
<char id="382" x="886,75" y="331,625" width="37,125" height="59,375" xoffset="-6,75" yoffset="1,625" xadvance="23,5" page="0" chnl="15" />
<char id="383" x="0" y="459,125" width="30,75" height="56,5" xoffset="-4,375" yoffset="4,5" xadvance="13,5" page="0" chnl="15" />
</chars>
<kernings count="465">
<kerning first="191" second="74" amount="0,75" />
<kerning first="248" second="121" amount="-0,25" />
<kerning first="39" second="65" amount="-2,375" />
<kerning first="39" second="198" amount="-2,375" />
<kerning first="40" second="84" amount="0,5" />
<kerning first="40" second="106" amount="1,25" />
<kerning first="44" second="41" amount="-2,375" />
<kerning first="44" second="55" amount="-1,25" />
<kerning first="44" second="93" amount="-2,375" />
<kerning first="44" second="125" amount="-2,375" />
<kerning first="248" second="120" amount="-0,5" />
<kerning first="248" second="118" amount="-0,25" />
<kerning first="45" second="65" amount="-1,25" />
<kerning first="45" second="73" amount="-0,75" />
<kerning first="45" second="74" amount="-2,375" />
<kerning first="45" second="83" amount="-0,5" />
<kerning first="45" second="84" amount="-3,75" />
<kerning first="45" second="86" amount="-1,25" />
<kerning first="45" second="87" amount="-1,25" />
<kerning first="45" second="88" amount="-2" />
<kerning first="45" second="89" amount="-3,375" />
<kerning first="45" second="90" amount="-0,75" />
<kerning first="45" second="97" amount="-0,5" />
<kerning first="45" second="118" amount="-1" />
<kerning first="45" second="119" amount="-0,5" />
<kerning first="45" second="120" amount="-1,25" />
<kerning first="45" second="121" amount="-1" />
<kerning first="45" second="122" amount="-1" />
<kerning first="45" second="198" amount="-1,25" />
<kerning first="45" second="230" amount="-0,5" />
<kerning first="46" second="41" amount="-2,625" />
<kerning first="46" second="44" amount="-3,5" />
<kerning first="46" second="45" amount="-4,25" />
<kerning first="46" second="55" amount="-1,25" />
<kerning first="46" second="93" amount="-2,625" />
<kerning first="46" second="125" amount="-2,625" />
<kerning first="248" second="46" amount="-0,5" />
<kerning first="248" second="44" amount="-0,75" />
<kerning first="216" second="90" amount="-0,5" />
<kerning first="216" second="89" amount="-0,5" />
<kerning first="52" second="44" amount="-0,5" />
<kerning first="52" second="46" amount="-0,5" />
<kerning first="55" second="44" amount="-3,875" />
<kerning first="55" second="46" amount="-3,875" />
<kerning first="216" second="88" amount="-0,25" />
<kerning first="65" second="45" amount="-1,25" />
<kerning first="65" second="83" amount="-0,125" />
<kerning first="65" second="84" amount="-3" />
<kerning first="65" second="85" amount="-0,25" />
<kerning first="65" second="86" amount="-1,375" />
<kerning first="65" second="87" amount="-1,25" />
<kerning first="65" second="89" amount="-2" />
<kerning first="65" second="116" amount="-0,375" />
<kerning first="65" second="117" amount="-0,25" />
<kerning first="65" second="118" amount="-0,75" />
<kerning first="65" second="119" amount="-0,25" />
<kerning first="65" second="121" amount="-0,75" />
<kerning first="216" second="84" amount="-1,25" />
<kerning first="216" second="46" amount="-0,75" />
<kerning first="216" second="44" amount="-0,75" />
<kerning first="239" second="108" amount="0,25" />
<kerning first="239" second="102" amount="0,375" />
<kerning first="238" second="108" amount="0,25" />
<kerning first="66" second="44" amount="-0,5" />
<kerning first="66" second="45" amount="0,25" />
<kerning first="66" second="46" amount="-0,5" />
<kerning first="66" second="67" amount="0,25" />
<kerning first="66" second="71" amount="0,25" />
<kerning first="66" second="79" amount="0,25" />
<kerning first="66" second="81" amount="0,25" />
<kerning first="66" second="84" amount="-1,375" />
<kerning first="66" second="97" amount="0,25" />
<kerning first="66" second="101" amount="0,25" />
<kerning first="66" second="104" amount="0,25" />
<kerning first="66" second="105" amount="0,25" />
<kerning first="66" second="106" amount="0,25" />
<kerning first="66" second="108" amount="0,25" />
<kerning first="66" second="111" amount="0,25" />
<kerning first="66" second="114" amount="0,25" />
<kerning first="66" second="117" amount="0,25" />
<kerning first="66" second="119" amount="0,25" />
<kerning first="231" second="45" amount="-0,5" />
<kerning first="199" second="338" amount="-0,625" />
<kerning first="199" second="45" amount="-1,25" />
<kerning first="123" second="106" amount="1,25" />
<kerning first="67" second="45" amount="-1,25" />
<kerning first="67" second="338" amount="-0,625" />
<kerning first="123" second="84" amount="0,5" />
<kerning first="122" second="248" amount="-0,25" />
<kerning first="68" second="44" amount="-1,25" />
<kerning first="68" second="46" amount="-1,25" />
<kerning first="68" second="74" amount="-0,5" />
<kerning first="68" second="84" amount="-1,25" />
<kerning first="68" second="87" amount="-0,5" />
<kerning first="68" second="88" amount="-0,25" />
<kerning first="68" second="89" amount="-0,5" />
<kerning first="68" second="90" amount="-0,5" />
<kerning first="122" second="231" amount="-0,25" />
<kerning first="70" second="44" amount="-7,375" />
<kerning first="70" second="46" amount="-7,375" />
<kerning first="70" second="58" amount="-1,375" />
<kerning first="122" second="113" amount="-0,25" />
<kerning first="70" second="63" amount="1,375" />
<kerning first="70" second="65" amount="-2,375" />
<kerning first="70" second="74" amount="-1,5" />
<kerning first="70" second="84" amount="0,75" />
<kerning first="70" second="97" amount="-2,375" />
<kerning first="70" second="101" amount="-1,25" />
<kerning first="70" second="111" amount="-1,25" />
<kerning first="70" second="198" amount="-2,75" />
<kerning first="70" second="230" amount="-2,375" />
<kerning first="70" second="248" amount="-1,25" />
<kerning first="122" second="111" amount="-0,25" />
<kerning first="70" second="339" amount="-1,25" />
<kerning first="73" second="45" amount="-0,75" />
<kerning first="73" second="97" amount="-0,5" />
<kerning first="73" second="99" amount="-0,625" />
<kerning first="73" second="100" amount="-0,5" />
<kerning first="73" second="101" amount="-0,625" />
<kerning first="73" second="103" amount="-0,5" />
<kerning first="73" second="109" amount="-0,25" />
<kerning first="73" second="110" amount="-0,25" />
<kerning first="73" second="111" amount="-0,625" />
<kerning first="73" second="112" amount="-0,25" />
<kerning first="73" second="114" amount="-0,25" />
<kerning first="73" second="115" amount="-0,5" />
<kerning first="73" second="118" amount="-0,75" />
<kerning first="122" second="103" amount="-0,25" />
<kerning first="122" second="101" amount="-0,25" />
<kerning first="74" second="44" amount="-0,5" />
<kerning first="74" second="46" amount="-0,5" />
<kerning first="74" second="65" amount="-0,25" />
<kerning first="74" second="198" amount="-0,25" />
<kerning first="122" second="100" amount="-0,25" />
<kerning first="75" second="45" amount="-2,75" />
<kerning first="75" second="79" amount="-0,5" />
<kerning first="75" second="97" amount="-1,125" />
<kerning first="75" second="101" amount="-1,5" />
<kerning first="75" second="111" amount="-1,5" />
<kerning first="75" second="117" amount="-1" />
<kerning first="75" second="118" amount="-1,375" />
<kerning first="75" second="119" amount="-1,5" />
<kerning first="75" second="121" amount="-1,375" />
<kerning first="75" second="216" amount="-0,5" />
<kerning first="75" second="230" amount="-1,375" />
<kerning first="75" second="248" amount="-1,75" />
<kerning first="75" second="338" amount="-0,5" />
<kerning first="75" second="339" amount="-1,75" />
<kerning first="122" second="99" amount="-0,25" />
<kerning first="122" second="45" amount="-0,5" />
<kerning first="76" second="39" amount="-3" />
<kerning first="76" second="45" amount="-3,875" />
<kerning first="76" second="65" amount="-1" />
<kerning first="76" second="67" amount="-0,5" />
<kerning first="76" second="71" amount="-0,5" />
<kerning first="76" second="74" amount="2,375" />
<kerning first="76" second="79" amount="-0,5" />
<kerning first="76" second="81" amount="-0,5" />
<kerning first="76" second="84" amount="-4,25" />
<kerning first="76" second="86" amount="-2,75" />
<kerning first="76" second="87" amount="-2,375" />
<kerning first="76" second="89" amount="-3,875" />
<kerning first="76" second="118" amount="-2,75" />
<kerning first="76" second="121" amount="-2,75" />
<kerning first="76" second="199" amount="-0,5" />
<kerning first="76" second="198" amount="-1" />
<kerning first="76" second="216" amount="-0,5" />
<kerning first="76" second="338" amount="-0,5" />
<kerning first="121" second="339" amount="-0,25" />
<kerning first="121" second="248" amount="-0,375" />
<kerning first="121" second="230" amount="-1" />
<kerning first="121" second="231" amount="-0,375" />
<kerning first="79" second="44" amount="-0,75" />
<kerning first="79" second="46" amount="-0,75" />
<kerning first="79" second="74" amount="-0,25" />
<kerning first="79" second="84" amount="-1,25" />
<kerning first="79" second="88" amount="-0,25" />
<kerning first="79" second="89" amount="-0,5" />
<kerning first="79" second="90" amount="-0,5" />
<kerning first="121" second="113" amount="-0,25" />
<kerning first="80" second="44" amount="-7,375" />
<kerning first="80" second="46" amount="-7,375" />
<kerning first="80" second="65" amount="-1,25" />
<kerning first="80" second="74" amount="-1,75" />
<kerning first="80" second="89" amount="0,5" />
<kerning first="80" second="97" amount="-1,25" />
<kerning first="80" second="101" amount="-1,25" />
<kerning first="80" second="111" amount="-1,25" />
<kerning first="80" second="198" amount="-1,75" />
<kerning first="80" second="230" amount="-1,25" />
<kerning first="80" second="248" amount="-1,25" />
<kerning first="121" second="111" amount="-0,375" />
<kerning first="80" second="339" amount="-1,25" />
<kerning first="81" second="44" amount="-0,75" />
<kerning first="81" second="46" amount="-0,75" />
<kerning first="121" second="103" amount="-0,25" />
<kerning first="82" second="45" amount="-2,375" />
<kerning first="82" second="84" amount="-1,375" />
<kerning first="82" second="89" amount="-0,5" />
<kerning first="82" second="97" amount="-0,5" />
<kerning first="82" second="101" amount="-1" />
<kerning first="82" second="111" amount="-1" />
<kerning first="82" second="117" amount="-0,25" />
<kerning first="82" second="121" amount="-1,25" />
<kerning first="82" second="230" amount="-1,25" />
<kerning first="82" second="248" amount="-1,25" />
<kerning first="82" second="339" amount="-1,375" />
<kerning first="121" second="101" amount="-0,375" />
<kerning first="121" second="100" amount="-0,25" />
<kerning first="121" second="99" amount="-0,375" />
<kerning first="121" second="97" amount="-1" />
<kerning first="83" second="44" amount="-0,5" />
<kerning first="83" second="46" amount="-0,5" />
<kerning first="83" second="65" amount="-0,375" />
<kerning first="83" second="83" amount="-0,625" />
<kerning first="83" second="99" amount="0,125" />
<kerning first="83" second="101" amount="0,125" />
<kerning first="83" second="111" amount="0,125" />
<kerning first="83" second="113" amount="0,125" />
<kerning first="83" second="118" amount="-0,75" />
<kerning first="83" second="119" amount="-0,5" />
<kerning first="83" second="121" amount="-0,75" />
<kerning first="83" second="198" amount="-0,5" />
<kerning first="121" second="46" amount="-4,625" />
<kerning first="84" second="41" amount="0,5" />
<kerning first="84" second="44" amount="-7,125" />
<kerning first="84" second="45" amount="-3,75" />
<kerning first="84" second="46" amount="-7,125" />
<kerning first="84" second="58" amount="-4,875" />
<kerning first="121" second="45" amount="-1" />
<kerning first="84" second="63" amount="1,375" />
<kerning first="84" second="65" amount="-3" />
<kerning first="84" second="67" amount="-1" />
<kerning first="84" second="71" amount="-1" />
<kerning first="84" second="74" amount="-1,5" />
<kerning first="84" second="79" amount="-1,25" />
<kerning first="84" second="83" amount="-0,25" />
<kerning first="84" second="84" amount="-2,625" />
<kerning first="84" second="89" amount="-1,75" />
<kerning first="84" second="93" amount="0,5" />
<kerning first="84" second="97" amount="-5,875" />
<kerning first="84" second="99" amount="-5,375" />
<kerning first="84" second="101" amount="-5,375" />
<kerning first="84" second="103" amount="-5,25" />
<kerning first="84" second="111" amount="-5,375" />
<kerning first="84" second="114" amount="-4,875" />
<kerning first="84" second="115" amount="-4,375" />
<kerning first="84" second="117" amount="-4,875" />
<kerning first="84" second="118" amount="-4,875" />
<kerning first="84" second="119" amount="-4,875" />
<kerning first="84" second="121" amount="-4,875" />
<kerning first="84" second="122" amount="-4,25" />
<kerning first="84" second="125" amount="0,5" />
<kerning first="84" second="199" amount="-1" />
<kerning first="84" second="198" amount="-3,125" />
<kerning first="84" second="216" amount="-1,25" />
<kerning first="84" second="230" amount="-5,875" />
<kerning first="84" second="248" amount="-5,375" />
<kerning first="121" second="44" amount="-4,625" />
<kerning first="84" second="338" amount="-1,25" />
<kerning first="84" second="339" amount="-5,375" />
<kerning first="120" second="339" amount="-0,5" />
<kerning first="120" second="248" amount="-0,625" />
<kerning first="85" second="44" amount="-0,5" />
<kerning first="85" second="46" amount="-0,5" />
<kerning first="85" second="65" amount="-0,25" />
<kerning first="85" second="198" amount="-0,5" />
<kerning first="120" second="231" amount="-0,5" />
<kerning first="86" second="44" amount="-7,125" />
<kerning first="86" second="45" amount="-1,25" />
<kerning first="86" second="46" amount="-7,125" />
<kerning first="86" second="58" amount="-2" />
<kerning first="120" second="111" amount="-0,625" />
<kerning first="86" second="65" amount="-1,375" />
<kerning first="86" second="97" amount="-2,375" />
<kerning first="86" second="101" amount="-2,375" />
<kerning first="86" second="111" amount="-2,375" />
<kerning first="86" second="117" amount="-1,375" />
<kerning first="86" second="121" amount="-1,625" />
<kerning first="86" second="198" amount="-1,75" />
<kerning first="86" second="230" amount="-2,375" />
<kerning first="86" second="248" amount="-2,375" />
<kerning first="120" second="103" amount="-0,25" />
<kerning first="86" second="339" amount="-2,375" />
<kerning first="120" second="101" amount="-0,625" />
<kerning first="120" second="100" amount="-0,25" />
<kerning first="87" second="44" amount="-7,125" />
<kerning first="87" second="45" amount="-1,25" />
<kerning first="87" second="46" amount="-5,375" />
<kerning first="87" second="58" amount="-2" />
<kerning first="120" second="99" amount="-0,5" />
<kerning first="87" second="65" amount="-1,25" />
<kerning first="87" second="97" amount="-2" />
<kerning first="87" second="101" amount="-2" />
<kerning first="87" second="111" amount="-2" />
<kerning first="87" second="114" amount="-1" />
<kerning first="87" second="117" amount="-1" />
<kerning first="87" second="121" amount="-1,375" />
<kerning first="87" second="198" amount="-1" />
<kerning first="87" second="230" amount="-2" />
<kerning first="87" second="248" amount="-2" />
<kerning first="120" second="45" amount="-1,25" />
<kerning first="87" second="339" amount="-2" />
<kerning first="119" second="230" amount="-0,5" />
<kerning first="119" second="97" amount="-0,5" />
<kerning first="88" second="45" amount="-2" />
<kerning first="88" second="67" amount="-0,25" />
<kerning first="88" second="71" amount="-0,25" />
<kerning first="88" second="79" amount="-0,25" />
<kerning first="88" second="97" amount="-1" />
<kerning first="88" second="101" amount="-1,125" />
<kerning first="88" second="111" amount="-1,125" />
<kerning first="88" second="117" amount="-0,75" />
<kerning first="88" second="121" amount="-1,75" />
<kerning first="88" second="199" amount="-0,25" />
<kerning first="88" second="216" amount="-0,25" />
<kerning first="88" second="230" amount="-1,25" />
<kerning first="88" second="248" amount="-1,375" />
<kerning first="88" second="338" amount="-0,25" />
<kerning first="88" second="339" amount="-1,375" />
<kerning first="119" second="46" amount="-1,75" />
<kerning first="119" second="45" amount="-0,5" />
<kerning first="89" second="44" amount="-7,125" />
<kerning first="89" second="45" amount="-3,375" />
<kerning first="89" second="46" amount="-7,125" />
<kerning first="89" second="58" amount="-4,875" />
<kerning first="119" second="44" amount="-1,75" />
<kerning first="89" second="65" amount="-2" />
<kerning first="89" second="74" amount="-1,5" />
<kerning first="89" second="79" amount="-0,5" />
<kerning first="89" second="97" amount="-3,375" />
<kerning first="89" second="100" amount="-3" />
<kerning first="89" second="101" amount="-3,125" />
<kerning first="89" second="103" amount="-3,125" />
<kerning first="89" second="109" amount="-2,375" />
<kerning first="89" second="110" amount="-2,375" />
<kerning first="89" second="111" amount="-3,125" />
<kerning first="89" second="112" amount="-2,375" />
<kerning first="89" second="113" amount="-3,125" />
<kerning first="89" second="114" amount="-2,375" />
<kerning first="89" second="115" amount="-2,75" />
<kerning first="89" second="117" amount="-2,75" />
<kerning first="89" second="118" amount="-2,375" />
<kerning first="89" second="198" amount="-2" />
<kerning first="89" second="216" amount="-0,5" />
<kerning first="89" second="230" amount="-3,375" />
<kerning first="89" second="248" amount="-3,125" />
<kerning first="118" second="339" amount="-0,25" />
<kerning first="89" second="338" amount="-0,5" />
<kerning first="89" second="339" amount="-3,125" />
<kerning first="118" second="248" amount="-0,375" />
<kerning first="118" second="230" amount="-1" />
<kerning first="90" second="45" amount="-1,375" />
<kerning first="90" second="67" amount="-0,5" />
<kerning first="90" second="71" amount="-0,5" />
<kerning first="90" second="79" amount="-0,5" />
<kerning first="90" second="90" amount="-0,25" />
<kerning first="90" second="97" amount="-1,25" />
<kerning first="90" second="101" amount="-1,375" />
<kerning first="90" second="111" amount="-1,375" />
<kerning first="90" second="119" amount="-1" />
<kerning first="90" second="121" amount="-1,625" />
<kerning first="90" second="199" amount="-0,5" />
<kerning first="90" second="216" amount="-0,5" />
<kerning first="90" second="230" amount="-1,25" />
<kerning first="90" second="248" amount="-1,375" />
<kerning first="90" second="338" amount="-0,5" />
<kerning first="90" second="339" amount="-1,375" />
<kerning first="118" second="111" amount="-0,375" />
<kerning first="118" second="101" amount="-0,375" />
<kerning first="91" second="84" amount="0,5" />
<kerning first="91" second="106" amount="1,25" />
<kerning first="97" second="118" amount="-0,375" />
<kerning first="97" second="119" amount="-0,25" />
<kerning first="97" second="121" amount="-0,375" />
<kerning first="98" second="44" amount="-0,75" />
<kerning first="98" second="46" amount="-0,5" />
<kerning first="98" second="121" amount="-0,125" />
<kerning first="118" second="97" amount="-1" />
<kerning first="99" second="45" amount="-0,5" />
<kerning first="99" second="84" amount="-2,5" />
<kerning first="99" second="99" amount="-0,125" />
<kerning first="99" second="231" amount="-0,125" />
<kerning first="118" second="46" amount="-4,375" />
<kerning first="118" second="45" amount="-1" />
<kerning first="101" second="84" amount="-3,375" />
<kerning first="102" second="34" amount="2,25" />
<kerning first="102" second="39" amount="2,25" />
<kerning first="102" second="41" amount="2,625" />
<kerning first="102" second="42" amount="1,75" />
<kerning first="102" second="44" amount="-3,875" />
<kerning first="102" second="45" amount="-1,75" />
<kerning first="102" second="46" amount="-3,875" />
<kerning first="102" second="63" amount="3" />
<kerning first="102" second="92" amount="2,375" />
<kerning first="102" second="93" amount="2,625" />
<kerning first="102" second="97" amount="-0,625" />
<kerning first="102" second="99" amount="-0,5" />
<kerning first="102" second="101" amount="-0,5" />
<kerning first="102" second="102" amount="-0,375" />
<kerning first="102" second="103" amount="-0,25" />
<kerning first="102" second="106" amount="-0,5" />
<kerning first="102" second="109" amount="-0,25" />
<kerning first="102" second="110" amount="-0,25" />
<kerning first="102" second="111" amount="-0,5" />
<kerning first="102" second="112" amount="-0,25" />
<kerning first="102" second="113" amount="-0,25" />
<kerning first="102" second="114" amount="-0,25" />
<kerning first="102" second="115" amount="-0,625" />
<kerning first="102" second="117" amount="-0,5" />
<kerning first="102" second="121" amount="-0,625" />
<kerning first="102" second="125" amount="2,625" />
<kerning first="102" second="233" amount="-0,5" />
<kerning first="102" second="238" amount="3,125" />
<kerning first="102" second="230" amount="-0,625" />
<kerning first="102" second="248" amount="-0,5" />
<kerning first="118" second="44" amount="-4,375" />
<kerning first="116" second="121" amount="-0,5" />
<kerning first="116" second="118" amount="-0,5" />
<kerning first="116" second="116" amount="-0,375" />
<kerning first="116" second="45" amount="-1" />
<kerning first="103" second="106" amount="0,25" />
<kerning first="104" second="118" amount="-0,5" />
<kerning first="104" second="119" amount="-0,25" />
<kerning first="104" second="121" amount="-0,5" />
<kerning first="105" second="102" amount="0,125" />
<kerning first="114" second="339" amount="-0,25" />
<kerning first="114" second="248" amount="-0,25" />
<kerning first="105" second="116" amount="0,125" />
<kerning first="107" second="45" amount="-2,375" />
<kerning first="107" second="101" amount="-0,5" />
<kerning first="107" second="111" amount="-0,5" />
<kerning first="107" second="248" amount="-0,5" />
<kerning first="107" second="339" amount="-0,5" />
<kerning first="114" second="230" amount="-1" />
<kerning first="114" second="233" amount="-0,25" />
<kerning first="114" second="231" amount="-0,25" />
<kerning first="114" second="113" amount="-0,25" />
<kerning first="108" second="108" amount="0,125" />
<kerning first="108" second="116" amount="0,125" />
<kerning first="108" second="238" amount="0,25" />
<kerning first="108" second="239" amount="0,25" />
<kerning first="114" second="111" amount="-0,25" />
<kerning first="109" second="118" amount="-0,5" />
<kerning first="109" second="119" amount="-0,25" />
<kerning first="109" second="121" amount="-0,5" />
<kerning first="110" second="118" amount="-0,5" />
<kerning first="110" second="119" amount="-0,25" />
<kerning first="110" second="121" amount="-0,5" />
<kerning first="111" second="44" amount="-0,75" />
<kerning first="111" second="46" amount="-0,5" />
<kerning first="111" second="118" amount="-0,25" />
<kerning first="111" second="120" amount="-0,5" />
<kerning first="111" second="121" amount="-0,25" />
<kerning first="114" second="103" amount="-0,25" />
<kerning first="112" second="44" amount="-0,75" />
<kerning first="112" second="46" amount="-0,5" />
<kerning first="112" second="121" amount="-0,125" />
<kerning first="114" second="101" amount="-0,25" />
<kerning first="114" second="44" amount="-7,125" />
<kerning first="114" second="45" amount="-0,625" />
<kerning first="114" second="46" amount="-7,125" />
<kerning first="114" second="97" amount="-0,875" />
<kerning first="114" second="99" amount="-0,25" />
<kerning first="114" second="100" amount="-0,25" />
</kernings>
</font>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

View file

@ -1,40 +0,0 @@
#ifndef _CoreGl_Gl_h_
#define _CoreGl_Gl_h_
#ifdef flagLINUXGL
#define Time XTime
#define Font XFont
#define Display XDisplay
#define Picture XPicture
#define Screen XScreen
#define Window XWindow
#define Complex XComplex
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#endif
#include <CoreGl/glew.h>
#ifdef flagWINGL
#include <CoreGl/wglew.h>
#endif
#include <GL/gl.h>
#include <GL/glu.h>
#ifdef flagLINUXGL
#include <GL/glx.h>
#endif
#ifdef flagLINUXGL
#undef Picture
#undef Time
#undef Font
#undef Display
#undef Screen
#undef Window
#undef Complex
#endif
#endif

View file

@ -1,90 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlLib/CtrlLib.h>
NAMESPACE_UPP
#define LTIMING(x) // RTIMING(x)
void SetSurface(SystemDraw& w, int x, int y, int cx, int cy, const RGBA *pixels)
{
GuiLock __;
}
void SetSurface(SystemDraw& w, const Rect& dest, const RGBA *pixels, Size psz, Point poff)
{
GuiLock __;
}
Image ImageDraw::Get(bool pm) const
{
ImageBuffer result(image.GetSize());
const RGBA *e = image.End();
const RGBA *p = ~image;
RGBA *t = ~result;
if(has_alpha) {
const RGBA *a = ~alpha;
while(p < e) {
*t = *p++;
(t++)->a = (a++)->r;
}
if(pm)
Premultiply(result);
result.SetKind(IMAGE_ALPHA);
}
else {
while(p < e) {
*t = *p++;
(t++)->a = 255;
}
}
return result;
}
Draw& ImageDraw::Alpha()
{
has_alpha = true;
return alpha_painter;
}
ImageDraw::ImageDraw(Size sz)
: ImageDraw__(sz.cx, sz.cy),
BufferPainter(image),
alpha_painter(alpha)
{
has_alpha = false;
}
ImageDraw::ImageDraw(int cx, int cy)
: ImageDraw__(cx, cy),
BufferPainter(image),
alpha_painter(alpha)
{
has_alpha = false;
}
#define IMAGECLASS CoreGlImg
#define IMAGEFILE <CoreGl/CoreGl.iml>
#include <Draw/iml_source.h>
Image Image::Arrow() { return CoreGlImg::arrow(); }
Image Image::Wait() { return CoreGlImg::wait(); }
Image Image::IBeam() { return CoreGlImg::ibeam(); }
Image Image::No() { return CoreGlImg::no(); }
Image Image::SizeAll() { return CoreGlImg::sizeall(); }
Image Image::SizeHorz() { return CoreGlImg::sizehorz(); }
Image Image::SizeVert() { return CoreGlImg::sizevert(); }
Image Image::SizeTopLeft() { return CoreGlImg::sizetopleft(); }
Image Image::SizeTop() { return CoreGlImg::sizetop(); }
Image Image::SizeTopRight() { return CoreGlImg::sizetopright(); }
Image Image::SizeLeft() { return CoreGlImg::sizeleft(); }
Image Image::SizeRight() { return CoreGlImg::sizeright(); }
Image Image::SizeBottomLeft() { return CoreGlImg::sizebottomleft(); }
Image Image::SizeBottom() { return CoreGlImg::sizebottom(); }
Image Image::SizeBottomRight() { return CoreGlImg::sizebottomright(); }
Image Image::Hand() { return CoreGlImg::hand(); }
END_UPP_NAMESPACE
#endif

View file

@ -1,103 +0,0 @@
#ifndef _CoreGl_ResGl_h_
#define _CoreGl_ResGl_h_
struct TextureResource : Moveable<TextureResource>
{
int64 serialId;
int64 atlasSerialId;
int realWidth;
int realHeight;
int width;
int height;
int x;
int y;
TextureResource(int w = 0, int h = 0)
{
serialId = -1;
atlasSerialId = -1;
realWidth = w;
realHeight = h;
width = w;
height = h;
x = 0;
y = 0;
}
String ToString() const
{
return Format("x: %d, y: %d, w: %d, h:%d (%d, %d) - %ld", x, y, width, height, realWidth, realHeight, serialId);
}
};
struct AtlasResource : Moveable<AtlasResource>
{
int width;
int height;
bool linear;
Vector<Image> parts;
Image Make(ArrayMap<int64, TextureResource>& textures);
};
struct ImageResource : Moveable<ImageResource>
{
int type;
bool linear;
//direct image
Image img;
//brc image
const byte* data;
int length;
//disk image
String fileName;
};
struct Resources
{
enum {
NEAREST_FILTERING = 1,
LINEAR_FILTERING = 2,
FORCE_FILTERING = 4,
AUTO_ATLAS = 8,
FORCE_BIND = 16
};
Vector<ImageResource> staticImages;
VectorMap<String, AtlasResource> staticAtlases;
Vector<Font> staticFonts;
TextureResource autoAtlas;
ImageBuffer autoAtlasBuffer;
Image autoAtlasImage;
int px, py, maxh;
int bindedTextures;
int64 currentSerialId;
ArrayMap<int64, TextureResource> textures;
ArrayMap<String, OpenGLFont> fonts;
const TextureResource& CreateTexture(const Image& img, int width = -1, int height = -1);
void CreateSubTexture(const TextureResource& t, const Image& img, int x, int y);
const TextureResource& Bind(const Image& img, int opts = NEAREST_FILTERING);
bool Bind(int64 serialId, int opts = NEAREST_FILTERING);
void Add(const Image& img, bool linear = false);
void Add(Iml* images, bool linear = false);
void Add(const Font& fnt);
void AddAtlas(const char* atlasName, const Image& img);
void AddAtlas(const char* atlasName, Iml* images);
OpenGLFont& GetFont(const char* fontName, int fontHeight, bool preload = false, const byte* fontDef = NULL, const byte** imagesData = NULL, const int* imagesSize = NULL, int imagesCount = 0);
OpenGLFont& GetFont(const Font& font, bool preload = false);
void SetTextureFiltring(int opts);
void BindStatic();
Resources();
};
extern Resources resources;
#endif

View file

@ -1,8 +0,0 @@
BINARY(alphaMagFrag, "AlphaMag.frag")
BINARY(alphaMagVert, "AlphaMag.vert")
BINARY(blurVert, "Blur.vert")
BINARY(blurFrag, "Blur.frag")
BINARY(tahomaNFontDef, "Fonts/TahomaN.fnt")
BINARY_ARRAY(tahomaNFontImg, 0, "Fonts/TahomaN_0.png")
BINARY(tahomaBFontDef, "Fonts/TahomaB.fnt")
BINARY_ARRAY(tahomaBFontImg, 0, "Fonts/TahomaB_0.png")

View file

@ -1,362 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "CoreGl.h"
#include <plugin/png/png.h>
NAMESPACE_UPP
Resources resources;
Resources::Resources() : autoAtlas(1024, 1024)
{
px = 0;
py = 0;
maxh = 0;
currentSerialId = -1;
bindedTextures = 0;
}
void Resources::SetTextureFiltring(int opts)
{
if(opts & LINEAR_FILTERING)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
else if(opts & NEAREST_FILTERING)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
}
const TextureResource& Resources::CreateTexture(const Image& img, int width, int height)
{
int64 serialId = img.GetSerialId();
TextureResource& t = textures.Add(serialId);
t.serialId = serialId;
t.atlasSerialId = -1;
t.width = width > 0 ? width : img.GetWidth();
t.height = height > 0 ? height : img.GetHeight();
t.realWidth = t.width;
t.realHeight = t.height;
t.x = 0;
t.y = 0;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, t.width, t.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, img);
++bindedTextures;
return t;
}
void Resources::CreateSubTexture(const TextureResource& t, const Image& img, int x, int y)
{
Bind(autoAtlas.serialId, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, img.GetWidth(), img.GetHeight(), GL_BGRA, GL_UNSIGNED_BYTE, img);
}
const TextureResource& Resources::Bind(const Image& img, int opts)
{
int64 serialId = img.GetSerialId();
const TextureResource* texture = textures.FindPtr(serialId);
if(texture)
{
if(texture->atlasSerialId >= 0)
serialId = texture->atlasSerialId;
}
else if(opts & AUTO_ATLAS)
{
int w = img.GetWidth();
int h = img.GetHeight();
if(w <= autoAtlas.width && h <= autoAtlas.height && w <= 64 && h <= 64)
{
bool add = px + w <= autoAtlas.width && py + h <= autoAtlas.height;
if(!add)
{
if(py + maxh + h > autoAtlas.height)
{
add = false;
}
else
{
px = 0;
py += maxh;
maxh = 0;
add = true;
}
}
if(add)
{
if(h > maxh)
maxh = h;
TextureResource& t = textures.Add(img.GetSerialId());
t.atlasSerialId = autoAtlas.serialId;
t.width = w;
t.height = h;
t.realWidth = autoAtlas.width;
t.realHeight = autoAtlas.height;
t.x = px;
t.y = py;
CreateSubTexture(autoAtlas, img, px, py);
Copy(autoAtlasImage, Point(px, py), img, img.GetSize());
px += w;
texture = &t;
serialId = autoAtlas.serialId;
}
}
}
if(!Bind(serialId, opts))
return *texture;
if(!texture)
{
texture = &CreateTexture(img);
}
return *texture;
}
bool Resources::Bind(int64 serialId, int opts)
{
if(!(opts & FORCE_BIND) && serialId == currentSerialId)
{
if(opts & FORCE_FILTERING)
SetTextureFiltring(opts);
return false;
}
currentSerialId = serialId;
glBindTexture(GL_TEXTURE_2D, (GLuint) serialId);
SetTextureFiltring(opts);
return true;
}
void Resources::BindStatic()
{
if(autoAtlas.serialId < 0)
{
autoAtlasBuffer.Create(autoAtlas.width, autoAtlas.height);
Fill(autoAtlasBuffer, RGBAZero(), autoAtlasBuffer.GetLength());
autoAtlasImage = autoAtlasBuffer;
Bind(autoAtlasImage.GetSerialId());
autoAtlas = CreateTexture(autoAtlasImage);
}
if(!staticImages.IsEmpty())
{
for(int i = 0; i < staticImages.GetCount(); i++)
Bind(staticImages[i].img, staticImages[i].linear ? Resources::LINEAR_FILTERING : Resources::NEAREST_FILTERING);
staticImages.Clear();
}
if(!staticAtlases.IsEmpty())
{
for(int i = 0; i < staticAtlases.GetCount(); i++)
Bind(staticAtlases[i].Make(textures), staticAtlases[i].linear ? Resources::LINEAR_FILTERING : Resources::NEAREST_FILTERING);
staticAtlases.Clear();
}
if(!staticFonts.IsEmpty())
{
for(int i = 0; i < staticFonts.GetCount(); i++)
GetFont(staticFonts[i], true);
staticFonts.Clear();
}
}
void Resources::Add(const Image& img, bool linear)
{
ImageResource& ir = staticImages.Add();
ir.img = img;
ir.linear = linear;
}
void Resources::Add(const Font& fnt)
{
Font& f = staticFonts.Add(fnt);
}
void Resources::Add(Iml* images, bool linear)
{
for(int i = 0; i < images->GetCount(); i++)
Add(images->Get(i), linear);
}
void Resources::AddAtlas(const char* atlasName, const Image& img)
{
AtlasResource& atlas = staticAtlases.GetAdd(atlasName);
atlas.linear = false;
atlas.parts.Add(img);
}
void Resources::AddAtlas(const char* atlasName, Iml* images)
{
AtlasResource& atlas = staticAtlases.GetAdd(atlasName);
atlas.linear = false;
for(int i = 0; i < images->GetCount(); i++)
atlas.parts.Add(images->Get(i));
}
Image AtlasResource::Make(ArrayMap<int64, TextureResource>& textures)
{
width = 512;
height = 512;
ImageBuffer ib(width, height);
Fill(ib, RGBAZero(), ib.GetLength());
Point p(0, 0);
int maxh = 0;
int tidx = textures.GetCount();
for(int i = 0; i < parts.GetCount(); i++)
{
Image& img = parts[i];
int w = img.GetWidth();
int h = img.GetHeight();
if(w > width || h > height)
continue;
if(p.x + w > width)
{
if(p.y + maxh + h > height)
continue;
p.x = 0;
p.y += maxh;
maxh = 0;
}
if(h > maxh)
maxh = h;
TextureResource& t = textures.Add(img.GetSerialId());
t.width = w;
t.height = h;
t.realWidth = width;
t.realHeight = height;
t.x = p.x;
t.y = p.y;
Copy(ib, p, img, img.GetSize());
p.x += w;
}
Image finalImg(ib);
int64 finalSerialId = finalImg.GetSerialId();
for(int i = tidx; i < textures.GetCount(); i++)
textures[i].atlasSerialId = finalSerialId;
return finalImg;
}
OpenGLFont& Resources::GetFont(const char* fontName, int fontHeight, bool preload, const byte* fontDef, const byte** imagesData, const int* imagesSize, int imagesCount)
{
int n = fonts.Find(fontName);
OpenGLFont* fgl = NULL;
if(n >= 0)
fgl = &fonts[n];
else
{
fgl = &fonts.Add(fontName);
fgl->preload = preload;
if(fontDef)
fgl->LoadBrc(fontDef, imagesData, imagesSize, imagesCount);
else
fgl->Load(fontName);
}
fgl->scale = (fontHeight * 96.f / 72.f) / 72.f;
return *fgl;
}
OpenGLFont& Resources::GetFont(const Font& font, bool preload)
{
if(font.IsBold())
return GetFont("TahomaB", font.GetHeight(), preload,
tahomaBFontDef, (const byte**) tahomaBFontImg, tahomaBFontImg_length, tahomaBFontImg_count);
else
return GetFont("TahomaN", font.GetHeight(), preload,
tahomaNFontDef, (const byte**) tahomaNFontImg, tahomaNFontImg_length, tahomaNFontImg_count);
}
int64 GetHighTickCount()
{
#ifdef PLATFORM_WIN32
static int64 counterFreq = 0;
if(counterFreq == 0)
{
if(!QueryPerformanceFrequency((LARGE_INTEGER*) &counterFreq))
counterFreq = 0;
}
if(counterFreq > 0)
{
int64 counter;
QueryPerformanceCounter((LARGE_INTEGER*) &counter);
return counter * 1000 / counterFreq;
}
else
{
return GetTickCount();
}
#else
return GetTickCount();
#endif
}
float GetFps()
{
static float fps = 0.0f;
static int64 updateInterval = 1000;
static int64 timeSinceLastUpdate = 0;
static int64 frameCount = 0;
static int64 currentTick;
static int64 lastTick;
static bool isFirst = true;
if(isFirst)
{
currentTick = frameInfo.curr_tick_count;
lastTick = currentTick;
isFirst = false;
}
frameCount++;
currentTick = frameInfo.curr_tick_count;
int64 elapsed = currentTick - lastTick;
lastTick = currentTick;
timeSinceLastUpdate += elapsed;
if (timeSinceLastUpdate > updateInterval)
{
if (timeSinceLastUpdate)
{
fps = (frameCount / float(timeSinceLastUpdate)) * 1000.f;
frameCount = 0;
timeSinceLastUpdate -= updateInterval;
}
}
return fps;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,10 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "SceneGraph.h"
/*
GraphNode::GraphNode() : next(NULL), prev(NULL)
{
}
*/
#endif

View file

@ -1,24 +0,0 @@
#ifndef _WinGl_SceneGraph_h_
#define _WinGl_SceneGraph_h_
/*
struct GraphNode : Moveable<GraphNode>
{
RGBA color;
double x, y, z;
GraphNode* prev;
GraphNode* next;
GraphNode();
};
class SceneGraph
{
private:
GraphNode* root;
public:
};
*/
#endif

View file

@ -1,332 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "Scrollbar.h"
NAMESPACE_UPP
void AlignedFrame::FrameLayout(Rect &r)
{
switch(layout)
{
case LEFT:
LayoutFrameLeft(r, this, framesize);
break;
case TOP:
LayoutFrameTop(r, this, framesize);
break;
case RIGHT:
LayoutFrameRight(r, this, framesize);
break;
case BOTTOM:
LayoutFrameBottom(r, this, framesize);
break;
}
r.top += border;
r.left += border;
r.right -= border;
r.bottom -= border;
}
void AlignedFrame::FrameAddSize(Size& sz)
{
sz += border * 2;
IsVert() ? sz.cx += framesize : sz.cy += framesize;
}
void AlignedFrame::FramePaint(Draw& w, const Rect& r)
{
if(border > 0)
{
Rect n = r;
switch(layout)
{
case LEFT:
n.left += framesize;
break;
case TOP:
n.top += framesize;
break;
case RIGHT:
n.right -= framesize;
break;
case BOTTOM:
n.bottom -= framesize;
break;
}
ViewFrame().FramePaint(w, n);
}
else
FrameCtrl<Ctrl>::FramePaint(w, r);
}
AlignedFrame& AlignedFrame::SetFrameSize(int sz, bool refresh)
{
framesize = sz;
if (refresh) RefreshParentLayout();
return *this;
}
void AlignedFrame::Fix(Size& sz)
{
if(IsVert())
Swap(sz.cx, sz.cy);
}
void AlignedFrame::Fix(Point& p)
{
if(IsVert())
Swap(p.x, p.y);
}
Size AlignedFrame::Fixed(const Size& sz)
{
return IsVert() ? Size(sz.cy, sz.cx) : Size(sz.cx, sz.cy);
}
Point AlignedFrame::Fixed(const Point& p)
{
return IsVert() ? Point(p.y, p.x) : Point(p.x, p.y);
}
// SlimScrollBar
SlimScrollBar::SlimScrollBar()
{
Clear();
}
void SlimScrollBar::Clear()
{
total = 0;
t = 0;
pos = 0;
prev_ps = 0;
ps = 0;
start_pos = 0;
new_pos = 0;
old_pos = 0;
isend = true;
isbegin = true;
sz.Clear();
ready = false;
}
void SlimScrollBar::UpdatePos(bool update, bool whenscroll)
{
sz = GetSize();
Fix(sz);
if(total <= 0 || sz.cx <= 0)
{
cs = ics = 0;
}
else
{
cs = sz.cx / double(t + 0.5);
ics = t / double(sz.cx);
}
size = max(0.0, sz.cx * cs);
if(update)
pos = new_pos - start_pos;
isbegin = t < sz.cx;
isend = t < sz.cx;
if(pos <= 0)
{
pos = 0;
isbegin = true;
}
else if(pos + size >= sz.cx)
{
pos = sz.cx - size;
isend = true;
}
ps = t > sz.cx ? pos * ics : 0;
if(whenscroll && int(ps) != int(prev_ps))
WhenScroll();
prev_ps = ps;
}
void SlimScrollBar::Paint(Draw &w)
{
if(!ready)
{
UpdatePos();
ready = true;
}
Ctrl* q = GetParent();
if(!q)
return;
Size sz = GetSize();
Size psz = q->GetSize();
if(IsHorz() && total > psz.cx || IsVert() && total > psz.cy) {
Point p(int(pos), 0);
Size rsz(int(size), IsVert() ? sz.cx : sz.cy);
Fix(p);
Fix(rsz);
#ifdef COLOR_ALPHA
w.DrawRect(p.x, p.y, rsz.cx, rsz.cy, White().Alpha(150));
#else
SystemDraw& sw = (SystemDraw&) w;
sw.alpha = 150.f;
w.DrawRect(p.x, p.y, rsz.cx, rsz.cy, White);
sw.alpha = 255.f;
#endif
}
}
void SlimScrollBar::Layout()
{
Size csz = GetSize();
Fix(csz);
if(ready && csz != sz)
{
sz = csz;
UpdatePos(false);
}
}
void SlimScrollBar::LeftDown(Point p, dword keyflags)
{
SetCapture();
Fix(p);
old_pos = new_pos = p.x;
if(p.x < pos || p.x > pos + size)
start_pos = size / 2;
else
start_pos = tabs(p.x - pos);
UpdatePos();
UpdateActionRefresh();
}
void SlimScrollBar::LeftUp(Point p, dword keyflags)
{
ReleaseCapture();
Fix(p);
old_pos = p.x;
}
void SlimScrollBar::MouseMove(Point p, dword keyflags)
{
if(!HasCapture())
return;
Fix(p);
new_pos = p.x;
UpdatePos();
UpdateActionRefresh();
}
void SlimScrollBar::MouseWheel(Point p, int zdelta, dword keyflags)
{
AddPos(-zdelta / 4, true);
UpdateActionRefresh();
}
int SlimScrollBar::GetPos() const
{
return int(ps);
}
void SlimScrollBar::SetPos(int p, bool dontscale, bool whenscroll)
{
pos = total > 0 ? dontscale ? p : iscale(p, sz.cx, t) : 0;
UpdatePos(false, whenscroll);
Refresh();
}
void SlimScrollBar::AddPos(int p, bool dontscale, bool whenscroll)
{
pos += total > 0 ? dontscale ? p : iscale(p, sz.cx, t) : 0;
UpdatePos(false, whenscroll);
Refresh();
}
int SlimScrollBar::GetTotal() const
{
return total;
}
void SlimScrollBar::SetTotal(int total, bool whenscroll)
{
Ctrl* q = GetParent();
Size sz = GetSize();
Size psz = q ? q->GetSize() : Size(0, 0);
Fix(sz);
Fix(psz);
this->total = total;
this->t = total;
if(q)
this->t -= psz.cx - sz.cx;
UpdatePos(false, whenscroll);
Refresh();
}
void SlimScrollBar::AddTotal(int t)
{
sz = GetSize();
Fix(sz);
total += t;
if(total <= 0 || sz.cx <= 0)
cs = ics = 0;
else
cs = sz.cx / ((double) t + 0.5);
size = int(sz.cx * cs);
ps = min(ps, (double)(t - sz.cx));
pos = (int)(ps * cs);
old_pos = new_pos = (int)(pos - start_pos);
Refresh();
}
void SlimScrollBar::GoEnd(bool whenscroll)
{
pos = total;
UpdatePos(false, whenscroll);
Refresh();
}
void SlimScrollBar::GoBegin(bool whenscroll)
{
pos = 0;
UpdatePos(false, whenscroll);
Refresh();
}
bool SlimScrollBar::IsEnd()
{
return isend;
}
bool SlimScrollBar::IsBegin()
{
return isbegin;
}
void SlimScrollBar::Set(const SlimScrollBar& t)
{
total = t.total;
pos = t.pos;
ps = t.ps;
Refresh();
}
bool SlimScrollBar::IsScrollable() const
{
return t > sz.cx && sz.cx > 0;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,100 +0,0 @@
#ifndef _CoreGl_Scrollbar_h_
#define _CoreGl_Scrollbar_h_
#include <CtrlLib/CtrlLib.h>
NAMESPACE_UPP
struct AlignedFrame : FrameCtrl<Ctrl>
{
int layout;
int framesize;
int border;
public:
enum
{
LEFT = 0,
TOP = 1,
RIGHT = 2,
BOTTOM = 3
};
AlignedFrame() : layout(TOP), framesize(0), border(0) {}
virtual void FrameAddSize(Size& sz);
virtual void FramePaint(Draw& w, const Rect& r);
virtual void FrameLayout(Rect& r);
bool IsVert() const { return (layout & 1) == 0; }
bool IsHorz() const { return layout & 1; }
bool IsTL() const { return layout < 2; }
bool IsBR() const { return layout >= 2; }
AlignedFrame& SetAlign(int align) { layout = align; FrameSet(); RefreshParentLayout(); return *this; }
AlignedFrame& SetLeft() { return SetAlign(LEFT); }
AlignedFrame& SetTop() { return SetAlign(TOP); }
AlignedFrame& SetRight() { return SetAlign(RIGHT); }
AlignedFrame& SetBottom() { return SetAlign(BOTTOM); }
AlignedFrame& SetFrameSize(int sz, bool refresh = true);
int GetAlign() const { return layout; }
int GetFrameSize() const { return framesize; }
int GetBorder() const { return border; }
protected:
void Fix(Size& sz);
void Fix(Point& p);
Size Fixed(const Size& sz);
Point Fixed(const Point& p);
bool HasBorder() { return border >= 0; }
AlignedFrame& SetBorder(int _border) { border = _border; return *this; }
virtual void FrameSet() { }
};
class SlimScrollBar : public AlignedFrame
{
private:
int total;
int t;
bool isend;
bool isbegin;
double pos, prev_ps, ps;
int new_pos;
int old_pos;
double start_pos;
double size;
double cs, ics;
virtual void UpdatePos(bool update = true, bool whenscroll = true);
void RefreshScroll();
bool ready;
Size sz;
public:
SlimScrollBar();
virtual void Paint(Draw& w);
virtual void LeftDown(Point p, dword keyflags);
virtual void LeftUp(Point p, dword keyflags);
virtual void MouseMove(Point p, dword keyflags);
virtual void MouseWheel(Point p, int zdelta, dword keyflags);
virtual void Layout();
int GetPos() const;
void SetPos(int p, bool dontscale = false, bool whenscroll = true);
void AddPos(int p, bool dontscale = false, bool whenscroll = true);
int GetTotal() const;
void AddTotal(int t);
void SetTotal(int t, bool whenscroll = true);
void GoEnd(bool whenscroll = true);
void GoBegin(bool whenscroll = true);
bool IsEnd();
bool IsBegin();
void Clear();
void Set(const SlimScrollBar& t);
bool IsScrollable() const;
Callback WhenScroll;
};
END_UPP_NAMESPACE
#endif

View file

@ -1,387 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "Shaders.h"
NAMESPACE_UPP
void Shader::PrintShaderInfoLog(GLuint obj, const char* fileName)
{
int infoLength = 0;
int charsWritten = 0;
glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infoLength);
if(infoLength > 0)
{
char* info = new char[infoLength];
glGetShaderInfoLog(obj, infoLength, &charsWritten, info);
if(charsWritten > 0)
{
compileError = info;
FileOut f(fileName);
f.Put(info);
}
delete[] info;
}
}
void Shader::PrintProgramInfoLog(GLuint obj, const char* fileName)
{
int infoLength = 0;
int charsWritten = 0;
glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infoLength);
if(infoLength > 0)
{
char* info = new char[infoLength];
glGetShaderInfoLog(obj, infoLength, &charsWritten, info);
if(charsWritten > 0)
{
FileOut f(fileName);
f.Put(info);
}
delete[] info;
}
}
void Shader::PrintProgramValidationLog(GLuint obj, const char* fileName)
{
char log[1024];
int len = 0;
glValidateProgram(obj);
glGetProgramInfoLog(obj, 1024, &len, log);
if(len > 0)
{
FileOut f(fileName);
f.Put(log);
}
}
bool Shader::CheckGLError()
{
unsigned int lastError = glGetError();
if(GL_NO_ERROR != lastError)
{
error = (const char*) gluErrorString(lastError);
return false;
}
return true;
}
bool Shader::IsProgramCompiled(int program)
{
GLint result = GL_FALSE;
glGetShaderiv(program, GL_COMPILE_STATUS, &result);
return result == GL_TRUE;
}
bool Shader::IsProgramLinked(int program)
{
GLint result = GL_FALSE;
glGetProgramiv(program, GL_LINK_STATUS, &result);
return result == GL_TRUE;
}
int Shader::CompileProgram(const char* vs, const char* fs, const char* gs)
{
vertSrc = vs;
fragSrc = fs;
geomSrc = gs;
const GLchar* vertexShaderSrc = (const GLchar*) vertSrc;
const GLchar* fragmentShaderSrc = (const GLchar*) fragSrc;
const GLchar* geometryShaderSrc = (const GLchar*) geomSrc;
DeleteFile("shader_vertex.log");
DeleteFile("shader_fragment.log");
DeleteFile("shader_geometry.log");
DeleteFile("shader_link.log");
DeleteFile("shader_validation.log");
GLenum vertexShader = 0;
GLenum fragmentShader = 0;
GLenum geometryShader = 0;
if(!vertSrc.IsEmpty())
{
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL);
glCompileShader(vertexShader);
if(!IsProgramCompiled(vertexShader))
{
PrintShaderInfoLog(vertexShader, "shader_vertex.log");
error = "Vertex shader compilation error:\n\n" + compileError;
glDeleteShader(vertexShader);
return -1;
}
}
if(!fragSrc.IsEmpty())
{
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSrc, NULL);
glCompileShader(fragmentShader);
if(!IsProgramCompiled(fragmentShader))
{
PrintShaderInfoLog(fragmentShader, "shader_fragment.log");
error = "Fragment shader compilation error:\n\n" + compileError;
glDeleteShader(fragmentShader);
return -1;
}
}
if(!geomSrc.IsEmpty())
{
geometryShader = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometryShader, 1, &geometryShaderSrc, NULL);
glCompileShader(geometryShader);
if(!IsProgramCompiled(geometryShader))
{
PrintShaderInfoLog(geometryShader, "shader_geometry.log");
error = "Geometry shader compilation error:\n\n" + compileError;
glDeleteShader(geometryShader);
return -1;
}
}
program = glCreateProgram();
if(program > 0)
{
if(vertexShader > 0)
glAttachShader(program, vertexShader);
if(fragmentShader > 0)
glAttachShader(program, fragmentShader);
if(geometryShader > 0)
glAttachShader(program, geometryShader);
glLinkProgram(program);
if(!IsProgramLinked(program))
{
PrintProgramInfoLog(program, "shader_link.log");
PrintProgramValidationLog(program, "shader_validation.log");
glDeleteProgram(program);
program = -1;
}
}
else
program = -1;
return program;
}
int Shader::CompileProgram(const byte* vs, const byte* fs, const byte* gs)
{
return CompileProgram((const char*) vs, (const char*) fs, (const char*) gs);
}
int Shader::GetProgram()
{
return program;
}
String Shader::GetError()
{
return error;
}
int Shader::GetUniformId(const char* var)
{
int n = uniforms.Find(var);
if(n < 0)
{
int id = glGetUniformLocation(program, var);
CheckGLError();
if(id >= 0)
uniforms.Add(var, id);
return id;
}
else
return uniforms[n];
}
int Shader::GetAttributeId(const char* var)
{
int n = attributes.Find(var);
if(n < 0)
{
int id = glGetAttribLocation(program, var);
CheckGLError();
if(id >= 0)
attributes.Add(var, id);
return id;
}
else
return attributes[n];
}
void Shader::SetUniform(const char* var, float v)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform1f(id, v);
}
void Shader::SetUniform(const char* var, bool v)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform1i(id, int(v));
}
void Shader::SetUniform(const char* var, int v)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform1i(id, v);
}
void Shader::SetUniform(const char* var, float v0, float v1)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform2f(id, v0, v1);
}
void Shader::SetUniform(const char* var, float v0, float v1, float v2)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform3f(id, v0, v1, v2);
}
void Shader::SetUniform(const char* var, float v0, float v1, float v2, float v3)
{
int id = GetUniformId(var);
if(id >= 0)
glUniform4f(id, v0, v1, v2, v3);
}
void Shader::SetUniform(const char* var, float* v, int size, int count)
{
int id = GetUniformId(var);
if(id >= 0)
{
if(size == 2)
glUniform2fv(id, count, v);
else if(size == 3)
glUniform3fv(id, count, v);
else if(size == 4)
glUniform4fv(id, count, v);
else if(size == 16)
glUniformMatrix4fv(id, count, GL_FALSE, v);
}
}
void Shader::SetMatrixUniform(const char* var, float* v, int size, int count)
{
int id = GetUniformId(var);
if(id >= 0)
{
if(size == 2)
glUniform2fv(id, count, v);
else if(size == 3)
glUniform3fv(id, count, v);
else if(size == 4)
glUniform4fv(id, count, v);
else if(size == 16)
glUniformMatrix4fv(id, count, GL_FALSE, v);
}
}
void Shader::EnableAttribute(const char* var, bool b)
{
int id = GetAttributeId(var);
if(id >= 0)
{
if(b)
glEnableVertexAttribArray(id);
else
glDisableVertexAttribArray(id);
}
}
void Shader::DisableAttribute(const char* var)
{
EnableAttribute(var, false);
}
void Shader::DisableAllAtrributes()
{
for(int i = 0; i < attributes.GetCount(); i++)
{
int id = attributes[i];
if(id >= 0)
glDisableVertexAttribArray(id);
}
}
void Shader::SetAttribute(const char* var, float v)
{
int id = GetAttributeId(var);
if(id >= 0)
glVertexAttrib1f(id, v);
}
void Shader::SetAttribute(const char* var, float v0, float v1)
{
int id = GetAttributeId(var);
if(id >= 0)
glVertexAttrib2f(id, v0, v1);
}
void Shader::SetAttribute(const char* var, float v0, float v1, float v2)
{
int id = GetAttributeId(var);
if(id >= 0)
glVertexAttrib3f(id, v0, v1, v2);
}
void Shader::SetAttribute(const char* var, float v0, float v1, float v2, float v3)
{
int id = GetAttributeId(var);
if(id >= 0)
glVertexAttrib4f(id, v0, v1, v2, v3);
}
void Shader::SetAttribute(const char* var, float* v, int size)
{
int id = GetAttributeId(var);
if(id >= 0)
{
if(size == 2)
glVertexAttrib2fv(id, v);
else if(size == 3)
glVertexAttrib3fv(id, v);
else if(size == 4)
glVertexAttrib4fv(id, v);
}
}
void Shader::Start()
{
glUseProgram(program);
CheckGLError();
}
void Shader::Stop()
{
glUseProgram(0);
}
void Shader::Release()
{
if(program >= 0)
glDeleteProgram(program);
}
Shader::Shader() : program(-1)
{}
END_UPP_NAMESPACE
#endif

View file

@ -1,65 +0,0 @@
#ifndef _CoreGl_Shaders_h_
#define _CoreGl_Shaders_h_
#include <Core/Core.h>
#include <Draw/Draw.h>
#include "Gl.h"
NAMESPACE_UPP
class Shader
{
private:
int program;
String error;
String compileError;
String fragSrc;
String vertSrc;
String geomSrc;
VectorMap<String, int> uniforms;
VectorMap<String, int> attributes;
void PrintShaderInfoLog(GLuint obj, const char* fileName);
void PrintProgramInfoLog(GLuint obj, const char* fileName);
void PrintProgramValidationLog(GLuint obj, const char* fileName);
bool CheckGLError();
bool IsProgramCompiled(int program);
bool IsProgramLinked(int program);
public:
int GetUniformId(const char* var);
int GetAttributeId(const char* var);
int CompileProgram(const char* vs, const char* fs, const char* gs = NULL);
int CompileProgram(const byte* vs, const byte* fs, const byte* gs = NULL);
int GetProgram();
void SetUniform(const char* var, float v);
void SetUniform(const char* var, bool v);
void SetUniform(const char* var, int v);
void SetUniform(const char* var, float v0, float v1);
void SetUniform(const char* var, float v0, float v1, float v2);
void SetUniform(const char* var, float v0, float v1, float v2, float v3);
void SetUniform(const char* var, float* v, int size, int count = 1);
void SetMatrixUniform(const char* var, float* v, int size, int count = 1);
void EnableAttribute(const char* var, bool b = true);
void DisableAttribute(const char* var);
void DisableAllAtrributes();
void SetAttribute(const char* var, float v);
void SetAttribute(const char* var, float v0, float v1);
void SetAttribute(const char* var, float v0, float v1, float v2);
void SetAttribute(const char* var, float v0, float v1, float v2, float v3);
void SetAttribute(const char* var, float* v, int size);
void Start();
void Stop();
String GetError();
void Release();
Shader();
};
END_UPP_NAMESPACE
#endif

View file

@ -1,149 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
void TopWindow::SyncFrameRect(const Rect& r)
{
frame->SetClient(r);
}
void TopWindow::DestroyFrame()
{
if(frame->IsOpen())
frame->DestroyWnd();
}
void TopWindow::GripResize()
{
frame->GripResize();
}
void TopWindow::SyncSizeHints()
{
SyncCaption();
}
void TopWindow::SyncTitle()
{
SyncCaption();
}
void TopWindow::SyncCaption()
{
GuiLock __;
frame->title = title.ToString();
frame->minsize = minsize;
frame->close.Show(!noclosebox);
frame->maximize.Show(maximizebox);
frame->sizeable = sizeable;
frame->RefreshLayout();
frame->Refresh();
frame->close <<= Proxy(WhenClose);
frame->icon = icon;
frame->Enable(IsEnabled());
}
void TopWindow::State(int reason)
{
SyncCaption();
}
void TopWindow::SyncRect()
{
frame->SyncRect();
Rect r = frame->GetClient();
if(r != GetRect()) {
SetRect(r);
}
}
void TopWindow::Open(Ctrl *owner)
{
GuiLock __;
Rect r = GetRect();
if(r.IsEmpty())
SetRect(GetDefaultWindowRect());
else
if(r.left == 0 && r.top == 0)
if(owner && center == 1)
SetRect(owner->GetRect().CenterRect(r.GetSize()));
else
if(center)
SetRect(GetWorkArea().CenterRect(r.GetSize()));
frame->SetClient(GetRect());
frame->window = this;
frame->PopUp(owner, false, true);
PopUp(frame, false, true);
popup = false;
SetRect(frame->GetClient());
SyncCaption();
if(state == MAXIMIZED)
frame->Maximize();
}
void TopWindow::Open()
{
Open(GetActiveCtrl());
}
void TopWindow::OpenMain()
{
Open(NULL);
}
void TopWindow::Minimize(bool effect)
{
// state = MINIMIZED;
}
TopWindow& TopWindow::FullScreen(bool b)
{
return *this;
}
void TopWindow::Maximize(bool effect)
{
state = MAXIMIZED;
frame->Maximize();
}
void TopWindow::Overlap(bool effect)
{
GuiLock __;
state = OVERLAPPED;
frame->Overlap();
}
TopWindow& TopWindow::TopMost(bool b, bool stay_top)
{
GuiLock __;
return *this;
}
bool TopWindow::IsTopMost() const
{
return true;
}
void TopWindow::GuiPlatformConstruct()
{
frame = new TopWindowFrame;
}
void TopWindow::GuiPlatformDestruct()
{
delete frame;
}
void TopWindow::SerializePlacement(Stream& s, bool reminimize)
{
GuiLock __;
}
END_UPP_NAMESPACE
#endif

View file

@ -1,16 +0,0 @@
//$ class TopWindow {
public:
virtual void State(int reason);
private:
TopWindowFrame *frame;
void SyncRect();
void SyncFrameRect(const Rect& r);
void DestroyFrame();
friend class Ctrl;
public:
void GripResize();
//$ };

View file

@ -1,209 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
NAMESPACE_UPP
#define LLOG(x) // LOG(x)
TopWindowFrame::TopWindowFrame()
{
close.SetImage(CoreGlImg::close());
close.EdgeStyle();
Add(close);
maximize.SetImage(CoreGlImg::maximize());
maximize.EdgeStyle();
Add(maximize);
maximize <<= THISBACK(ToggleMaximize);
maximized = false;
sizeable = false;
holding = false;
}
void TopWindowFrame::SyncRect()
{
if(maximized) {
Size sz = screenRect.GetSize();
if(GetRect().GetSize() != sz)
SetRect(sz);
}
}
void TopWindowFrame::Maximize()
{
if(!maximized && maximize.IsShown()) {
maximized = true;
overlapped = GetRect();
SetRect(screenRect);
maximize.SetImage(CoreGlImg::overlap());
}
}
void TopWindowFrame::Overlap()
{
if(maximized && maximize.IsShown()) {
maximized = false;
SetRect(overlapped);
maximize.SetImage(CoreGlImg::maximize());
}
}
void TopWindowFrame::ToggleMaximize()
{
if(maximized)
Overlap();
else
Maximize();
}
Rect TopWindowFrame::Margins() const
{
return maximized ? Rect(0, 0, 0, 0) : ChMargins(CoreGlImg::border());
}
void TopWindowFrame::Paint(Draw& w)
{
Size sz = GetSize();
Rect m = Margins();
int c = GetStdFontCy() + 4;
ChPaintEdge(w, sz, CoreGlImg::border());
Image img = window->IsForeground() ? CoreGlImg::title() : CoreGlImg::bgtitle();
resources.Bind(img, Resources::FORCE_FILTERING | Resources::LINEAR_FILTERING);
ChPaint(w, m.left, m.top, sz.cx - m.left - m.right, GetStdFontCy() + 4, img);
int tx = m.left + 2;
int tcx = sz.cx - m.left - m.right - 4 - c * (close.IsShown() + maximize.IsShown());
if(!IsNull(icon)) {
Image h = icon;
if(h.GetWidth() > c || h.GetHeight() > c)
h = Rescale(h, GetFitSize(h.GetSize(), Size(c)));
w.DrawImage(tx, m.top + 2, h);
tx += c;
tcx -= c;
}
DrawTextEllipsis(w, tx, m.top + 2, tcx, title, "..", StdFont(), SColorHighlightText());
}
void TopWindowFrame::Layout()
{
Size sz = GetSize();
Rect m = Margins();
int c = GetStdFontCy() + 4;
int x = sz.cx - m.right;
if(close.IsShown())
close.SetRect(x -= c, m.top, c, c);
if(maximize.IsShown())
maximize.SetRect(x -= c, m.top, c, c);
}
Rect TopWindowFrame::GetClient() const
{
Rect r = GetRect();
Rect m = Margins();
r.left += m.left;
r.right -= m.right;
r.top += m.top;
r.bottom -= m.bottom;
r.top += GetStdFontCy() + 4;
return r;
}
Rect TopWindowFrame::ComputeClient(Rect r)
{
Rect m = Margins();
r.left -= m.left;
r.right += m.right;
r.top -= m.top;
r.bottom += m.bottom;
r.top -= GetStdFontCy() + 4;
return r;
}
void TopWindowFrame::SetClient(Rect r)
{
SetRect(ComputeClient(r));
}
Point TopWindowFrame::GetDragMode(Point p)
{
Size sz = GetSize();
Rect m = ChMargins(CoreGlImg::border());
Point dir;
dir.y = p.y < m.top ? -1 : p.y > sz.cy - m.top ? 1 : 0;
dir.x = p.x < m.left ? -1 : p.x > sz.cx - m.right ? 1 : 0;
return dir;
}
void TopWindowFrame::StartDrag()
{
if(maximized)
return;
if(!sizeable && (dir.x || dir.y))
return;
SetCapture();
startrect = GetRect();
startpos = GetMousePos();
}
void TopWindowFrame::GripResize()
{
dir = Point(1, 1);
StartDrag();
}
void TopWindowFrame::LeftDown(Point p, dword keyflags)
{
dir = GetDragMode(p);
StartDrag();
}
void TopWindowFrame::LeftDouble(Point p, dword keyflags)
{
ToggleMaximize();
IgnoreMouseUp();
}
void TopWindowFrame::LeftUp(Point p, dword keyflags)
{
ReleaseCapture();
}
void TopWindowFrame::MouseMove(Point, dword)
{
if(!HasCapture())
return;
Size msz = ComputeClient(minsize).GetSize();
Point p = GetMousePos() - startpos;
Rect r = startrect;
if(dir.x == -1)
r.left = min(r.left + p.x, startrect.right - msz.cx);
if(dir.x == 1)
r.right = max(r.right + p.x, startrect.left + msz.cx);
if(dir.y == -1)
r.top = min(r.top + p.y, startrect.bottom - msz.cy);
if(dir.y == 1)
r.bottom = max(r.bottom + p.y, startrect.top + msz.cy);
if(dir.y == 0 && dir.x == 0)
r.Offset(p);
SetRect(r);
}
Image TopWindowFrame::GetDragImage(Point dir)
{
static Image (*im[9])() = {
Image::SizeTopLeft, Image::SizeLeft, Image::SizeBottomLeft,
Image::SizeTop, Image::Arrow, Image::SizeBottom,
Image::SizeTopRight, Image::SizeRight, Image::SizeBottomRight,
};
return (*im[(dir.x + 1) * 3 + (dir.y + 1)])();
}
Image TopWindowFrame::CursorImage(Point p, dword)
{
if(!sizeable)
return Image::Arrow();
return GetDragImage(HasCapture() ? dir : GetDragMode(p));
}
END_UPP_NAMESPACE
#endif

View file

@ -1,62 +0,0 @@
#ifndef _CoreGl_TopFrame_h_
#define _CoreGl_TopFrame_h_
#include <CtrlLib/CtrlLib.h>
NAMESPACE_UPP
class TopWindowFrame : public Ctrl {
public:
virtual void Layout();
virtual void Paint(Draw& w);
virtual Image CursorImage(Point p, dword keyflags);
virtual void LeftDown(Point p, dword keyflags);
virtual void LeftDouble(Point p, dword keyflags);
virtual void LeftUp(Point p, dword keyflags);
virtual void MouseMove(Point p, dword keyflags);
private:
Point dir;
Point startpos;
Rect startrect;
bool maximized;
Rect overlapped;
bool holding;
TimeCallback hold;
Point GetDragMode(Point p);
Image GetDragImage(Point dragmode);
void StartDrag();
Rect Margins() const;
Rect ComputeClient(Rect r);
void Hold();
typedef TopWindowFrame CLASSNAME;
public:
String title;
Button close, maximize;
Image icon;
Size minsize;
bool sizeable;
TopWindow *window;
void SetTitle(const String& s) { title = s; Refresh(); }
Rect GetClient() const;
void SetClient(Rect r);
void GripResize();
void Maximize();
void Overlap();
void ToggleMaximize();
bool IsMaximized() const { return maximized; }
void SyncRect();
TopWindowFrame();
};
END_UPP_NAMESPACE
#endif

View file

@ -1,87 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include <CtrlCore/CtrlCore.h>
NAMESPACE_UPP
void DDRect(RGBA *t, int dir, const byte *pattern, int pos, int count)
{
while(count-- > 0) {
byte p = pattern[7 & pos++];
t->r ^= p;
t->g ^= p;
t->b ^= p;
t += dir;
}
}
void DrawLine(const Vector<Rect>& clip, int x, int y, int cx, int cy, bool horz, const byte *pattern, int animation)
{
if(cx <= 0 || cy <= 0)
return;
/* Vector<Rect> rr = Intersection(clip, RectC(x, y, cx, cy));
for(int i = 0; i < rr.GetCount(); i++) {
Rect r = rr[i];
if(horz)
for(int y = r.top; y < r.bottom; y++)
DDRect(framebuffer[y] + r.left, 1, pattern, r.left + animation, r.GetWidth());
else
for(int x = r.left; x < r.right; x++)
DDRect(framebuffer[r.top] + x, framebuffer.GetWidth(), pattern, r.top + animation, r.GetHeight());
}*/
glColor4ub(255, 0, 0, 255);
//glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2i(x, y);
glVertex2i(x + cx, y + cy);
//glVertex2i(10, 10);
//glVertex2i(100, 100);
glEnd();
//glDisable(GL_LINE_STIPPLE);
}
void DragRectDraw0(const Vector<Rect>& clip, const Rect& rect, int n, const byte *pattern, int animation)
{
int hn = min(rect.GetHeight(), n);
int vn = min(rect.GetWidth(), n);
DrawLine(clip, rect.left, rect.top, rect.GetWidth(), hn, true, pattern, animation);
DrawLine(clip, rect.left, rect.top + hn, vn, rect.GetHeight() - hn, false, pattern, animation);
DrawLine(clip, rect.right - vn, rect.top + hn, vn, rect.GetHeight() - hn, false, pattern, animation);
DrawLine(clip, rect.left + vn, rect.bottom - hn, rect.GetWidth() - 2 * vn, hn, true, pattern, animation);
}
void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rect& clip, int n, Color color, int type, int animation)
{
static byte solid[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
static byte normal[] = { 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00 };
static byte dashed[] = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 };
Point p = Ctrl::screenRect.TopLeft();
Vector<Rect> pr;
if(type & Ctrl::DRAWDRAGRECT_SCREEN) {
pr.Add(Rect(Ctrl::screenRect.GetSize()));
type &= ~Ctrl::DRAWDRAGRECT_SCREEN;
p = Point(0, 0);
}
else
//pr = Intersection(screenRect, clip.Offseted(p));
pr.Add(clip.Offseted(p));
const byte *pattern = type == DRAWDRAGRECT_DASHED ? dashed :
type == DRAWDRAGRECT_NORMAL ? normal : solid;
DragRectDraw0(pr, rect1.Offseted(p), n, pattern, animation);
DragRectDraw0(pr, rect2.Offseted(p), n, pattern, animation);
}
void DrawDragRect(Ctrl& q, const Rect& rect1, const Rect& rect2, const Rect& clip, int n,
Color color, int type, int animation)
{
}
void FinishDragRect(Ctrl& q)
{
}
END_UPP_NAMESPACE
#endif

View file

@ -1,658 +0,0 @@
#if defined(flagWINGL) || defined(flagLINUXGL)
#include "TopFrame.h"
#include "ControlPanel.h"
#include "Console.h"
NAMESPACE_UPP
#define LLOG(x) DLOG(x)
#define LDUMP(x) DDUMP(x)
#define LDUMPC(x) DDUMPC(x)
Ptr<Ctrl> Ctrl::desktop;
Vector<Ctrl *> Ctrl::topctrl;
InfoPanel Ctrl::infoPanel;
Console Ctrl::console;
float Ctrl::angle = 0.f;
float Ctrl::scale = 1.f;
float Ctrl::alpha = 255.f;
Rect Ctrl::screenRect;
bool Ctrl::screenReady = false;
Point Ctrl::glCursorPos = Null;
Image Ctrl::glCursorImage;
Rect Ctrl::glCaretRect;
int Ctrl::glCaretTm;
int64 Ctrl::glEventLoop = 0;
int64 Ctrl::glEndSessionLoop = 0;
int Ctrl::PaintLock;
void GlLog(int line, const char* text, Color ink)
{
GuiLock __;
Ctrl::console.Log(line, text, ink);
}
void GlLog(const char* text, Color ink)
{
GuiLock __;
Ctrl::console.Log(text, ink);
}
void GlLogF(Color ink, const char* fmt, ...)
{
char buffer[1024];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buffer, fmt, argptr);
va_end(argptr);
GlLog(buffer, ink);
}
void GlLogF(const char* fmt, ...)
{
char buffer[1024];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buffer, fmt, argptr);
va_end(argptr);
GlLog(buffer);
}
void Ctrl::SetDesktop(Ctrl& q)
{
q.SetRect(screenRect.GetSize());
q.SetOpen(true);
q.StateH(OPEN);
q.NewTop();
desktop = &q;
}
void Ctrl::SetWindowSize(Size sz)
{
screenRect = sz;
if(desktop)
desktop->SetRect(screenRect);
}
void Ctrl::InitGl()
{
Ctrl::GlobalBackBuffer();
Ctrl::InitTimer();
ChStdSkin();
static StaticRect x;
x.Color(Cyan());
SetDesktop(x);
}
void Ctrl::EndSession()
{
GuiLock __;
glEndSession = true;
EndSessionLoopNo = EventLoopNo;
}
void Ctrl::ExitGl()
{
TopWindow::ShutdownWindows();
Ctrl::CloseTopCtrls();
if(glEndSession)
GlQuitSession();
}
int Ctrl::FindTopCtrl() const
{
for(int i = 0; i < topctrl.GetCount(); i++)
if(this == topctrl[i])
return i;
return -1;
}
bool Ctrl::IsAlphaSupported()
{
return false;
}
bool Ctrl::IsCompositedGui()
{
return false;
}
Vector<Ctrl *> Ctrl::GetTopCtrls()
{
Vector<Ctrl *> ctrl;
if(desktop)
ctrl.Add(desktop);
for(int i = 0; i < topctrl.GetCount(); i++)
if(!dynamic_cast<TopWindowFrame *>(topctrl[i]))
ctrl.Add(topctrl[i]);
return ctrl;
}
Ctrl *Ctrl::GetOwner()
{
GuiLock __;
int q = FindTopCtrl();
if(q > 0 && topctrl[q]->top) {
Ctrl *x = topctrl[q]->top->owner_window;
return dynamic_cast<TopWindowFrame *>(x) ? x->GetOwner() : x;
}
return NULL;
}
Ctrl *Ctrl::GetActiveCtrl()
{
GuiLock __;
if(focusCtrl == &infoPanel || focusCtrl == &console)
return desktop;
return focusCtrl ? focusCtrl->GetTopCtrl() : NULL;
}
// Vector<Callback> Ctrl::hotkey;
int Ctrl::RegisterSystemHotKey(dword key, Callback cb)
{
/* ASSERT(key >= K_DELTA);
int q = hotkey.GetCount();
for(int i = 0; i < hotkey.GetCount(); i++)
if(!hotkey[i]) {
q = i;
break;
}
hotkey.At(q) = cb;
dword mod = 0;
if(key & K_ALT)
mod |= MOD_ALT;
if(key & K_SHIFT)
mod |= MOD_SHIFT;
if(key & K_CTRL)
mod |= MOD_CONTROL;
return RegisterHotKey(NULL, q, mod, key & 0xffff) ? q : -1;*/
return -1;
}
void Ctrl::UnregisterSystemHotKey(int id)
{
/* if(id >= 0 && id < hotkey.GetCount()) {
UnregisterHotKey(NULL, id);
hotkey[id].Clear();
}*/
}
bool Ctrl::IsWaitingEvent()
{
return GlIsWaitingEvent();
}
void Ctrl::SyncTopWindows()
{
for(int i = 0; i < topctrl.GetCount(); i++) {
TopWindow *w = dynamic_cast<TopWindow *>(topctrl[i]);
if(w)
w->SyncRect();
}
}
bool Ctrl::ProcessEvent(bool *quit)
{
ASSERT(IsMainThread());
if(!GetMouseLeft() && !GetMouseRight() && !GetMouseMiddle())
ReleaseCtrlCapture();
if(GlProcessEvent(quit)) {
SyncTopWindows();
DefferedFocusSync();
SyncCaret();
return true;
}
else if(glDrawMode == DRAW_ON_IDLE && !Ctrl::painting)
{
GuiSleep(0);
TimerProc(GetTickCount());
SweepMkImageCache();
DrawScreen();
}
return false;
}
void Ctrl::DrawScreen()
{
#ifdef flagWINGL
if(hRC)
#endif
if(desktop && !painting) {
screenReady = true;
painting = true;
resources.BindStatic();
int64 t0 = GetHighTickCount();
frameInfo.curr_tick_count = t0;
desktop->ApplyLayout();
desktop->ApplyTransform(TS_BEFORE_SCREEN);
for(int i = 0; i < topctrl.GetCount(); i++) {
topctrl[i]->ApplyLayout();
topctrl[i]->ApplyTransform(TS_BEFORE_SCREEN);
}
Rect clip = desktop->GetRect();
SystemDraw draw(clip.GetSize());
infoPanel.Init(*desktop);
infoPanel.Show(controlPanelActive);
console.Init(*desktop);
console.Show(consoleActive);
draw.alpha = infoPanel.GetAlpha();
draw.angle = infoPanel.GetAngle();
draw.scale = infoPanel.GetScale();
draw.ViewPort();
draw.OrthogonalView();
draw.Clear(true);
screenFbo0.Bind();
screenFbo0.Clear();
desktop->ApplyTransform(TS_BEFORE_PAINT);
desktop->CtrlPaint(draw, clip);
screenFbo0.Unbind();
draw.OrthogonalView();
glDisable(GL_BLEND);
RectF drawRect(0.f, 0.f, (float) screenRect.GetWidth(), (float) screenRect.GetHeight());
float blur = SystemDraw::blurStrength;
float gray = SystemDraw::grayStrength;
if(blur > 0 || gray > 0)
{
float sigma = blur * 3.f;
float gx = 1.0f / (sqrt(2.0f * float(M_PI)) * sigma);
float gy = exp(-0.5f / (sigma * sigma));
float gz = gy * gy;
float blurSizeHorz = 1.f / (float) screenFbo0.width;
float blurSizeVert = 1.f / (float) screenFbo0.height;
blurProg.Start();
blurProg.SetUniform("blurSize", blurSizeHorz);
blurProg.SetUniform("gaussian", gx, gy, gz);
blurProg.SetUniform("blurMultiplyVec", 1, 0);
blurProg.SetUniform("blurStrength", blur);
blurProg.SetUniform("grayStrength", gray);
screenFbo1.Bind();
draw.DrawTextureOp(drawRect, screenFbo0.texId, screenFbo0.width, screenFbo0.height, drawRect);
screenFbo1.Unbind();
blurProg.SetUniform("blurSize", blurSizeVert);
blurProg.SetUniform("blurMultiplyVec", 0, 1);
blurProg.SetUniform("blurStrength", blur);
blurProg.SetUniform("grayStrength", gray);
draw.ApplyTransforms();
draw.DrawTextureOp(drawRect, screenFbo1.texId, screenFbo1.width, screenFbo1.height, drawRect);
blurProg.Stop();
}
else
{
draw.ApplyTransforms();
draw.DrawTextureOp(drawRect, screenFbo0.texId, screenFbo0.width, screenFbo0.height, drawRect);
//screenFbo0.BlitToScreen();
}
glEnable(GL_BLEND);
for(int i = 0; i < topctrl.GetCount(); i++) {
Ctrl* tq = topctrl[i];
if(tq == &infoPanel || tq == &console)
continue;
Rect r = tq->GetRect();
tq->ApplyTransform(TS_BEFORE_PAINT);
draw.Offset(r.left, r.top);
tq->CtrlPaint(draw, clip);
draw.End();
tq->ApplyTransform(TS_AFTER_PAINT);
}
CursorSync(draw);
desktop->PostPaint(draw);
desktop->ApplyTransform(TS_AFTER_PAINT);
glLoadIdentity();
#if CLIP_MODE == 2
//glDisable(GL_STENCIL_TEST);
#endif
draw.ImageColoring();
draw.alpha = 255.f;
if(controlPanelActive)
{
draw.Offset(infoPanel.GetRect().TopLeft());
infoPanel.CtrlPaint(draw, clip);
draw.End();
}
if(consoleActive)
{
draw.Offset(console.GetRect().TopLeft());
console.CtrlPaint(draw, clip);
draw.End();
}
#if CLIP_MODE == 2
//glEnable(GL_STENCIL_TEST);
#endif
MouseSync(draw);
#ifdef flagWINGL
SwapBuffers(hDC);
#endif
#ifdef flagLINUXGL
glXSwapBuffers(dpy, win);
#endif
int64 t1 = GetHighTickCount();
frameInfo.frame_time = t1 - t0;
frameInfo.frame_factor = frameInfo.frame_time * frameInfo.frame_skip / 1000.f;
frameInfo.fps = frameInfo.frame_time > 0.f ? 1000.f / (float)frameInfo.frame_time : 0.f;
//LOGF("ft: %d, t0: %d, t1: %d\n", frameInfo.frame_time, t0, t1);
painting = false;
}
}
bool Ctrl::ProcessEvents(bool *quit)
{
if(!ProcessEvent(quit))
return false;
while(ProcessEvent(quit) && (!LoopCtrl || LoopCtrl->InLoop()));
if(glDrawMode == DRAW_ON_TIMER)
{
TimerProc(GetTickCount());
SweepMkImageCache();
DrawScreen();
}
return true;
}
void Ctrl::EventLoop(Ctrl *ctrl)
{
GuiLock __;
ASSERT(IsMainThread());
ASSERT(LoopLevel == 0 || ctrl);
LoopLevel++;
Ptr<Ctrl> ploop;
if(ctrl) {
ploop = LoopCtrl;
LoopCtrl = ctrl;
ctrl->inloop = true;
}
bool quit = false;
int64 loopno = ++EventLoopNo;
ProcessEvents(&quit);
while(loopno > EndSessionLoopNo && !quit && (ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount()))
{
SyncCaret();
//if(glDrawMode == DRAW_ON_TIMER)
// GuiSleep(20);
ProcessEvents(&quit);
}
if(ctrl)
LoopCtrl = ploop;
LoopLevel--;
}
void Ctrl::GuiSleep(int ms)
{
GuiLock __;
ASSERT(IsMainThread());
int level = LeaveGuiMutexAll();
GlSleep(ms);
EnterGuiMutex(level);
}
Rect Ctrl::GetWndScreenRect() const
{
GuiLock __;
return GetRect();
}
void Ctrl::WndShow(bool b)
{
GuiLock __;
}
void Ctrl::WndUpdate()
{
GuiLock __;
}
void Ctrl::WndUpdate(const Rect& r)
{
GuiLock __;
}
bool Ctrl::IsWndOpen() const {
GuiLock __;
return FindTopCtrl() >= 0 || this == desktop;
}
void Ctrl::SetAlpha(byte alpha)
{
GuiLock __;
}
Rect Ctrl::GetWorkArea() const
{
GuiLock __;
return screenRect;
}
void Ctrl::GetWorkArea(Array<Rect>& rc)
{
GuiLock __;
//Array<Rect> r;
rc.Add(screenRect.GetSize());
}
Rect Ctrl::GetVirtualWorkArea()
{
return screenRect;
}
Rect Ctrl::GetWorkArea(Point pt)
{
return screenRect;
}
Rect Ctrl::GetVirtualScreenArea()
{
return screenRect;
}
Rect Ctrl::GetPrimaryWorkArea()
{
return screenRect;
}
Rect Ctrl::GetPrimaryScreenArea()
{
return screenRect;
}
int Ctrl::GetKbdDelay()
{
GuiLock __;
return 500;
}
int Ctrl::GetKbdSpeed()
{
GuiLock __;
return 1000 / 32;
}
void Ctrl::DestroyWnd()
{
for(int i = 0; i < topctrl.GetCount(); i++)
if(topctrl[i]->top && topctrl[i]->top->owner_window == this)
topctrl[i]->WndDestroy();
int q = FindTopCtrl();
if(q >= 0) {
topctrl.Remove(q);
}
if(top) {
delete top;
top = NULL;
}
isopen = false;
TopWindow *win = dynamic_cast<TopWindow *>(this);
if(win)
win->DestroyFrame();
}
void Ctrl::WndDestroy()
{
DestroyWnd();
if(topctrl.GetCount())
topctrl.Top()->ActivateWnd();
}
void Ctrl::PutForeground()
{
int q = FindTopCtrl();
if(q >= 0) {
topctrl.Remove(q);
topctrl.Add(this);
}
Vector< Ptr<Ctrl> > fw;
for(int i = 0; i < topctrl.GetCount(); i++)
if(topctrl[i] && topctrl[i]->top && topctrl[i]->top->owner_window == this && topctrl[i] != this)
fw.Add(topctrl[i]);
for(int i = 0; i < fw.GetCount(); i++)
if(fw[i])
fw[i]->PutForeground();
}
void Ctrl::SetWndForeground()
{
GuiLock __;
ASSERT(IsOpen());
if(IsWndForeground())
return;
Ctrl *to = this;
while(to->top && to->top->owner_window)
to = to->top->owner_window;
to->PutForeground();
if(this != focusCtrl)
ActivateWnd();
}
bool Ctrl::IsWndForeground() const
{
GuiLock __;
bool b = false;
for(int i = 0; i < topctrl.GetCount(); i++) {
const TopWindow *tw = dynamic_cast<const TopWindow *>(topctrl[i]);
if(tw)
b = tw == this;
}
return b;
}
void Ctrl::WndEnable(bool b)
{
GuiLock __;
}
bool Ctrl::SetWndFocus()
{
GuiLock __;
return true;
}
bool Ctrl::HasWndFocus() const
{
GuiLock __;
return focusCtrl && focusCtrl->GetTopCtrl() == this;
}
bool Ctrl::SetWndCapture()
{
GuiLock __;
ASSERT(IsMainThread());
return true;
}
bool Ctrl::ReleaseWndCapture()
{
GuiLock __;
ASSERT(IsMainThread());
return true;
}
bool Ctrl::HasWndCapture() const
{
GuiLock __;
return captureCtrl && captureCtrl->GetTopCtrl() == this;
}
void Ctrl::WndInvalidateRect(const Rect& r)
{
GuiLock __;
//::InvalidateRect(glHwnd, NULL, false);
}
void Ctrl::WndSetPos(const Rect& rect)
{
GuiLock __;
TopWindow *w = dynamic_cast<TopWindow *>(this);
if(w)
w->SyncFrameRect(rect);
SetWndRect(rect);
}
void Ctrl::WndScrollView(const Rect& r, int dx, int dy)
{
GuiLock __;
}
void Ctrl::PopUp(Ctrl *owner, bool savebits, bool activate, bool dropshadow, bool topmost)
{
ASSERT(!IsChild() && !IsOpen() && FindTopCtrl() < 0);
NewTop();
if(owner) {
Ctrl *owner_window = owner->GetTopWindow();
if(!owner_window)
owner_window = owner->GetTopCtrl();
ASSERT(owner_window->IsOpen());
if(owner_window != desktop) {
owner_window->SetForeground();
top->owner_window = owner_window;
}
}
topctrl.Add(this);
popup = isopen = true;
StateH(OPEN);
if(activate) SetFocusWnd();
}
Rect Ctrl::GetDefaultWindowRect() {
GuiLock __;
int ii = 0;
Size sz = screenRect.GetSize();
Rect rect = sz;
rect.Deflate(sz / 8);
rect.Offset(Point(sz) / 16 * (ii % 8));
return rect;
}
Vector<WString> SplitCmdLine__(const char *cmd)
{
Vector<WString> out;
while(*cmd)
if((byte)*cmd <= ' ')
cmd++;
else if(*cmd == '\"') {
WString quoted;
while(*++cmd && (*cmd != '\"' || *++cmd == '\"'))
quoted.Cat(FromSystemCharset(String(cmd, 1)).ToWString());
out.Add(quoted);
}
else {
const char *begin = cmd;
while((byte)*cmd > ' ')
cmd++;
out.Add(String(begin, cmd).ToWString());
}
return out;
}
END_UPP_NAMESPACE
#endif

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +0,0 @@
#ifndef _CoreGl_icpp_init_stub
#define _CoreGl_icpp_init_stub
#include "Painter/init"
#endif

File diff suppressed because it is too large Load diff