mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 14:16:09 -06:00
205 lines
6.4 KiB
C++
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
|