ultimatepp/uppdev/AggCtrl/AggCtrlWin32.cpp
cxl 2e4b276e07 Merge continued
git-svn-id: svn://ultimatepp.org/upp/trunk@10263 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-10-04 08:34:39 +00:00

205 lines
6.4 KiB
C++

#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