Migrate flash-rect task to new drawing modes

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3478 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2009-12-27 08:59:47 +00:00
parent 8df76e7440
commit edcccdb75f
3 changed files with 88 additions and 36 deletions
+1
View File
@@ -404,6 +404,7 @@ extern FRAME SetRelFrameIndex (FRAME Frame, SIZE FrameOffs);
extern FRAME SetEquFrameIndex (FRAME DstFrame, FRAME SrcFrame);
extern FRAME IncFrameIndex (FRAME Frame);
extern FRAME DecFrameIndex (FRAME Frame);
extern DRAWABLE CloneFrame (FRAME Frame);
extern DRAWABLE RotateFrame (FRAME Frame, int angle_deg);
extern DRAWABLE RescaleFrame (FRAME, int width, int height);
// This pair works for both paletted and trucolor frames
+58 -12
View File
@@ -296,19 +296,12 @@ GetFramePixel (FRAME frame, POINT pixelPt)
pixelPt.x, pixelPt.y);
}
// Creates a new DRAWABLE of specified size and scales the passed
// frame onto it. The aspect ratio is not preserved.
DRAWABLE
RescaleFrame (FRAME frame, int width, int height)
static FRAME
makeMatchingFrame (FRAME frame, int width, int height)
{
DRAWABLE drawable;
FRAME newFrame;
CREATE_FLAGS flags;
TFB_Image *img;
TFB_Canvas src, dst;
if (!frame)
return NULL;
flags = GetFrameParentDrawable (frame)->Flags;
drawable = CreateDrawable (flags, width, height, 1);
@@ -321,6 +314,61 @@ RescaleFrame (FRAME frame, int width, int height)
return NULL;
}
return newFrame;
}
// Creates an new DRAWABLE mostly identical to specified FRAME
DRAWABLE
CloneFrame (FRAME frame)
{
FRAME newFrame;
TFB_Image *img;
TFB_Canvas src, dst;
RECT r;
if (!frame)
return NULL;
GetFrameRect (frame, &r);
r.corner.x = 0;
r.corner.y = 0;
newFrame = makeMatchingFrame (frame, r.extent.width, r.extent.height);
if (!newFrame)
return NULL;
// copy the hot-spot
newFrame->HotSpot = frame->HotSpot;
img = frame->image;
LockMutex (img->mutex);
// copy the pixels
src = img->NormalImg;
dst = newFrame->image->NormalImg;
TFB_DrawCanvas_CopyRect (src, &r, dst, MAKE_POINT (0, 0));
UnlockMutex (img->mutex);
return ReleaseDrawable (newFrame);
}
// Creates a new DRAWABLE of specified size and scales the passed
// frame onto it. The aspect ratio is not preserved.
DRAWABLE
RescaleFrame (FRAME frame, int width, int height)
{
FRAME newFrame;
TFB_Image *img;
TFB_Canvas src, dst;
if (!frame)
return NULL;
newFrame = makeMatchingFrame (frame, width, height);
if (!newFrame)
return NULL;
// scale the hot-spot
newFrame->HotSpot.x = frame->HotSpot.x * width / frame->Bounds.width;
newFrame->HotSpot.y = frame->HotSpot.y * height / frame->Bounds.height;
@@ -334,9 +382,7 @@ RescaleFrame (FRAME frame, int width, int height)
UnlockMutex (img->mutex);
ReleaseDrawable (newFrame);
return drawable;
return ReleaseDrawable (newFrame);
}
BOOLEAN
+29 -24
View File
@@ -1583,10 +1583,6 @@ static FRAME flash_screen_frame = 0;
// The original contents of the flash rectangle.
static int flash_changed;
Mutex flash_mutex = 0;
// XXX: these are currently defined in libs/graphics/sdl/3do_getbody.c
// they should be sorted out and cleaned up at some point
extern void arith_frame_blit (FRAME srcFrame, const RECT *rsrc,
FRAME dstFrame, const RECT *rdst, int num, int denom);
static int
flash_rect_func (void *data)
@@ -1620,21 +1616,14 @@ flash_rect_func (void *data)
LockMutex (flash_mutex);
if (flash_changed)
{
RECT screen_rect;
cached_rect = flash_rect;
if (cached_screen_frame)
DestroyDrawable (ReleaseDrawable (cached_screen_frame));
flash_changed = 0;
// Wait for the flash_screen_frame to get initialized
FlushGraphics ();
GetFrameRect (flash_screen_frame, &screen_rect);
cached_screen_frame = CaptureDrawable (CreateDrawable (
WANT_PIXMAP, screen_rect.extent.width,
screen_rect.extent.height, 1));
screen_rect.corner.x = 0;
screen_rect.corner.y = 0;
arith_frame_blit (flash_screen_frame, &screen_rect,
cached_screen_frame, NULL, 0, 0);
cached_screen_frame = CaptureDrawable (
CloneFrame (flash_screen_frame));
UnlockMutex (flash_mutex);
// Clear the cache.
@@ -1652,6 +1641,7 @@ flash_rect_func (void *data)
if (cached_rect.extent.width)
{
STAMP *pStamp;
#define MIN_STRENGTH 4
#define MAX_STRENGTH 6
strength += 2;
@@ -1661,22 +1651,36 @@ flash_rect_func (void *data)
pStamp = &cached_stamp[strength - MIN_STRENGTH];
else
{
RECT tmp_rect = cached_rect;
pStamp = &cached_stamp[strength - MIN_STRENGTH];
cached[strength - MIN_STRENGTH] = true;
pStamp->frame = CaptureDrawable (CreateDrawable (WANT_PIXMAP,
cached_rect.extent.width, cached_rect.extent.height,
1));
pStamp->frame = CaptureDrawable (
CloneFrame (cached_screen_frame));
pStamp->origin.x = 0;
pStamp->origin.y = 0;
tmp_rect.corner.x = 0;
tmp_rect.corner.y = 0;
arith_frame_blit (cached_screen_frame, &tmp_rect,
pStamp->frame, &tmp_rect, 4, 4);
if (strength != 4)
arith_frame_blit (cached_screen_frame, &tmp_rect,
pStamp->frame, &tmp_rect, strength, 4);
{ // brighten the frame with an additive
DrawMode oldMode;
STAMP s;
int factor;
s.origin.x = 0;
s.origin.y = 0;
s.frame = cached_screen_frame;
factor = (strength - MIN_STRENGTH) * DRAW_FACTOR_1 / 4;
LockMutex (GraphicsLock);
OldContext = SetContext (OffScreenContext);
SetContextFGFrame (pStamp->frame);
SetContextClipRect (NULL);
oldMode = SetContextDrawMode (MAKE_DRAW_MODE (
DRAW_ADDITIVE, factor));
DrawStamp (&s);
SetContextDrawMode (oldMode);
SetContext (OldContext);
UnlockMutex (GraphicsLock);
}
}
LockMutex (GraphicsLock);
@@ -1685,7 +1689,8 @@ flash_rect_func (void *data)
// flash changed_can't be modified while GraphicSem is held
if (!flash_changed)
DrawStamp (pStamp);
SetContextClipRect (NULL); // this will flush whatever
// XXX: Shouldn't we save and restore the original cliprect?
SetContextClipRect (NULL);
SetContext (OldContext);
UnlockMutex (GraphicsLock);
}