67 lines
2.0 KiB
C++
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;
|
|
}
|
|
//------------------------------------------------------------------------------
|