1
// -*- Mode: C++; tab-width:2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2
// vi:tw=80:et:ts=2:sts=2
4
// -----------------------------------------------------------------------
6
// This file is part of RLVM, a RealLive virtual machine clone.
8
// -----------------------------------------------------------------------
10
// Copyright (C) 2006 Elliot Glaysher
12
// This program is free software; you can redistribute it and/or modify
13
// it under the terms of the GNU General Public License as published by
14
// the Free Software Foundation; either version 3 of the License, or
15
// (at your option) any later version.
17
// This program is distributed in the hope that it will be useful,
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
// GNU General Public License for more details.
22
// You should have received a copy of the GNU General Public License
23
// along with this program; if not, write to the Free Software
24
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
26
// -----------------------------------------------------------------------
28
#include "effects/effect.h"
30
#include "machine/rlmachine.h"
31
#include "systems/base/event_system.h"
32
#include "systems/base/graphics_system.h"
33
#include "systems/base/surface.h"
34
#include "systems/base/system.h"
36
// -----------------------------------------------------------------------
38
// -----------------------------------------------------------------------
40
Effect::Effect(RLMachine& machine,
41
std::shared_ptr<Surface> src,
42
std::shared_ptr<Surface> dst,
47
start_time_(machine.system().event().GetTicks()),
51
machine.system().graphics().set_is_responsible_for_update(false);
55
machine_.system().graphics().set_is_responsible_for_update(true);
58
bool Effect::operator()(RLMachine& machine) {
59
unsigned int time = machine.system().event().GetTicks();
60
unsigned int current_frame = time - start_time_;
62
bool fast_forward = machine.system().ShouldFastForward();
64
if (current_frame >= duration_ || fast_forward) {
67
GraphicsSystem& graphics = machine.system().graphics();
68
graphics.BeginFrame();
70
if (BlitOriginalImage()) {
71
dst_surface().RenderToScreen(
72
Rect(Point(0, 0), size()), Rect(Point(0, 0), size()), 255);
75
PerformEffectForTime(machine, current_frame);
82
// -----------------------------------------------------------------------
83
// BlitAfterEffectFinishes
84
// -----------------------------------------------------------------------
86
BlitAfterEffectFinishes::BlitAfterEffectFinishes(LongOperation* in,
87
std::shared_ptr<Surface> src,
88
std::shared_ptr<Surface> dst,
91
: PerformAfterLongOperationDecorator(in),
95
dest_rect_(destRect) {}
97
BlitAfterEffectFinishes::~BlitAfterEffectFinishes() {}
99
void BlitAfterEffectFinishes::PerformAfterLongOperation(RLMachine& machine) {
100
// Blit DC1 onto DC0, with full opacity, and end the operation
101
src_surface_->BlitToSurface(*dst_surface_, src_rect_, dest_rect_, 255);
103
// Now force a screen refresh
104
machine.system().graphics().ForceRefresh();