mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
.uppdev: FDraw
git-svn-id: svn://ultimatepp.org/upp/trunk@6065 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
4792c29429
commit
a505beca6d
9 changed files with 200 additions and 55 deletions
|
|
@ -2,31 +2,23 @@
|
|||
|
||||
dword FDraw::GetInfo() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, int n, const int *dx)
|
||||
{
|
||||
return DRAWTEXTLINES;
|
||||
}
|
||||
|
||||
void FDraw::DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color)
|
||||
{
|
||||
}
|
||||
|
||||
void FDraw::DrawDrawingOp(const Rect& target, const Drawing& w)
|
||||
{
|
||||
}
|
||||
|
||||
void FDraw::DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor)
|
||||
{
|
||||
}
|
||||
|
||||
void FDraw::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color)
|
||||
{
|
||||
}
|
||||
|
||||
void FDraw::DrawPaintingOp(const Rect& target, const Painting& w)
|
||||
{
|
||||
Width(width);
|
||||
docolor = color;
|
||||
Move(Point(x1, y1));
|
||||
Line(Point(x2, y2));
|
||||
}
|
||||
|
||||
void FDraw::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)
|
||||
|
|
|
|||
|
|
@ -1,38 +1,65 @@
|
|||
#include "glyph.h"
|
||||
|
||||
void FDraw::Init(const Rect& r)
|
||||
{
|
||||
Cloff& c = cloff.Add();
|
||||
c.clip.Add(r);
|
||||
c.offset = Point(0, 0);
|
||||
}
|
||||
|
||||
void FDraw::BeginOp()
|
||||
{
|
||||
Cloff& c = cloff.Top();
|
||||
cloff.Add() <<= c;
|
||||
}
|
||||
|
||||
bool FDraw::ClipOp(const Rect& r)
|
||||
{
|
||||
return false;
|
||||
Cloff& c = cloff.Top();
|
||||
Cloff& c1 = cloff.Add();
|
||||
c1.clip = Intersection(c.clip, r + c.offset);
|
||||
c1.offset = c.offset;
|
||||
return c1.clip.GetCount();
|
||||
}
|
||||
|
||||
bool FDraw::ClipoffOp(const Rect& r)
|
||||
{
|
||||
return false;
|
||||
Cloff& c = cloff.Top();
|
||||
Cloff& c1 = cloff.Add();
|
||||
c1.clip = Intersection(c.clip, r + c.offset);
|
||||
c1.offset = c.offset + r.TopLeft();
|
||||
return c1.clip.GetCount();
|
||||
}
|
||||
|
||||
bool FDraw::IntersectClipOp(const Rect& r)
|
||||
{
|
||||
return false;
|
||||
Cloff& c = cloff.Top();
|
||||
c.clip = Intersection(c.clip, r + c.offset);
|
||||
return c.clip.GetCount();
|
||||
}
|
||||
|
||||
bool FDraw::ExcludeClipOp(const Rect& r)
|
||||
{
|
||||
return false;
|
||||
Cloff& c = cloff.Top();
|
||||
bool dummy;
|
||||
c.clip = Subtract(c.clip, r + c.offset, dummy);
|
||||
return c.clip.GetCount();
|
||||
}
|
||||
|
||||
bool FDraw::IsPaintingOp(const Rect& r) const
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void FDraw::OffsetOp(Point p)
|
||||
{
|
||||
Cloff& c = cloff.Top();
|
||||
Cloff& c1 = cloff.Add();
|
||||
c1.clip <<= c.clip;
|
||||
c1.offset = c.offset + p;
|
||||
}
|
||||
|
||||
void FDraw::EndOp()
|
||||
{
|
||||
cloff.Drop();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,12 +29,8 @@ void FDraw::SysDrawImageOp(int x, int y, const Image& img, const Rect& src, Colo
|
|||
}
|
||||
Rect sr(Point(x, y) + cloff.Top().offset, (src & img.GetSize()).GetSize());
|
||||
const Vector<Rect>& clip = cloff.Top().clip;
|
||||
DLOG("=======");
|
||||
for(int i = 0; i < clip.GetCount(); i++) {
|
||||
Rect cr = clip[i] & sr;
|
||||
DDUMP(cr);
|
||||
DDUMP(sr);
|
||||
DDUMP(src);
|
||||
if(!cr.IsEmpty())
|
||||
PutImage(cr.TopLeft(), img, Rect(cr.TopLeft() - sr.TopLeft() + src.TopLeft(), cr.GetSize()));
|
||||
}
|
||||
|
|
@ -57,3 +53,14 @@ void FDraw::DrawRectOp(int x, int y, int cx, int cy, Color color)
|
|||
}
|
||||
}
|
||||
|
||||
void FDraw::PutHorz(int x, int y, int cx)
|
||||
{
|
||||
RTIMING("PutHorz");
|
||||
DrawRect(x, y, cx, 1, docolor);
|
||||
}
|
||||
|
||||
void FDraw::PutVert(int x, int y, int cy)
|
||||
{
|
||||
RTIMING("PutVert");
|
||||
DrawRect(x, y, 1, cy, docolor);
|
||||
}
|
||||
|
|
|
|||
39
uppdev/Glyph/FDrawText.cpp
Normal file
39
uppdev/Glyph/FDrawText.cpp
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#include "glyph.h"
|
||||
|
||||
struct sMakeGlyph : public ImageMaker
|
||||
{
|
||||
int chr;
|
||||
Font font;
|
||||
int angle;
|
||||
Color color;
|
||||
|
||||
virtual String Key() const {
|
||||
StringBuffer h;
|
||||
RawCat(h, chr);
|
||||
RawCat(h, font);
|
||||
RawCat(h, angle);
|
||||
RawCat(h, color);
|
||||
return h;
|
||||
}
|
||||
|
||||
virtual Image Make() const {
|
||||
RTIMING("Render glyph");
|
||||
return RenderGlyph(font, chr, color, angle);
|
||||
}
|
||||
};
|
||||
|
||||
void FDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, int n, const int *dx)
|
||||
{
|
||||
sMakeGlyph g;
|
||||
g.font = font;
|
||||
g.color = ink;
|
||||
g.angle = angle; // TODO!
|
||||
for(int i = 0; i < n; i++) {
|
||||
g.chr = text[i];
|
||||
RTIMING("Paint glyph");
|
||||
Image m = MakeImage(g);
|
||||
Point h = m.GetHotSpot();
|
||||
SysDrawImageOp(x - h.x, y - h.y, m, m.GetSize(), Null);
|
||||
x += dx ? *dx++ : font[g.chr];
|
||||
}
|
||||
}
|
||||
|
|
@ -28,19 +28,21 @@ Image AutoCrop(const Image& m, RGBA c)
|
|||
;
|
||||
r.right++;
|
||||
r.bottom++;
|
||||
return WithHotSpot(Crop(m, r), 20, 20);
|
||||
Point p1 = m.GetHotSpot() - r.TopLeft();
|
||||
Point p2 = m.Get2ndSpot() - r.TopLeft();
|
||||
return WithHotSpots(Crop(m, r), p1.x, p1.y, p2.x, p2.y);
|
||||
}
|
||||
|
||||
Image RenderGlyph(Font fnt, int chr)
|
||||
Image RenderGlyph(Font fnt, int chr, Color color, int angle)
|
||||
{
|
||||
int cx = fnt[chr];
|
||||
int cy = fnt.GetLineHeight();
|
||||
ImageBuffer ib(2 * cx, 2 * cy);
|
||||
ImageBuffer ib(2 * (cx + cy), 2 * (cx + cy));
|
||||
BufferPainter sw(ib, MODE_ANTIALIASED);
|
||||
sw.Clear(RGBAZero());
|
||||
sw.DrawText(cx / 2, cy / 2, WString(chr, 1), fnt, Black());
|
||||
ib.SetHotSpot(Point(20, 20));
|
||||
return ib;
|
||||
sw.DrawText(cx + cy, cx + cy, angle, WString(chr, 1), fnt, color);
|
||||
ib.SetHotSpot(Point(cx + cy, cx + cy));
|
||||
return AutoCrop(ib, RGBAZero());
|
||||
}
|
||||
|
||||
String CompressGlyph(const Image& m)
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@ file
|
|||
TestDraw.cpp,
|
||||
FDrawClip.cpp,
|
||||
FDrawPut.cpp,
|
||||
FDrawText.cpp,
|
||||
FDraw.cpp,
|
||||
Glyph.cpp,
|
||||
main.cpp optimize_speed,
|
||||
text.qtf,
|
||||
help.txt,
|
||||
glyph.iml;
|
||||
|
||||
|
|
|
|||
|
|
@ -8,29 +8,22 @@ using namespace Upp;
|
|||
|
||||
|
||||
Image AutoCrop(const Image& m, RGBA c);
|
||||
Image RenderGlyph(Font fnt, int chr);
|
||||
Image RenderGlyph(Font fnt, int chr, Color color, int angle);
|
||||
|
||||
String CompressGlyph(const Image& m);
|
||||
Image DecompressGlyph(const String& g, Color c);
|
||||
|
||||
struct FDraw : Draw {
|
||||
struct Cloff {
|
||||
Vector<Rect> clip;
|
||||
Point offset;
|
||||
};
|
||||
|
||||
Array<Cloff> cloff;
|
||||
|
||||
struct FDraw : Draw, DDARasterizer {
|
||||
virtual dword GetInfo() const;
|
||||
|
||||
virtual void BeginOp();
|
||||
virtual bool ClipOp(const Rect& r);
|
||||
virtual bool ClipoffOp(const Rect& r);
|
||||
virtual bool IntersectClipOp(const Rect& r);
|
||||
virtual bool IsPaintingOp(const Rect& r) const;
|
||||
virtual void OffsetOp(Point p);
|
||||
virtual bool ExcludeClipOp(const Rect& r);
|
||||
virtual void EndOp();
|
||||
|
||||
virtual bool IsPaintingOp(const Rect& r) const;
|
||||
|
||||
virtual void SysDrawImageOp(int x, int y, const Image& img, Color color);
|
||||
virtual void SysDrawImageOp(int x, int y, const Image& img, const Rect& src, Color color);
|
||||
|
|
@ -39,15 +32,31 @@ struct FDraw : Draw {
|
|||
virtual void DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, int n, const int *dx);
|
||||
|
||||
virtual void DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color);
|
||||
virtual void DrawDrawingOp(const Rect& target, const Drawing& w);
|
||||
virtual void DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor);
|
||||
virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color);
|
||||
virtual void DrawPaintingOp(const Rect& target, const Painting& w);
|
||||
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 DrawPolyPolylineOp(const Point *vertices, int vertex_count, const int *counts, int count_count, int width, Color color, Color doxor);
|
||||
|
||||
virtual void PutHorz(int x, int y, int cx);
|
||||
virtual void PutVert(int x, int y, int cy);
|
||||
|
||||
//private:
|
||||
struct Cloff {
|
||||
Vector<Rect> clip;
|
||||
Point offset;
|
||||
|
||||
void operator<<=(const Cloff& b) { clip <<= b.clip; offset = b.offset; }
|
||||
};
|
||||
|
||||
Array<Cloff> cloff;
|
||||
|
||||
Color docolor;
|
||||
|
||||
public:
|
||||
virtual void PutImage(Point p, const Image& m, const Rect& src) = 0;
|
||||
virtual void PutRect(const Rect& r, Color color) = 0;
|
||||
|
||||
void Init(const Rect& r);
|
||||
};
|
||||
|
||||
struct TestDraw : FDraw {
|
||||
|
|
|
|||
|
|
@ -12,17 +12,6 @@ using namespace Upp;
|
|||
#define IMAGEFILE <Glyph/glyph.iml>
|
||||
#include <Draw/iml_source.h>
|
||||
|
||||
struct ColorRenderer : DDARasterizer {
|
||||
Draw *draw;
|
||||
Color color;
|
||||
|
||||
virtual void PutHorz(int x, int y, int cx) {
|
||||
draw->DrawRect(x, y, cx, 1, color);
|
||||
}
|
||||
virtual void PutVert(int x, int y, int cy) {
|
||||
draw->DrawRect(x, y, 1, cy, color);
|
||||
}
|
||||
};
|
||||
|
||||
struct MyApp : TopWindow {
|
||||
Point p;
|
||||
|
|
@ -58,9 +47,10 @@ void MyApp::Paint(Draw& w)
|
|||
{
|
||||
Size sz = GetSize();
|
||||
|
||||
w.DrawRect(sz, Gray());
|
||||
w.DrawRect(sz, White());
|
||||
|
||||
Vector<Rect> clip;
|
||||
|
||||
clip.Add(RectC(50, 50, 10, 10));
|
||||
clip.Add(RectC(100, 100, 20, 20));
|
||||
clip.Add(RectC(200, 100, 40, 40));
|
||||
|
|
@ -68,18 +58,30 @@ void MyApp::Paint(Draw& w)
|
|||
clip.Add(RectC(200, 200, 40, 40));
|
||||
clip.Add(RectC(220, 210, 30, 30));
|
||||
|
||||
SeedRandom();
|
||||
for(int i = 0; i < 20; i++)
|
||||
clip.Add(RectC(Random(sz.cx), Random(sz.cy), Random(100), Random(100)));
|
||||
|
||||
// clip.Add(sz);
|
||||
|
||||
TestDraw fw;
|
||||
fw.Cy(sz.cy);
|
||||
fw.draw = &w;
|
||||
fw.Init(sz);
|
||||
/*
|
||||
fw.cloff.Add();
|
||||
fw.cloff.Top().offset = Point(0, 0);
|
||||
for(int i = 0; i < clip.GetCount(); i++) {
|
||||
w.DrawRect(clip[i], LtGray());
|
||||
fw.cloff.Top().clip.Add(clip[i]);
|
||||
}
|
||||
|
||||
*/
|
||||
String txt = LoadFile(GetDataFile("text.qtf"));
|
||||
ParseQTF(txt).Paint(Zoom(2, 10), fw, 0, 0, sz.cx);
|
||||
|
||||
// fw.DrawText(sz.cx / 2, sz.cy / 2, -3600 * Bearing(p - sz / 2) / M_2PI,
|
||||
// "Hello world! abcdefghijklmnopqrstuv", Roman(40).Underline(), Red());
|
||||
fw.DrawImage(p.x, p.y, CtrlImg::reporticon(), RectC(0, 0, 20, 12), Blue());
|
||||
// fw.DrawRect(p.x, p.y, 16, 16, Red());
|
||||
}
|
||||
|
||||
GUI_APP_MAIN
|
||||
|
|
|
|||
65
uppdev/Glyph/text.qtf
Normal file
65
uppdev/Glyph/text.qtf
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
[ $$0,0#00000000000000000000000000000000:Default]
|
||||
[*C@3+75 $$1,1#36268203433472503231438721581057:code]
|
||||
[*/+117 $$2,0#07143242482611002448121871408047:title]
|
||||
[@(128.0.255)2 $$3,0#65874547464505293575048467215454:QTF Chr]
|
||||
[{_}%EN-US
|
||||
[s0;= [*8 QTF]&]
|
||||
[s0; &]
|
||||
[s0; QTF is the native format of Ultimate`+`+ rich texts (formatted
|
||||
texts).&]
|
||||
[s0; &]
|
||||
[s0; It is byte oriented format. Bytes with values 2`-31 are ignored.
|
||||
Other are interpreted as characters or formatting commands.&]
|
||||
[s0; &]
|
||||
[s0; Letters ([@4 a]`-[@4 zA]`-[@4 Z]), numbers ([@4 0]`-[@4 9]), space (32)
|
||||
and characters&]
|
||||
[s0; &]
|
||||
[s0; [*@4 . , ; ! ? % ( ) / < > #]&]
|
||||
[s0; &]
|
||||
[s0; and bytes greater than 127 are guaranteed to be never used as
|
||||
command characters (not even in future versions of QTF). Other
|
||||
characters should be prefixed with escape character `` (reverse
|
||||
apostrophe). Group of characters can be escaped using byte 1.
|
||||
Example:&]
|
||||
[s0; &]
|
||||
[s1; `\"`\1a`[x`]`\1`[`* bold`]`\"&]
|
||||
[s0; &]
|
||||
[s0; Byte 0 represents the end of input sequence.&]
|
||||
[s0; &]
|
||||
[s0; Dimension units of QTF are dots `- one dot is defined as 1/600
|
||||
of inch.&]
|
||||
[s0; &]
|
||||
[s0; Colors are described as either number [@(128.0.255) 0]`-[@(128.0.255) 9],
|
||||
with meaning&]
|
||||
[s0; &]
|
||||
[ {{1000:1000:1000:1000:1000:1000:1000:1000:1000:1000<96;>96;f4; [s0;%- [* 0]]
|
||||
:: [s0;%- [* 1]]
|
||||
:: [s0;%- [* 2]]
|
||||
:: [s0;%- [* 3]]
|
||||
:: [s0;%- [* 4]]
|
||||
:: [s0;%- [* 5]]
|
||||
:: [s0;%- [* 6]]
|
||||
:: [s0;%- [* 7]]
|
||||
:: [s0;%- [* 8]]
|
||||
:: [s0;%- [* 9]]
|
||||
::l/0r/0t/0b/0@0 [s0; ]
|
||||
::@1 [s0; ]
|
||||
::@2 [s0; ]
|
||||
::@3 [s0; ]
|
||||
::@4 [s0; ]
|
||||
::@5 [s0; ]
|
||||
::@6 [s0; ]
|
||||
::@7 [s0; ]
|
||||
::@8 [s0; ]
|
||||
::@9 [s0; ]
|
||||
::l/25r/25t/15b/15@2 [s0;%- [1 Black]]
|
||||
:: [s0; [1 LtGray]]
|
||||
:: [s0; [1 White]]
|
||||
:: [s0;%- [1 Red]]
|
||||
:: [s0;%- [1 Green]]
|
||||
:: [s0;%- [1 Blue]]
|
||||
:: [s0;%- [1 LtRed]]
|
||||
:: [s0;%- [1 WhiteGray]]
|
||||
:: [s0;%- [1 LtCyan]]
|
||||
:: [s0;%- [1 Yellow]]}}&]
|
||||
[s0; &]
|
||||
Loading…
Add table
Add a link
Reference in a new issue