diff --git a/uppdev/AggCtrl/AggCtrl.h b/uppdev/AggCtrl/AggCtrl.h new file mode 100644 index 000000000..b8e47f871 --- /dev/null +++ b/uppdev/AggCtrl/AggCtrl.h @@ -0,0 +1,65 @@ +#ifndef _AggCtrl_AggCtrl_h_ +#define _AggCtrl_AggCtrl_h_ + +/* +This package implements Ctrl which allows user to use Agg software rendering engine in Upp +Autor: Jan Dolinár +Usage: Just define onDraw method in your source and put in there the drawing stuff + The Ctrl has pre-initialized rendering_buffer rbuf which is rendered in Paint(...) function + You also can connect it to higher level Agg classes, or even draw other buffer + with PaintAgg(...) +Bugs: Currently only X11 is supported + Doesn't work properly when used pixelformat has different bpp then system (on my system + only 32bit pixel formats work...) +*/ + +#include +//#include +#include +#include +#include +#include "PixFmts.h" + +#ifdef PLATFORM_X11 +#include +#elif defined(PLATFORM_WIN32) +#include +#include +#include +#include +#endif + +class AggCtrl:public Upp::Ctrl{ +public: + typedef AggCtrl CLASSNAME; + AggCtrl(agg::pix_format_e format=agg::pix_format_bgra32); + ~AggCtrl(); + virtual void Paint(Upp::Draw& draw); + virtual void onDraw(Upp::Draw& dest); + virtual void onInit(); + virtual void onResize(int width,int height); + void PaintAgg(Upp::Draw& dest); + void PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest); + void Resized(); + void SetPixFmt(agg::pix_format_e format); + agg::rendering_buffer rbuf; + bool flip_y; +private: + unsigned bpp,sysbpp; + agg::pix_format_e pixformat,sysformat; + int cx,cy; +#ifdef PLATFORM_X11 +public: + unsigned char* buf; +private: + XImage* ximg; + int byte_order; + unsigned long r_mask,g_mask,b_mask; +#elif defined(PLATFORM_WIN32) + void CreatePmap(unsigned width,unsigned height,agg::rendering_buffer* wnd); + agg::pixel_map pmap; +#endif +}; + + +#endif diff --git a/uppdev/AggCtrl/AggCtrl.upp b/uppdev/AggCtrl/AggCtrl.upp new file mode 100644 index 000000000..d19997015 --- /dev/null +++ b/uppdev/AggCtrl/AggCtrl.upp @@ -0,0 +1,31 @@ +uses + CtrlLib, + agg24; + +library((LINUX | FREEBSD) & !NOGTK) "gtk-x11-2.0 gdk-x11-2.0 atk-1.0 gdk_pixbuf-2.0 m pangocairo-1.0 fontconfig Xext Xrender Xinerama Xi Xrandr Xcursor Xfixes pango-1.0 cairo X11 gobject-2.0 gmodule-2.0 glib-2.0"; + +library(WIN32 !MSC8ARM) "user32 gdi32"; + +library(LINUX) X11; + +library(LINUX) dl; + +library(LINUX !XLFD) Xft; + +library(FREEBSD) X11; + +library(FREEBSD !XLFD) "Xft fontconfig Xrender freetype expat"; + +library(LINUX !XLFD !SHARED) "fontconfig Xrender freetype expat"; + +library(OSX11) "X11 Xft fontconfig Xrender freetype expat"; + +file + PixFmts.h, + AggCtrl.h, + AggCtrlWin32.cpp, + AggCtrlX11.cpp; + +mainconfig + "" = "GUI"; + diff --git a/uppdev/AggCtrl/AggCtrlWin32.cpp b/uppdev/AggCtrl/AggCtrlWin32.cpp new file mode 100644 index 000000000..bb1079691 --- /dev/null +++ b/uppdev/AggCtrl/AggCtrlWin32.cpp @@ -0,0 +1,205 @@ +#include "AggCtrl.h" + +#ifdef PLATFORM_WIN32 + +static void ConvertPmap(agg::rendering_buffer* dst,const agg::rendering_buffer* src,agg::pix_format_e format){ + switch(format){ + case agg::pix_format_gray8: break; + case agg::pix_format_gray16: agg::color_conv(dst, src, agg::color_conv_gray16_to_gray8()); break; + case agg::pix_format_rgb565: agg::color_conv(dst, src, agg::color_conv_rgb565_to_rgb555());break; + case agg::pix_format_rgbAAA: agg::color_conv(dst, src, agg::color_conv_rgbAAA_to_bgr24()); break; + case agg::pix_format_bgrAAA: agg::color_conv(dst, src, agg::color_conv_bgrAAA_to_bgr24()); break; + case agg::pix_format_rgbBBA: agg::color_conv(dst, src, agg::color_conv_rgbBBA_to_bgr24()); break; + case agg::pix_format_bgrABB: agg::color_conv(dst, src, agg::color_conv_bgrABB_to_bgr24()); break; + case agg::pix_format_rgb24: agg::color_conv(dst, src, agg::color_conv_rgb24_to_bgr24()); break; + case agg::pix_format_rgb48: agg::color_conv(dst, src, agg::color_conv_rgb48_to_bgr24()); break; + case agg::pix_format_bgr48: agg::color_conv(dst, src, agg::color_conv_bgr48_to_bgr24()); break; + case agg::pix_format_abgr32: agg::color_conv(dst, src, agg::color_conv_abgr32_to_bgra32());break; + case agg::pix_format_argb32: agg::color_conv(dst, src, agg::color_conv_argb32_to_bgra32());break; + case agg::pix_format_rgba32: agg::color_conv(dst, src, agg::color_conv_rgba32_to_bgra32());break; + case agg::pix_format_bgra64: agg::color_conv(dst, src, agg::color_conv_bgra64_to_bgra32());break; + case agg::pix_format_abgr64: agg::color_conv(dst, src, agg::color_conv_abgr64_to_bgra32());break; + case agg::pix_format_argb64: agg::color_conv(dst, src, agg::color_conv_argb64_to_bgra32());break; + case agg::pix_format_rgba64: agg::color_conv(dst, src, agg::color_conv_rgba64_to_bgra32());break; + } +}; + +AggCtrl::AggCtrl(agg::pix_format_e format): +pixformat(format), bpp(0), +sysformat(agg::pix_format_undefined), +flip_y(false), +cx(16),cy(16) +{ + // Set bpp and sysbpp from pixel format + switch(pixformat) + { + case agg::pix_format_bw: + sysformat = agg::pix_format_bw; + bpp = 1; + sysbpp = 1; + break; + case agg::pix_format_gray8: + sysformat = agg::pix_format_gray8; + bpp = 8; + sysbpp = 8; + break; + case agg::pix_format_gray16: + sysformat = agg::pix_format_gray8; + bpp = 16; + sysbpp = 8; + break; + case agg::pix_format_rgb565: + case agg::pix_format_rgb555: + sysformat = agg::pix_format_rgb555; + bpp = 16; + sysbpp = 16; + break; + case agg::pix_format_rgbAAA: + case agg::pix_format_bgrAAA: + case agg::pix_format_rgbBBA: + case agg::pix_format_bgrABB: + sysformat = agg::pix_format_bgr24; + bpp = 32; + sysbpp = 24; + break; + case agg::pix_format_rgb24: + case agg::pix_format_bgr24: + sysformat = agg::pix_format_bgr24; + bpp = 24; + sysbpp = 24; + break; + case agg::pix_format_rgb48: + case agg::pix_format_bgr48: + sysformat = agg::pix_format_bgr24; + bpp = 48; + sysbpp = 24; + break; + case agg::pix_format_bgra32: + case agg::pix_format_abgr32: + case agg::pix_format_argb32: + case agg::pix_format_rgba32: + sysformat = agg::pix_format_bgra32; + bpp = 32; + sysbpp = 32; + break; + case agg::pix_format_bgra64: + case agg::pix_format_abgr64: + case agg::pix_format_argb64: + case agg::pix_format_rgba64: + sysformat = agg::pix_format_bgra32; + bpp = 64; + sysbpp = 32; + break; + } + CreatePmap(cx,cy,&rbuf); + // User initialization code + onInit(); +}; +void AggCtrl::CreatePmap(unsigned width,unsigned height,agg::rendering_buffer* rb){ + // Create a pixmap and attach a buffer to it + pmap.create(width,height,agg::org_e(bpp)); + rb->attach(pmap.buf(),pmap.width(),pmap.height(),flip_y ?pmap.stride():-pmap.stride()); +}; +void AggCtrl::PaintAgg(Upp::Draw& dest){PaintAgg(&rbuf,dest);}; +void AggCtrl::PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest){ + if(sysformat==pixformat){ + // Pixmap is in the right format, put it on display + pmap.draw(dest.GetHandle()); + }else{ + // Pixmap must be converted to the right pixel format first + agg::pixel_map pmap_tmp; + pmap_tmp.create(pmap.width(),pmap.height(),agg::org_e(sysbpp)); + agg::rendering_buffer rbuf_tmp; + rbuf_tmp.attach(pmap_tmp.buf(),pmap_tmp.width(),pmap_tmp.height(),flip_y?pmap_tmp.stride():-pmap_tmp.stride()); + ConvertPmap(&rbuf_tmp, src, pixformat); + pmap_tmp.draw(dest.GetHandle()); + } +}; +void AggCtrl::Resized(){ + // Update the dimensions and reinitialize the pixmap with new size + cx=GetSize().cx;cy=GetSize().cy; + CreatePmap(cx,cy,&rbuf); + // User resize code + onResize(cx,cy); +}; +AggCtrl::~AggCtrl() { + pmap.destroy(); +}; +void AggCtrl::Paint(Upp::Draw& draw) { + // Check if the control was resized + if(cx!=GetSize().cx||cy!=GetSize().cy){Resized();} + // User Drawing code + onDraw(draw); + // Draw to screen + PaintAgg(draw); +}; +void AggCtrl::SetPixFmt(agg::pix_format_e format){ + pixformat=format; + switch(pixformat) + { + case agg::pix_format_bw: + sysformat = agg::pix_format_bw; + bpp = 1; + sysbpp = 1; + break; + case agg::pix_format_gray8: + sysformat = agg::pix_format_gray8; + bpp = 8; + sysbpp = 8; + break; + case agg::pix_format_gray16: + sysformat = agg::pix_format_gray8; + bpp = 16; + sysbpp = 8; + break; + case agg::pix_format_rgb565: + case agg::pix_format_rgb555: + sysformat = agg::pix_format_rgb555; + bpp = 16; + sysbpp = 16; + break; + case agg::pix_format_rgbAAA: + case agg::pix_format_bgrAAA: + case agg::pix_format_rgbBBA: + case agg::pix_format_bgrABB: + sysformat = agg::pix_format_bgr24; + bpp = 32; + sysbpp = 24; + break; + case agg::pix_format_rgb24: + case agg::pix_format_bgr24: + sysformat = agg::pix_format_bgr24; + bpp = 24; + sysbpp = 24; + break; + case agg::pix_format_rgb48: + case agg::pix_format_bgr48: + sysformat = agg::pix_format_bgr24; + bpp = 48; + sysbpp = 24; + break; + case agg::pix_format_bgra32: + case agg::pix_format_abgr32: + case agg::pix_format_argb32: + case agg::pix_format_rgba32: + sysformat = agg::pix_format_bgra32; + bpp = 32; + sysbpp = 32; + break; + case agg::pix_format_bgra64: + case agg::pix_format_abgr64: + case agg::pix_format_argb64: + case agg::pix_format_rgba64: + sysformat = agg::pix_format_bgra32; + bpp = 64; + sysbpp = 32; + break; + } + Resized(); +}; + +void AggCtrl::onDraw(Upp::Draw& dest){}; +void AggCtrl::onInit(){}; +void AggCtrl::onResize(int width,int height){}; + +#endif diff --git a/uppdev/AggCtrl/AggCtrlX11.cpp b/uppdev/AggCtrl/AggCtrlX11.cpp new file mode 100644 index 000000000..c30843ba0 --- /dev/null +++ b/uppdev/AggCtrl/AggCtrlX11.cpp @@ -0,0 +1,258 @@ +#include "AggCtrl.h" + +#ifdef PLATFORM_X11 +AggCtrl::AggCtrl(agg::pix_format_e format): +pixformat(format), bpp(0), +sysformat(agg::pix_format_undefined), +byte_order(LSBFirst), +flip_y(false), +cx(16),cy(16), +r_mask(Upp::Xvisual->red_mask), g_mask(Upp::Xvisual->green_mask), b_mask(Upp::Xvisual->blue_mask) +{ + ASSERT_(!(Upp::Xdepth<15||r_mask==0||g_mask==0||b_mask==0),"AGG requires at least 15-bit color depth and True- or DirectColor class."); + // Determine bpp from pixel format + switch(pixformat){ + default: break; + case agg::pix_format_gray8: + bpp = 8; break; + case agg::pix_format_rgb565: + case agg::pix_format_rgb555: + bpp = 16; break; + case agg::pix_format_rgb24: + case agg::pix_format_bgr24: + bpp = 24; break; + case agg::pix_format_bgra32: + case agg::pix_format_abgr32: + case agg::pix_format_argb32: + case agg::pix_format_rgba32: + bpp = 32; break; + } + + // Pre-determine the byte order + int t = 1; + int hw_byte_order = LSBFirst; + if (*(char*)&t == 0) hw_byte_order = MSBFirst; + + // Perceive system pixel format by mask + switch (Upp::Xdepth) { + case 15: + sysbpp=16; + if (r_mask == 0x7C00 && g_mask == 0x3E0 && b_mask == 0x1F) { + sysformat = agg::pix_format_rgb555; + byte_order = hw_byte_order; + } + break; + case 16: + sysbpp=16; + if (r_mask==0xF800&&g_mask==0x7E0&&b_mask==0x1F) { + sysformat = agg::pix_format_rgb565; + byte_order = hw_byte_order; + } + break; + case 24: + case 32: + sysbpp=32; + if (g_mask==0xFF00){ + if (r_mask==0xFF&&b_mask==0xFF0000) { + switch(pixformat) { + case agg::pix_format_rgba32: + sysformat = agg::pix_format_rgba32; + byte_order = LSBFirst; + break; + case agg::pix_format_abgr32: + sysformat = agg::pix_format_abgr32; + byte_order = MSBFirst; + break; + default: + byte_order = hw_byte_order; + sysformat = (hw_byte_order==LSBFirst)?agg::pix_format_rgba32:agg::pix_format_abgr32; + break; + } + } + if (r_mask == 0xFF0000 && b_mask == 0xFF) { + switch (pixformat) { + case agg::pix_format_argb32: + sysformat = agg::pix_format_argb32; + byte_order = MSBFirst; + break; + case agg::pix_format_bgra32: + sysformat = agg::pix_format_bgra32; + byte_order = LSBFirst; + break; + default: + byte_order = hw_byte_order; + sysformat = (hw_byte_order == MSBFirst)?agg::pix_format_argb32:agg::pix_format_bgra32; + break; + } + } + } + break; + } + + ASSERT_(sysformat!=agg::pix_format_undefined,"RGB masks are not compatible with AGG pixel formats"); + + // Allocate buffer + buf=new unsigned char[cx*cy*(bpp/8)]; + // Connect rendering buffer + rbuf.attach(buf,cx,cy,(flip_y?-1:1)*cx*(bpp/8)); + // Initialize XImage for sending the data to the X server + ximg=XCreateImage(Upp::Xdisplay,Upp::Xvisual,Upp::Xdepth,ZPixmap,0,(char*)buf,cx,cy,sysbpp,cx*(sysbpp/8)); + ximg->byte_order = byte_order; + // User initialization + onInit(); +}; + +void AggCtrl::PaintAgg(Upp::Draw& dest){PaintAgg(&rbuf,dest);}; +void AggCtrl::PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest){ + if(ximg==0) return; + ximg->data=(char*)(flip_y?(src->row_ptr(src->height())-1):src->row_ptr(0)); + if(pixformat==sysformat){ + XPutImage(Upp::Xdisplay,dest.GetDrawable(),dest.GetGC(),ximg,0,0,GetRect().left,GetRect().top,cx,cy); + XFlush(Upp::Xdisplay); + XSync(Upp::Xdisplay,false); + }else{ + // Conversion to pixel format compatible with current system + int row_len = cx*sysbpp/8; + unsigned char* buf_tmp = new unsigned char[row_len*cy]; + agg::rendering_buffer rbuf_tmp; + rbuf_tmp.attach(buf_tmp,cx,cy,flip_y?-row_len:row_len); + switch (sysformat){ + default: break; + case agg::pix_format_rgb555: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb555());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb555());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb555());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb555());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb555());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb555());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb555());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb555());break; + } + break; + case agg::pix_format_rgb565: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb565());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb565());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb565());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb565());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb565());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb565());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb565());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb565());break; + } + break; + case agg::pix_format_rgba32: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgba32());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgba32());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgba32());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgba32());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgba32());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgba32());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgba32());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgba32());break; + } + break; + case agg::pix_format_abgr32: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_abgr32());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_abgr32());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_abgr32());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_abgr32());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_abgr32());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_abgr32());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_abgr32());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_abgr32());break; + } + break; + case agg::pix_format_argb32: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_argb32());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_argb32());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_argb32());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_argb32());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_argb32());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_argb32());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_argb32());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_argb32());break; + } + break; + case agg::pix_format_bgra32: + switch (pixformat) { + default: break; + case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_bgra32());break; + case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_bgra32());break; + case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_bgra32());break; + case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_bgra32());break; + case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_bgra32());break; + case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_bgra32());break; + case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_bgra32());break; + case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_bgra32());break; + } + break; + } + ximg->data=(char*)buf_tmp; + XPutImage(Upp::Xdisplay,dest.GetDrawable(),dest.GetGC(),ximg,0,0,GetRect().left,GetRect().top,cx,cy); + XFlush(Upp::Xdisplay); + XSync(Upp::Xdisplay,false); + delete [] buf_tmp; + } +}; +void AggCtrl::Resized(){ + // Update the dimensions, reallocate the buffer with new size, get a bigger XImage + cx=GetSize().cx;cy=GetSize().cy; + delete [] buf; + ximg->data = 0; + XDestroyImage(ximg); + buf=new unsigned char[cx*cy*(bpp/8)]; + rbuf.attach(buf,cx,cy,(flip_y?-1:1)*cx*(bpp/8)); + ximg=XCreateImage(Upp::Xdisplay,Upp::Xvisual,Upp::Xdepth,ZPixmap,0,(char*)buf,cx,cy,sysbpp,cx*(sysbpp/8)); + ximg->byte_order=byte_order; + // User resize code + onResize(cx,cy); +}; +AggCtrl::~AggCtrl() { + delete [] buf; + ximg->data = 0; + XDestroyImage(ximg); +}; +void AggCtrl::Paint(Upp::Draw& draw) { + // Check if the control was resized + if(cx!=GetSize().cx||cy!=GetSize().cy){Resized();} + // User Drawing code + onDraw(draw); + // Draw to screen + PaintAgg(draw); +}; +void AggCtrl::SetPixFmt(agg::pix_format_e format){ + pixformat=format; + switch(format){ + default: break; + case agg::pix_format_gray8: + bpp = 8; break; + case agg::pix_format_rgb565: + case agg::pix_format_rgb555: + bpp = 16; break; + case agg::pix_format_rgb24: + case agg::pix_format_bgr24: + bpp = 24; break; + case agg::pix_format_bgra32: + case agg::pix_format_abgr32: + case agg::pix_format_argb32: + case agg::pix_format_rgba32: + bpp = 32; break; + } + Resized(); +}; + +void AggCtrl::onDraw(Upp::Draw& dest){}; +void AggCtrl::onInit(){}; +void AggCtrl::onResize(int width,int height){}; + +#endif diff --git a/uppdev/AggCtrl/PixFmts.h b/uppdev/AggCtrl/PixFmts.h new file mode 100644 index 000000000..4f6482148 --- /dev/null +++ b/uppdev/AggCtrl/PixFmts.h @@ -0,0 +1,37 @@ +#ifndef _AggCtrl_PixFmts_h_ +#define _AggCtrl_PixFmts_h_ + +// Using a particular pixel format doesn't obligatory mean the necessity +// of software conversion. For example, win32 API can natively display +// gray8, 15-bit RGB, 24-bit BGR, and 32-bit BGRA formats. +// This list can be (and will be!) extended in future. +namespace agg{ + enum pix_format_e{ + pix_format_undefined = 0, // By default. No conversions are applied + pix_format_bw, // 1 bit per color B/W + pix_format_gray8, // Simple 256 level grayscale + pix_format_gray16, // Simple 65535 level grayscale + pix_format_rgb555, // 15 bit rgb. Depends on the byte ordering! + pix_format_rgb565, // 16 bit rgb. Depends on the byte ordering! + pix_format_rgbAAA, // 30 bit rgb. Depends on the byte ordering! + pix_format_rgbBBA, // 32 bit rgb. Depends on the byte ordering! + pix_format_bgrAAA, // 30 bit bgr. Depends on the byte ordering! + pix_format_bgrABB, // 32 bit bgr. Depends on the byte ordering! + pix_format_rgb24, // R-G-B, one byte per color component + pix_format_bgr24, // B-G-R, native win32 BMP format. + pix_format_rgba32, // R-G-B-A, one byte per color component + pix_format_argb32, // A-R-G-B, native MAC format + pix_format_abgr32, // A-B-G-R, one byte per color component + pix_format_bgra32, // B-G-R-A, native win32 BMP format + pix_format_rgb48, // R-G-B, 16 bits per color component + pix_format_bgr48, // B-G-R, native win32 BMP format. + pix_format_rgba64, // R-G-B-A, 16 bits byte per color component + pix_format_argb64, // A-R-G-B, native MAC format + pix_format_abgr64, // A-B-G-R, one byte per color component + pix_format_bgra64, // B-G-R-A, native win32 BMP format + + end_of_pix_formats + }; +}; + +#endif diff --git a/uppdev/AggCtrl/init b/uppdev/AggCtrl/init new file mode 100644 index 000000000..06de2b1a2 --- /dev/null +++ b/uppdev/AggCtrl/init @@ -0,0 +1,5 @@ +#ifndef _AggCtrl_icpp_init_stub +#define _AggCtrl_icpp_init_stub +#include "CtrlLib/init" +#include "agg24/init" +#endif diff --git a/uppdev/DropChoice/DropChoice.upp b/uppdev/DropChoice/DropChoice.upp new file mode 100644 index 000000000..5872304d3 --- /dev/null +++ b/uppdev/DropChoice/DropChoice.upp @@ -0,0 +1,9 @@ +uses + CtrlLib; + +file + main.cpp; + +mainconfig + "" = "GUI"; + diff --git a/uppdev/DropChoice/main.cpp b/uppdev/DropChoice/main.cpp new file mode 100644 index 000000000..ce2baf8c5 --- /dev/null +++ b/uppdev/DropChoice/main.cpp @@ -0,0 +1,15 @@ +#include + +using namespace Upp; + +GUI_APP_MAIN +{ + TopWindow win; + WithDropChoice edit; + + win.Add(edit.TopPos(0, 20).LeftPos(0, 100)); + edit.AddList("Ahoj!"); + edit.DropWidth(500); + + win.Run(); +} diff --git a/uppdev/DropListBug/main.cpp b/uppdev/DropListBug/main.cpp index 52013379d..a7f0fd7f3 100644 --- a/uppdev/DropListBug/main.cpp +++ b/uppdev/DropListBug/main.cpp @@ -19,6 +19,11 @@ public: CtrlLayout(*this, "Window title"); addButton <<= THISBACK(AddButtonClicked); removeButton <<= THISBACK(RemoveButtonClicked); + dropList.Add("A"); + dropList.Add("B"); + dropList.Add("C"); + dropList.Add("D"); + dropList.Add("E"); } void AddButtonClicked() @@ -38,5 +43,11 @@ public: GUI_APP_MAIN { - DropListBug().Run(); + DropListBug bug; + bug.Open(); + bool quit = false; + while(!quit) { + Sleep(1000); + Ctrl::ProcessEvents(&quit); + } } diff --git a/uppdev/Iml2/test.iml b/uppdev/Iml2/test.iml index 2e237fee5..20d476e57 100644 --- a/uppdev/Iml2/test.iml +++ b/uppdev/Iml2/test.iml @@ -1,6 +1,6 @@ PREMULTIPLIED -IMAGE_ID(LoginListTop0) IMAGE_ID(Princess) +IMAGE_ID(LoginListTop0) IMAGE_ID(Test) IMAGE_ID(asdf) IMAGE_ID(df) @@ -10,45 +10,45 @@ IMAGE_ID(test) IMAGE_ID(LoginListTop0) IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,89,191,111,35,69,20,158,179,125,23,59,201,229,2,167,56,228,88,39,24,132,65,230,8,34,66,33,5,74) -IMAGE_DATA(144,32,228,68,145,230,110,131,160,160,32,87,36,20,8,211,165,32,87,160,32,81,36,225,138,28,5,34,64,137,255,1) -IMAGE_DATA(104,105,92,211,240,15,164,65,226,159,88,230,179,118,156,185,245,252,218,245,204,110,140,230,59,125,218,120,246,121,190,247) -IMAGE_DATA(222,188,121,179,235,35,43,100,133,120,120,120,120,120,120,120,20,142,168,104,7,82,34,202,200,162,112,141,99,73,224,215) -IMAGE_DATA(85,143,135,249,94,166,188,110,209,255,92,226,169,213,106,147,173,86,235,149,141,141,141,119,55,55,55,239,81,126,232,48) -IMAGE_DATA(6,103,177,52,26,141,197,189,189,189,253,147,147,147,211,179,179,179,39,57,196,224,36,150,197,197,197,165,253,253,253,207) -IMAGE_DATA(79,79,79,191,207,49,6,235,177,76,78,78,78,181,219,237,187,142,116,243,94,23,215,90,121,196,146,87,190,138,204,149) -IMAGE_DATA(109,184,210,202,181,55,58,212,204,59,6,87,186,62,142,209,96,83,183,136,189,161,211,190,42,243,21,165,235,227,24,13) -IMAGE_DATA(121,197,49,110,231,135,203,121,115,211,42,151,203,21,205,220,54,99,113,166,51,63,63,255,220,225,225,225,35,151,26,49) -IMAGE_DATA(156,206,191,186,186,250,246,99,138,243,243,243,159,13,180,178,232,185,152,115,8,59,59,59,31,253,68,65,223,5,31,175) -IMAGE_DATA(175,175,231,241,94,238,164,102,119,119,119,31,254,66,113,112,112,240,117,179,217,124,147,14,45,141,91,12,192,214,214,214) -IMAGE_DATA(189,163,163,163,111,183,183,183,239,79,79,79,55,232,80,64,249,226,56,197,0,204,205,205,213,151,151,151,223,160,215,231) -IMAGE_DATA(75,165,210,44,29,170,83,222,161,92,24,151,24,56,224,183,55,244,223,26,229,12,229,51,148,183,40,167,40,111,140,129) -IMAGE_DATA(255,124,28,248,253,19,191,33,78,80,86,99,34,134,114,124,159,92,97,255,121,176,88,224,119,37,190,150,200,101,12,30) -IMAGE_DATA(30,30,30,30,30,30,30,102,120,129,254,243,72,133,53,202,48,190,138,16,196,247,67,235,194,1,57,190,248,146,68,209) -IMAGE_DATA(35,18,117,214,72,79,40,62,67,58,184,207,217,4,22,164,3,204,197,230,5,123,159,145,8,90,73,23,143,63,32,23) -IMAGE_DATA(188,93,247,1,185,160,118,153,115,129,239,98,14,54,31,157,63,74,204,63,32,203,13,27,103,159,113,69,238,50,104,119) -IMAGE_DATA(248,57,194,54,233,210,225,144,215,151,17,182,240,29,121,226,199,136,217,122,4,176,77,228,122,144,67,196,166,211,39,151) -IMAGE_DATA(245,23,240,107,130,92,18,121,237,246,193,219,227,239,164,207,41,245,251,64,60,124,46,85,62,176,188,197,249,26,66,22) -IMAGE_DATA(125,147,121,147,230,178,27,252,218,136,8,255,178,204,107,138,17,245,71,6,246,18,191,239,58,157,126,175,185,252,188,214) -IMAGE_DATA(175,25,151,8,131,246,147,8,124,54,120,24,69,17,137,62,221,93,137,216,88,109,102,197,100,125,51,131,143,31,253,168) -IMAGE_DATA(139,125,242,32,183,248,3,190,167,200,40,232,205,86,128,216,77,250,95,220,55,172,35,121,190,200,168,235,49,25,97,212) -IMAGE_DATA(251,19,253,222,26,146,103,240,128,191,83,254,54,60,142,58,33,118,206,127,96,141,63,95,159,210,62,150,231,32,203,185) -IMAGE_DATA(43,20,23,213,157,32,102,87,117,40,60,115,126,84,199,174,58,139,210,128,127,166,75,155,127,80,246,172,104,10,211,61) -IMAGE_DATA(231,106,47,210,181,15,233,94,26,137,196,222,62,240,240,248,127,194,194,143,1,33,199,14,247,183,203,205,135,198,130,131) -IMAGE_DATA(86,247,191,53,189,216,39,155,186,61,94,227,86,169,250,119,189,124,243,207,36,19,126,92,88,240,99,16,239,196,181,202) -IMAGE_DATA(191,47,223,168,255,240,78,237,165,143,223,159,122,117,83,198,215,39,238,124,3,255,18,126,100,89,151,46,175,171,210,20) -IMAGE_DATA(241,173,234,210,23,156,31,105,125,24,104,235,226,213,145,91,23,83,31,142,109,105,75,124,80,33,140,237,34,83,109,83) -IMAGE_DATA(59,110,45,84,15,171,240,47,66,13,169,230,66,61,36,235,29,159,85,117,2,63,145,211,216,94,244,144,128,189,210,223) -IMAGE_DATA(91,170,57,18,181,61,68,220,151,229,4,254,145,203,30,145,68,79,21,59,239,127,165,82,250,103,33,152,253,170,217,170) -IMAGE_DATA(191,215,122,109,225,46,174,248,140,113,93,237,112,190,242,181,24,176,113,93,13,77,207,84,255,128,166,140,184,207,214,67) -IMAGE_DATA(83,139,124,111,234,168,190,131,189,204,226,102,49,203,136,251,44,15,248,158,168,63,9,214,160,171,202,61,243,121,110,254) -IMAGE_DATA(230,119,42,109,70,216,169,226,225,214,192,72,159,173,123,163,121,251,19,19,125,216,177,58,48,212,87,214,30,179,55,209) -IMAGE_DATA(102,84,213,83,26,125,212,113,14,250,202,252,51,123,93,237,241,53,104,83,159,213,31,246,184,137,62,236,82,214,159,114) -IMAGE_DATA(255,177,190,85,173,93,255,203,68,31,118,176,23,245,99,201,254,211,246,31,182,7,116,123,144,237,61,89,237,75,250,143) -IMAGE_DATA(118,15,176,30,4,206,222,158,250,85,164,141,113,102,35,234,61,138,254,59,88,3,213,249,195,229,46,98,235,129,126,203) -IMAGE_DATA(242,205,40,139,65,115,254,0,218,243,87,117,6,170,206,62,131,243,23,72,245,252,1,63,25,117,182,134,207,31,64,145) -IMAGE_DATA(207,95,12,69,62,127,14,249,80,192,243,247,83,62,240,126,228,248,254,193,80,228,251,87,210,143,34,222,63,69,8,37) -IMAGE_DATA(76,157,231,255,0,109,101,251,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) +IMAGE_DATA(120,156,237,91,207,79,27,71,20,158,216,78,176,129,16,210,8,83,210,53,196,137,226,86,78,74,21,84,17,14,21,84) +IMAGE_DATA(106,41,81,15,92,146,37,74,14,61,132,28,160,135,170,238,141,67,201,33,162,82,15,64,114,32,61,84,165,233,177,254) +IMAGE_DATA(7,218,107,47,62,247,210,127,128,75,165,254,19,219,249,220,29,51,89,207,175,93,239,236,226,106,62,244,105,241,238,243) +IMAGE_DATA(124,239,189,121,243,102,215,24,114,141,92,35,14,177,176,68,233,135,71,17,188,240,186,159,186,176,71,246,79,190,38,65) +IMAGE_DATA(240,140,4,173,37,210,17,138,79,144,22,174,115,54,94,10,210,30,198,98,227,130,157,39,36,128,86,212,197,253,207,200) +IMAGE_DATA(9,111,215,126,64,78,168,93,226,92,224,189,24,131,141,71,199,15,34,227,247,200,114,195,206,179,215,56,34,119,9,180) +IMAGE_DATA(91,252,24,126,147,180,233,105,159,215,151,17,182,240,29,121,226,207,17,179,249,240,96,27,201,117,47,135,136,77,167,79) +IMAGE_DATA(78,235,207,227,231,4,185,36,242,218,237,130,183,199,239,81,159,99,234,119,129,120,248,92,170,124,96,121,11,243,213,135) +IMAGE_DATA(36,250,38,227,70,205,101,23,248,185,17,17,254,37,25,215,20,3,234,15,12,172,37,126,221,181,90,221,94,115,250,122) +IMAGE_DATA(169,91,51,54,225,123,205,87,1,248,150,247,52,8,2,18,124,177,185,16,176,115,149,137,5,147,249,77,12,62,126,244) +IMAGE_DATA(163,54,214,201,131,204,226,247,248,158,34,163,160,55,167,2,196,110,210,255,194,190,145,58,162,251,139,140,186,30,147,16) +IMAGE_DATA(70,189,63,210,239,83,67,116,15,238,241,55,202,95,251,207,163,78,72,58,251,63,176,196,239,175,111,104,239,203,115,144) +IMAGE_DATA(100,223,21,138,139,234,78,16,179,173,58,20,238,57,63,170,99,87,237,69,113,192,223,211,197,205,63,40,187,87,52,133) +IMAGE_DATA(233,154,179,181,22,233,220,251,116,45,13,68,146,222,58,112,112,248,127,98,129,254,56,56,56,56,56,56,56,228,14,171) +IMAGE_DATA(31,228,88,64,144,144,121,225,28,199,130,192,175,179,30,15,243,189,72,121,62,69,255,51,137,167,82,169,140,54,26,141) +IMAGE_DATA(119,87,86,86,62,94,93,93,189,71,249,185,197,24,172,197,82,171,213,102,183,182,182,182,15,14,14,14,143,142,142,94) +IMAGE_DATA(101,16,131,149,88,102,103,103,231,182,183,183,191,60,60,60,124,145,97,12,169,199,50,58,58,58,214,108,54,111,91,210) +IMAGE_DATA(205,122,94,108,107,101,17,75,86,249,202,51,87,105,195,150,86,166,189,209,162,102,214,49,216,210,117,113,12,134,52,117) +IMAGE_DATA(243,88,27,58,237,179,50,94,94,186,46,142,193,144,85,28,195,182,127,216,28,55,51,173,98,177,88,210,140,157,102,44) +IMAGE_DATA(214,116,166,167,167,223,222,221,221,125,102,83,35,132,213,241,23,23,23,239,190,164,56,62,62,254,217,64,43,137,158,141) +IMAGE_DATA(49,251,176,177,177,241,240,39,10,250,44,248,114,121,121,57,139,231,114,43,53,187,185,185,249,244,53,197,206,206,206,183) +IMAGE_DATA(245,122,253,14,61,53,55,108,49,0,107,107,107,247,246,246,246,190,91,95,95,191,63,62,62,94,35,255,253,65,251,250) +IMAGE_DATA(48,197,0,76,77,77,85,231,231,231,63,160,199,119,10,133,194,36,61,85,165,188,74,57,51,44,49,112,192,103,111,232) +IMAGE_DATA(191,21,202,9,202,203,148,151,40,199,40,47,12,129,255,124,28,248,252,19,159,33,142,80,150,67,34,134,98,120,157,156) +IMAGE_DATA(97,255,121,176,88,224,119,41,60,22,200,105,12,14,14,14,14,14,14,14,14,102,72,225,63,229,124,142,45,238,119,155) +IMAGE_DATA(223,76,197,183,110,241,45,116,221,13,90,39,244,41,77,221,14,175,113,169,80,254,171,90,188,248,71,148,17,63,78,82) +IMAGE_DATA(240,163,23,239,200,185,210,63,55,47,84,127,248,168,114,227,209,167,99,239,173,202,248,254,200,213,231,240,47,226,71,146) +IMAGE_DATA(121,105,243,186,42,77,17,63,44,207,125,197,249,17,215,135,158,182,46,94,29,185,121,49,245,97,63,45,109,137,15,42) +IMAGE_DATA(248,161,93,96,170,109,106,199,205,133,234,63,57,224,95,128,26,82,141,133,122,136,214,59,94,171,234,4,126,34,167,161) +IMAGE_DATA(189,232,27,244,88,43,221,181,165,26,35,82,219,125,196,117,89,78,224,31,57,237,17,81,116,84,177,243,254,151,74,133) +IMAGE_DATA(191,103,188,201,111,234,141,234,39,141,91,51,183,113,196,107,156,215,213,14,231,43,95,139,30,59,175,171,161,241,137,242) +IMAGE_DATA(239,208,148,17,215,217,124,104,106,145,239,77,45,213,123,176,150,89,220,44,102,25,113,157,229,1,239,19,245,39,193,28) +IMAGE_DATA(180,85,185,103,62,79,77,95,252,94,165,205,8,59,85,60,220,28,24,233,179,121,175,213,175,60,54,209,135,29,171,3) +IMAGE_DATA(67,125,101,237,49,123,19,109,70,85,61,197,209,71,29,103,160,175,204,63,179,215,213,30,95,131,105,234,179,250,195,26) +IMAGE_DATA(55,209,135,93,204,250,83,174,63,214,183,202,149,243,127,154,232,195,14,246,162,126,44,89,127,218,254,195,214,128,110,13) +IMAGE_DATA(178,181,39,171,125,73,255,209,174,1,214,131,192,201,43,99,191,136,180,113,158,217,136,122,143,162,255,246,230,64,181,255) +IMAGE_DATA(112,185,11,216,124,160,223,178,124,51,202,98,208,236,63,128,118,255,85,237,129,170,189,207,96,255,5,98,221,127,192,79) +IMAGE_DATA(70,157,173,225,253,7,144,231,253,23,67,158,247,159,125,62,228,112,255,253,134,15,188,31,25,62,127,48,228,249,252,21) +IMAGE_DATA(245,35,143,231,79,17,124,9,99,231,249,95,13,18,251,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) IMAGE_END_DATA(1248, 3) IMAGE_BEGIN_DATA diff --git a/uppdev/TabCtrl/main.cpp b/uppdev/TabCtrl/main.cpp index a13bb94f4..9adec0725 100644 --- a/uppdev/TabCtrl/main.cpp +++ b/uppdev/TabCtrl/main.cpp @@ -18,6 +18,7 @@ TabCtrlTest::TabCtrlTest() tab.Add(tab2, "Second").Image(CtrlImg::cut()); tab.Add(tab3, "Third"); tab.Add(arr.SizePos(), "Array"); + tab.SetStyle(tab.StyleDefault().Standard()); arr.AddColumn("1") .Ctrls(DefaultCtrlFactory