Files
Webcam/include/engine/ui/widget_drawable.cpp

67 lines
2.0 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "widget_drawable.h"
#include "picture/pict.h"
using namespace GS;
using namespace GS::S2D;
//------------------------------------------------------------------------------
void DrawableWidget::Compose(Picture &output, const iRect &clip_rect)
{
if (hidden || !dirty || !picture)
return;
if (picture)
rect.Set(0, 0, picture->GetWidth(), picture->GetHeight());
else rect.Set(0, 0, 0, 0);
iRect out_rect = Widget::FormatOutputRect(rect, clip_rect),
blit_rect = out_rect.Intersection(clip_rect);
if (blit_rect.GetWidth() > rect.GetWidth())
blit_rect.ex = blit_rect.sx + rect.GetWidth();
if (blit_rect.GetHeight() > rect.GetHeight())
blit_rect.ey = blit_rect.sy + rect.GetHeight();
int src_offsetx = blit_rect.sx - out_rect.sx,
src_offsety = blit_rect.sy - out_rect.sy;
uchar *ptr = picture->GetData() + (src_offsety * picture->GetWidth() + src_offsetx) * 4,
*pds = output.GetData() + (blit_rect.sy * output.GetWidth() + blit_rect.sx) * 4;
for (int y = 0; y < blit_rect.GetHeight(); ++y)
{
uchar *psc = ptr, *spt = pds;
for (int x = 0; x < blit_rect.GetWidth(); ++x)
{
uchar alpha = psc[3];
uchar a_blend = Picture::AlphaCompositeAlpha(spt[3], alpha);
spt[0] = Picture::AlphaCompositeColor(spt[0], psc[0], spt[3], alpha, a_blend);
spt[1] = Picture::AlphaCompositeColor(spt[1], psc[1], spt[3], alpha, a_blend);
spt[2] = Picture::AlphaCompositeColor(spt[2], psc[2], spt[3], alpha, a_blend);
spt[3] = a_blend;
spt += 4;
psc += 4;
}
ptr += picture->GetWidth() * 4;
pds += output.GetWidth() * 4;
}
rect = out_rect;
dirty = false;
}
DrawableWidget::DrawableWidget(int id) : Widget(id)
{
type = WidgetTypeDrawable;
picture = NULL;
}
//------------------------------------------------------------------------------