git-svn-id: svn://ultimatepp.org/upp/trunk@6106 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2013-05-26 17:35:34 +00:00
parent f1d58a1a2f
commit 27351ba2cb
11 changed files with 329 additions and 88 deletions

View file

@ -1,7 +1,7 @@
LAYOUT(AccessKeyLayout, 200, 100)
ITEM(Base, ok, RightPosZ(90, 80).BottomPosZ(4, 22))
ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(4, 80).BottomPosZ(4, 22))
ITEM(Label, dv___2, SetLabel(t_("asdfasdf\aTest")).SetFont(SansSerifZ(20)).LeftPosZ(4, 48).TopPosZ(4, 32))
ITEM(Label, dv___2, SetLabel(t_("asdfasdf\aTest\\a\\n\\b\001asdfasdf")).SetFont(SansSerifZ(20)).LeftPosZ(0, 136).TopPosZ(32, 32))
ITEM(EditDate, dv___3, LeftPosZ(56, 140).TopPosZ(4, 19))
END_LAYOUT

View file

@ -286,3 +286,9 @@ GUI_APP_MAIN
RTIMING("Draw");
// ParseQTF(txt).Paint(Zoom(2, 10), w, 0, 0, sz.cx);
}
TIMING Painter : 2.11 s - 11.39 ms ( 2.11 s / 185 ), min: 7.00 ms, max: 16.00 ms, nesting: 1 - 185
TIMING Draw : 117.99 ms - 637.79 us (118.00 ms / 185 ), min: 0.00 ns, max: 7.00 ms, nesting: 1 - 185
TIMING Render glyph : 5.99 ms - 49.95 us ( 6.00 ms / 120 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 120
TIMING Paint glyph : 944.23 ms - 6.49 us (951.00 ms / 145410 ), min: 0.00 ns, max: 3.00 ms, nesting: 1 - 145410
TIMING SDraw : 1.10 s - 5.94 ms ( 1.10 s / 185 ), min: 4.00 ms, max: 18.00 ms, nesting: 1 - 185

View file

@ -81,6 +81,13 @@ void MyApp::Paint(Draw& w)
RTIMING("Draw");
txt.Paint(Zoom(2, 10), w, 0, 0, sz.cx);
}
if(1) {
RTIMING("Painter");
ImageBuffer ib(sz);
BufferPainter sw(ib);
sw.Clear(White());
txt.Paint(Zoom(2, 10), sw, 0, 0, sz.cx);
}
/*
fw.cloff.Add();
fw.cloff.Top().offset = Point(0, 0);

View file

@ -50,6 +50,7 @@ GUI_APP_MAIN
// w.ToolWindow();
w.SetRect(0, 0, 700, 500);
w.Sizeable().Zoomable();
e.SetReadOnly();
w.Add(e.SizePos());
w.Run();
/*

View file

@ -1,9 +1,6 @@
#include <Core/Core.h>
#include <Draw/Draw.h>
#include "SDL20.h"
using namespace Upp;
#include "SDL.h"
#include <RichText/RichText.h>
#define IMAGECLASS TestImg
#define IMAGEFILE <SDL20/test.iml>
@ -13,92 +10,48 @@ using namespace Upp;
#define IMAGEFILE <SDL20/test.iml>
#include <Draw/iml_source.h>
SDL_Texture *TextureFromImage(SDL_Renderer *renderer, const Image& m)
{
Size isz = m.GetSize();
void *pixels;
int pitch;
SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING, isz.cx, isz.cy);
if(SDL_LockTexture(texture, NULL, &pixels, &pitch) >= 0) {
const RGBA *s = ~m;
for(int y = 0; y < isz.cy; y++) {
Copy((RGBA *)((Uint8*)pixels + y * pitch), s, isz.cx);
s += isz.cx;
}
SDL_UnlockTexture(texture);
SDL_SetTextureColorMod(texture, 200, 100, 50);
return texture;
}
SDL_DestroyTexture(texture);
return NULL;
}
void DrawImage(SDL_Renderer *renderer, int x, int y, const Image& m)
{
Size isz = m.GetSize();
SDL_Texture *tex = TextureFromImage(renderer, m);
SDL_Rect t;
t.x = x;
t.y = y;
t.w = isz.cx;
t.h = isz.cy;
SDL_RenderCopy(renderer, tex, NULL, &t);
SDL_DestroyTexture(tex);
}
Image DownSample3x(const Image& src)
{
Size tsz = src.GetSize() / 3;
ImageBuffer ib(tsz);
int w = src.GetSize().cx;
int w2 = 2 * w;
for(int y = 0; y < tsz.cy; y++) {
RGBA *t = ib[y];
RGBA *e = t + tsz.cx;
const RGBA *s = src[3 * y];
while(t < e) {
int r, g, b, a;
const RGBA *q;
r = g = b = a = 0;
#define S__SUM(delta) q = s + delta; r += q->r; g += q->g; b += q->b; a += q->a;
S__SUM(0) S__SUM(1) S__SUM(2)
S__SUM(w + 0) S__SUM(w + 1) S__SUM(w + 2)
S__SUM(w2 + 0) S__SUM(w2 + 1) S__SUM(w2 + 2)
#undef S__SUM
t->a = a / 9;
t->r = r / 9;
t->g = g / 9;
t->b = b / 9;
t++;
s += 3;
}
}
return ib;
}
int main(int argc, char** argv){
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 1600, 900, SDL_WINDOW_SHOWN);
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDLWindow win;
win.Create(RectC(100, 100, 1024, 768), "First test");
bool quit = false;
int i = 0;
for(;;) {
SDL_RenderClear(ren);
DrawImage(ren, 300, 600, DownSample3x(UPP::Rotate(Magnify(TestImg::pinkie(), 3, 3), 500 * i)));
DrawImage(ren, 100, 800, DownSample3x(UPP::Rotate(Magnify(TestImg::pinkie(), 3, 3), 140 * i)));
DrawImage(ren, 800, 600, DownSample3x(UPP::Rotate(Magnify(TestImg::pinkie(), 3, 3), 70 * i)));
DrawImage(ren, 40, 60, DownSample3x(UPP::Rotate(Magnify(TestImg::pinkie(), 3, 3), 60 * i)));
i++;
SDL_RenderPresent(ren);
while(!quit) {
SDLDraw w;
w.Set(win);
Size sz = Size(1024, 768);
w.Init(sz);
w.DrawRect(sz, White);
// w.DrawText(10, 10, "Hello world!", Arial(40));
// w.DrawImage(300, 300, TestImg::pinkie());
RichText txt = ParseQTF(LoadFile(GetDataFile("text.qtf")));
if(1) {
RTIMING("SDLDraw");
txt.Paint(Zoom(2, 10), w, 0, 0, sz.cx);
}
win.Present();
SDL_Event e;
while (SDL_PollEvent(&e)){
//If user closes he window
if (e.type == SDL_QUIT)
quit = true;
//If user presses any key
if (e.type == SDL_KEYDOWN)
quit = true;
//If user clicks the mouse
if (e.type == SDL_MOUSEBUTTONDOWN)
quit = true;
}
SDL_Delay(20);
}
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}

39
uppdev/SDL20/SDL20.h Normal file
View file

@ -0,0 +1,39 @@
#ifndef _SDL20_SDL20_h_
#define _SDL20_SDL20_h_
#include <Painter/Painter.h>
#include <SDL2/SDL.h>
using namespace Upp;
struct SDLWindow {
SDL_Window *win;
SDL_Renderer *ren;
int64 serial;
bool Create(const Rect& rect, const char *title);
void Destroy();
void Present();
operator bool() const { return win; }
SDLWindow();
~SDLWindow();
};
struct SDLDraw : SDraw {
SDLWindow *win;
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);
void Set(SDLWindow& win_);
SDLDraw();
~SDLDraw();
};
#endif

View file

@ -1,11 +1,18 @@
uses
Core,
Draw;
Draw,
Painter,
RichText;
library
"SDLmain.lib SDL.lib";
library(WIN32) "SDLmain.lib SDL.lib";
library(POSIX) "SDL2 SDL2main";
file
SDL20.h,
Window.cpp,
SDLDraw.cpp,
text.qtf,
SDL20.cpp,
test.iml;

111
uppdev/SDL20/SDLDraw.cpp Normal file
View file

@ -0,0 +1,111 @@
#include "SDL20.h"
#define LLOG(x) // DLOG(x)
struct RectSDL {
SDL_Rect sr;
operator SDL_Rect *() { return &sr; }
RectSDL(const Rect& r)
{
sr.x = r.left;
sr.y = r.top;
sr.w = r.GetWidth();
sr.h = r.GetHeight();
}
};
SDL_Texture *TextureFromImage(SDL_Renderer *renderer, const Image& m)
{
Size isz = m.GetSize();
void *pixels;
int pitch;
SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STATIC, isz.cx, isz.cy);
if(texture) {
SDL_UpdateTexture(texture, RectSDL(isz), ~m, isz.cx * sizeof(RGBA));
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
}
return texture;
}
struct ImageSysData {
Image img;
SDL_Texture *texture;
void Init(SDL_Renderer *renderer, const Image& img);
~ImageSysData();
};
void ImageSysData::Init(SDL_Renderer *renderer, const Image& m)
{
img = m;
texture = TextureFromImage(renderer, img);
SysImageRealized(img);
}
ImageSysData::~ImageSysData()
{
SysImageReleased(img);
SDL_DestroyTexture(texture);
}
struct ImageSysDataMaker : LRUCache<ImageSysData, int64>::Maker {
Image img;
int wserial;
SDL_Renderer *renderer;
virtual int64 Key() const { return img.GetSerialId(); } // TODO! add ren_serial
virtual int Make(ImageSysData& object) const { object.Init(renderer, img); return img.GetLength(); }
};
void SDLDraw::PutImage(Point p, const Image& img, const Rect& src)
{
if(img.GetLength() == 0 || !win)
return;
LLOG("SysDrawImageOp " << img.GetSerialId() << ' ' << p.x << ", " << p.y << ", "<< img.GetSize());
ImageSysDataMaker m;
static LRUCache<ImageSysData, int64> cache;
LLOG("SysImage cache pixels " << cache.GetSize() << ", count " << cache.GetCount());
m.img = img;
m.renderer = win->ren;
m.wserial = win->serial;
ImageSysData& sd = cache.Get(m);
{
RTIMING("SDL_RenderCopy");
SDL_RenderCopy(win->ren, sd.texture, RectSDL(src), RectSDL(Rect(p, src.GetSize())));
}
cache.Shrink(4 * 1024 * 768, 1000); // Cache shrink must be after Paint because of PaintOnly!
}
void SDLDraw::PutRect(const Rect& r, Color color)
{
if(win && !IsNull(color)) {
SDL_SetRenderDrawColor(win->ren, color.GetR(), color.GetG(), color.GetB(), 255); // Optimize?
SDL_RenderFillRect(win->ren, RectSDL(r));
}
}
Image SDLDraw::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;
}
void SDLDraw::Set(SDLWindow& win_)
{
win = win_.ren ? &win_ : NULL;
}
SDLDraw::SDLDraw()
{
win = NULL;
}
SDLDraw::~SDLDraw()
{
}

50
uppdev/SDL20/Window.cpp Normal file
View file

@ -0,0 +1,50 @@
#include "SDL20.h"
bool SDLWindow::Create(const Rect& rect, const char *title)
{
win = SDL_CreateWindow(title, rect.left, rect.top, rect.GetWidth(), rect.GetHeight(),
SDL_WINDOW_SHOWN);
if(!win)
return false;
MemoryIgnoreLeaksBegin();
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
MemoryIgnoreLeaksEnd();
if(!ren) {
Destroy();
return false;
}
INTERLOCKED {
static int64 h;
serial = h++;
}
return true;
}
void SDLWindow::Destroy()
{
if(ren) {
SDL_DestroyRenderer(ren);
ren = NULL;
}
if(win) {
SDL_DestroyWindow(win);
win = NULL;
}
}
void SDLWindow::Present()
{
if(ren)
SDL_RenderPresent(ren);
}
SDLWindow::SDLWindow()
{
ren = NULL;
win = NULL;
}
SDLWindow::~SDLWindow()
{
Destroy();
}

View file

@ -2,4 +2,6 @@
#define _SDL20_icpp_init_stub
#include "Core/init"
#include "Draw/init"
#include "Painter/init"
#include "RichText/init"
#endif

65
uppdev/SDL20/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; &]