mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
.uppdev
git-svn-id: svn://ultimatepp.org/upp/trunk@6083 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
f8e6676775
commit
744b470794
9 changed files with 20 additions and 303 deletions
|
|
@ -1,30 +0,0 @@
|
|||
#include "glyph.h"
|
||||
|
||||
dword FDraw::GetInfo() const
|
||||
{
|
||||
return DRAWTEXTLINES;
|
||||
}
|
||||
|
||||
void FDraw::DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color)
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
void FDraw::DrawPolyPolylineOp(const Point *vertices, int vertex_count, const int *counts, int count_count, int width, Color color, Color doxor)
|
||||
{
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
#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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
Cloff& c = cloff.Top();
|
||||
c.clip = Intersection(c.clip, r + c.offset);
|
||||
return c.clip.GetCount();
|
||||
}
|
||||
|
||||
bool FDraw::ExcludeClipOp(const Rect& r)
|
||||
{
|
||||
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 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();
|
||||
}
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
#include "glyph.h"
|
||||
|
||||
struct sColorize : public ImageMaker
|
||||
{
|
||||
Image img;
|
||||
Color color;
|
||||
|
||||
virtual String Key() const {
|
||||
StringBuffer h;
|
||||
RawCat(h, color);
|
||||
RawCat(h, img.GetSerialId());
|
||||
return h;
|
||||
}
|
||||
|
||||
virtual Image Make() const {
|
||||
return SetColorKeepAlpha(img, color);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void FDraw::SysDrawImageOp(int x, int y, const Image& img, const Rect& src, Color color)
|
||||
{
|
||||
if(!IsNull(color)) {
|
||||
sColorize m;
|
||||
m.img = img;
|
||||
m.color = color;
|
||||
SysDrawImageOp(x, y, MakeImage(m), src, Null);
|
||||
return;
|
||||
}
|
||||
Rect sr(Point(x, y) + cloff.Top().offset, (src & img.GetSize()).GetSize());
|
||||
const Vector<Rect>& clip = cloff.Top().clip;
|
||||
for(int i = 0; i < clip.GetCount(); i++) {
|
||||
Rect cr = clip[i] & sr;
|
||||
if(!cr.IsEmpty())
|
||||
PutImage(cr.TopLeft(), img, Rect(cr.TopLeft() - sr.TopLeft() + src.TopLeft(), cr.GetSize()));
|
||||
}
|
||||
}
|
||||
|
||||
void FDraw::SysDrawImageOp(int x, int y, const Image& img, Color color)
|
||||
{
|
||||
SysDrawImageOp(x, y, img, img.GetSize(), color);
|
||||
}
|
||||
|
||||
void FDraw::DrawRectOp(int x, int y, int cx, int cy, Color color)
|
||||
{
|
||||
Rect r = RectC(x, y, cx, cy);
|
||||
r += cloff.Top().offset;
|
||||
const Vector<Rect>& clip = cloff.Top().clip;
|
||||
for(int i = 0; i < clip.GetCount(); i++) {
|
||||
Rect cr = clip[i] & r;
|
||||
if(!cr.IsEmpty())
|
||||
PutRect(cr, 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);
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
#include "glyph.h"
|
||||
|
||||
#define LTIMING(x) // RTIMING(x)
|
||||
|
||||
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 {
|
||||
LTIMING("Render glyph");
|
||||
Point at(font[chr], font.GetLineHeight());
|
||||
int n = 2 * (at.x + at.y);
|
||||
return AutoCrop(RenderGlyph(at, angle, chr, font, color, Size(n, n)), RGBAZero());
|
||||
}
|
||||
};
|
||||
|
||||
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;
|
||||
for(int i = 0; i < n; i++) {
|
||||
g.chr = text[i];
|
||||
LTIMING("Paint glyph");
|
||||
if(font.GetHeight() > 200) {
|
||||
Point at(font[g.chr], font.GetLineHeight());
|
||||
int n = at.x + at.y;
|
||||
Size bandsz(2 * n, 32);
|
||||
for(int yy = 0; yy < n; yy += bandsz.cy) {
|
||||
Image m = RenderGlyph(Point(0, -yy), angle, g.chr, font, ink, bandsz);
|
||||
DDUMP(m.GetSize());
|
||||
SysDrawImageOp(x, y + yy, m, m.GetSize(), Null);
|
||||
}
|
||||
}
|
||||
else {
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +1,5 @@
|
|||
#include "glyph.h"
|
||||
|
||||
bool IsUniform(const RGBA *s, RGBA c, int add, int n)
|
||||
{
|
||||
while(n-- > 0) {
|
||||
if(*s != c)
|
||||
return false;
|
||||
s += add;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Image AutoCrop(const Image& m, RGBA c)
|
||||
{
|
||||
Size isz = m.GetSize();
|
||||
Rect r = isz;
|
||||
for(r.top = 0; r.top < isz.cy && IsUniform(m[r.top], c, 1, isz.cx); r.top++)
|
||||
;
|
||||
for(r.bottom = isz.cy; r.bottom > r.top && IsUniform(m[r.bottom - 1], c, 1, isz.cx); r.bottom--)
|
||||
;
|
||||
if(r.bottom <= r.top)
|
||||
return Null;
|
||||
int h = r.GetHeight();
|
||||
const RGBA *p = m[r.top];
|
||||
for(r.left = 0; r.left < isz.cy && IsUniform(p + r.left, c, isz.cx, h); r.left++)
|
||||
;
|
||||
for(r.right = isz.cx; r.right > r.left && IsUniform(p + r.right - 1, c, isz.cx, h); r.right--)
|
||||
;
|
||||
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, Color color, int angle)
|
||||
{
|
||||
|
|
@ -43,6 +13,7 @@ Image RenderGlyph(Font fnt, int chr, Color color, int angle)
|
|||
return AutoCrop(ib, RGBAZero());
|
||||
}
|
||||
|
||||
/*
|
||||
Image RenderGlyph(Point at, int angle, int chr, Font fnt, Color color, Size sz)
|
||||
{
|
||||
int cx = fnt[chr];
|
||||
|
|
@ -56,6 +27,7 @@ Image RenderGlyph(Point at, int angle, int chr, Font fnt, Color color, Size sz)
|
|||
s->a = (s->a & 0xf8);
|
||||
return ib;
|
||||
}
|
||||
*/
|
||||
|
||||
String CompressGlyph(const Image& m)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,10 +5,6 @@ uses
|
|||
file
|
||||
glyph.h,
|
||||
TestDraw.cpp,
|
||||
FDrawClip.cpp,
|
||||
FDrawPut.cpp,
|
||||
FDrawText.cpp,
|
||||
FDraw.cpp,
|
||||
Glyph.cpp,
|
||||
main.cpp optimize_speed,
|
||||
text.qtf,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
#include "glyph.h"
|
||||
|
||||
#define LTIMING(x) RTIMING(x)
|
||||
|
||||
void TestDraw::PutImage(Point p, const Image& m, const Rect& src)
|
||||
{
|
||||
draw->DrawImage(p.x, p.y, m, src);
|
||||
|
|
@ -9,3 +11,12 @@ void TestDraw::PutRect(const Rect& r, Color color)
|
|||
{
|
||||
draw->DrawRect(r, color);
|
||||
}
|
||||
|
||||
Image TestDraw::RenderGlyph(Point at, int angle, int chr, Font fnt, Color color, Size sz)
|
||||
{
|
||||
ImageBuffer ib(sz);
|
||||
BufferPainter sw(ib);
|
||||
sw.Clear(RGBAZero());
|
||||
sw.DrawText(at.x, at.y, angle, WString(chr, 1), fnt, color);
|
||||
return ib;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,63 +7,17 @@
|
|||
using namespace Upp;
|
||||
|
||||
|
||||
Image AutoCrop(const Image& m, RGBA c);
|
||||
Image RenderGlyph(Point at, int angle, int chr, Font fnt, Color color, Size sz);
|
||||
|
||||
String CompressGlyph(const Image& m);
|
||||
Image DecompressGlyph(const String& g, Color c);
|
||||
|
||||
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 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);
|
||||
virtual void DrawRectOp(int x, int y, int cx, int cy, Color color);
|
||||
|
||||
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 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 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 {
|
||||
struct TestDraw : SDraw {
|
||||
Draw *draw;
|
||||
|
||||
virtual void PutImage(Point p, const Image& m, const Rect& src);
|
||||
virtual void PutRect(const Rect& r, Color color);
|
||||
virtual void PutImage(Point p, const Image& m, const Rect& src);
|
||||
virtual void PutRect(const Rect& r, Color color);
|
||||
virtual Image RenderGlyph(Point at, int angle, int chr, Font fnt, Color color, Size sz);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -69,15 +69,15 @@ void MyApp::Paint(Draw& w)
|
|||
fw.draw = &w;
|
||||
fw.Init(sz);
|
||||
|
||||
fw.DrawText(100, 100, "Ahoj!", Roman(400));
|
||||
// fw.DrawText(100, 100, "Ahoj!", Roman(400));
|
||||
|
||||
|
||||
RichText txt = ParseQTF(LoadFile(GetDataFile("text.qtf")));
|
||||
if(0) {
|
||||
if(1) {
|
||||
RTIMING("SDraw");
|
||||
txt.Paint(Zoom(2, 10), fw, 0, 0, sz.cx);
|
||||
}
|
||||
if(0) {
|
||||
if(1) {
|
||||
RTIMING("Draw");
|
||||
txt.Paint(Zoom(2, 10), w, 0, 0, sz.cx);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue