1 // -*- Mode: C++; tab-width:2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi:tw=80:et:ts=2:sts=2
3 //
4 // -----------------------------------------------------------------------
5 //
6 // This file is part of RLVM, a RealLive virtual machine clone.
7 //
8 // -----------------------------------------------------------------------
9 //
10 // Copyright (C) 2008 Elliot Glaysher
11 //
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.
16 //
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.
21 //
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.
25 //
26 // -----------------------------------------------------------------------
27 
28 #ifndef SRC_SYSTEMS_BASE_TONE_CURVE_H_
29 #define SRC_SYSTEMS_BASE_TONE_CURVE_H_
30 
31 #include <array>
32 #include <vector>
33 
34 class Gameexe;
35 class RLMachine;
36 
37 typedef std::array<unsigned char, 256> ToneCurveColorMap;
38 typedef std::array<ToneCurveColorMap, 3> ToneCurveRGBMap;
39 typedef std::vector<ToneCurveRGBMap> ToneCurveEffects;
40 
41 // Manages tone curve effects
42 //
43 // The tcc file is a set of mapping between R, G, and B color values and their
44 // corresponding values after the tone curve is applied, where
45 // tcc_effect[2][1][200]
46 // is the corresponding green value for a green value of 200 in the original
47 // image
48 // when the tone curve with the "index" of 2 is applied.
49 // ToneCurve class is responsible for loading the tcc data and providing an
50 // interface for applying tone curve effects.
51 class ToneCurve {
52  public:
53   // Initializes an empty tone curve set (for games that don't use this
54   // feature).
55   ToneCurve();
56 
57   // Initializes the CG table with the TCC data file specified in the
58   // #TONECURVE_FILENAME gameexe key.
59   explicit ToneCurve(Gameexe& gameexe);
60   ~ToneCurve();
61 
62   // Returns the total number of tone curve effects available in the tone curve
63   // file
64   int GetEffectCount() const;
65 
66   // Return the effect at the given index (used by Surface in tone_curve()).  The
67   // effects are indexed from 0 to effect_count - 1
68   ToneCurveRGBMap GetEffect(int index);
69 
70  private:
71   // Array of tone curve effects
72   ToneCurveEffects tcc_info_;
73   int effect_count_;
74 };  // end of class ToneCurve
75 
76 #endif  // SRC_SYSTEMS_BASE_TONE_CURVE_H_
77