.uppdev: FDraw

git-svn-id: svn://ultimatepp.org/upp/trunk@6065 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2013-05-13 11:52:48 +00:00
parent 4792c29429
commit a505beca6d
9 changed files with 200 additions and 55 deletions

View file

@ -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)

View file

@ -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();
}

View file

@ -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);
}

View 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];
}
}

View file

@ -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)

View file

@ -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;

View file

@ -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 {

View file

@ -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
View 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; &]