/[svn]/gigedit/trunk/src/gigedit/global.h
ViewVC logotype

Annotation of /gigedit/trunk/src/gigedit/global.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3089 - (hide annotations) (download) (as text)
Sun Jan 15 19:18:39 2017 UTC (7 years, 3 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 4778 byte(s)
* Implemented resizing multiple dimension region zones at once, which is
  controlled by the infamous checkbox trio "all regions",
  "all dimension splits" and "both channels".
* Bumped version (1.0.0.svn25).

1 schoenebeck 1396 /* -*- c++ -*-
2 schoenebeck 3089 * Copyright (C) 2007-2017 Andreas Persson
3 schoenebeck 1396 *
4     * This program is free software; you can redistribute it and/or
5     * modify it under the terms of the GNU General Public License as
6     * published by the Free Software Foundation; either version 2, or (at
7     * your option) any later version.
8     *
9     * This program is distributed in the hope that it will be useful, but
10     * WITHOUT ANY WARRANTY; without even the implied warranty of
11     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12     * General Public License for more details.
13     *
14     * You should have received a copy of the GNU General Public License
15     * along with program; see the file COPYING. If not, write to the Free
16     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17     * 02110-1301 USA.
18     */
19    
20     #ifndef GIGEDIT_GLOBAL_H
21     #define GIGEDIT_GLOBAL_H
22    
23     #if HAVE_CONFIG_H
24     # include <config.h>
25     #endif
26    
27 schoenebeck 2967 #if !defined(WIN32)
28     # include <unistd.h>
29     # include <errno.h>
30     #endif
31    
32 persson 2442 #include <sstream>
33 schoenebeck 3089 #include <map>
34 persson 2442
35 schoenebeck 3089 #ifdef LIBGIG_HEADER_FILE
36     # include LIBGIG_HEADER_FILE(gig.h)
37     #else
38     # include <gig.h>
39     #endif
40    
41 schoenebeck 2474 //FIXME: for some reason AC GETTEXT check fails on the Mac cross compiler?
42     #if (HAVE_GETTEXT || defined(__APPLE__))
43 schoenebeck 1396 # include <libintl.h>
44     # define _(String) gettext(String)
45     #else
46     # define _(String) String
47     #endif
48    
49     #if defined(WIN32) && !HAVE_CONFIG_H
50     # include "../../win32/libgigedit_private.h" // like config.h, automatically generated by Dev-C++
51     # define PACKAGE "gigedit"
52     # define VERSION VER_STRING // VER_STRING defined in libgig_private.h
53     #endif // WIN32
54    
55 schoenebeck 2692 #define UNICODE_RIGHT_ARROW Glib::ustring(1, gunichar(0x2192))
56     #define UNICODE_LEFT_ARROW Glib::ustring(1, gunichar(0x2190))
57    
58 persson 2442 template<class T> inline std::string ToString(T o) {
59     std::stringstream ss;
60     ss << o;
61     return ss.str();
62     }
63    
64 schoenebeck 3089 inline int getDimensionIndex(gig::dimension_t type, gig::Region* rgn) {
65     for (uint i = 0; i < rgn->Dimensions; ++i)
66     if (rgn->pDimensionDefinitions[i].dimension == type)
67     return i;
68     return -1;
69     }
70    
71     inline int getDimensionRegionIndex(gig::DimensionRegion* dr) {
72     if (!dr) return -1;
73     gig::Region* rgn = (gig::Region*)dr->GetParent();
74     for (uint i = 0; i < 256; ++i)
75     if (rgn->pDimensionRegions[i] == dr)
76     return i;
77     return -1;
78     }
79    
80 schoenebeck 2548 /// Find the number of bits required to hold the specified amount of zones.
81     inline int zoneCountToBits(int nZones) {
82 schoenebeck 2604 if (!nZones) return 0;
83 schoenebeck 2548 int iFinalBits = 0;
84     int zoneBits = nZones - 1;
85     for (; zoneBits > 1; iFinalBits += 2, zoneBits >>= 2);
86     iFinalBits += zoneBits;
87     return iFinalBits;
88     }
89    
90 schoenebeck 3089 /**
91     * Returns the sum of all bits of all dimensions defined before the given
92     * dimensions (@a type). This allows to access cases of that particular
93     * dimension directly. If the supplied dimension @a type does not exist in the
94     * the supplied @a region, then this function returns -1 instead!
95     *
96     * @param type - dimension that shall be used
97     * @param rgn - parent region of that dimension
98     */
99     inline int baseBits(gig::dimension_t type, gig::Region* rgn) {
100     int previousBits = 0;
101     for (uint i = 0; i < rgn->Dimensions; ++i) {
102     if (rgn->pDimensionDefinitions[i].dimension == type) return previousBits;
103     previousBits += rgn->pDimensionDefinitions[i].bits;
104     }
105     return -1;
106     }
107    
108     // key: dimension type, value: dimension's zone index
109     class DimensionCase : public std::map<gig::dimension_t,int> {
110     public:
111     bool isViolating(const DimensionCase& c) const {
112     for (DimensionCase::const_iterator it = begin(); it != end(); ++it) {
113     if (c.find(it->first) == c.end()) continue;
114     if (c.find(it->first)->second != it->second) return true;
115     }
116     return false;
117     }
118     };
119    
120     inline DimensionCase dimensionCaseOf(gig::DimensionRegion* dr) {
121     DimensionCase dimCase;
122     int idr = getDimensionRegionIndex(dr);
123     if (idr < 0) return dimCase;
124     gig::Region* rgn = (gig::Region*)dr->GetParent();
125     int bitpos = 0;
126     for (int d = 0; d < rgn->Dimensions; ++d) {
127     const gig::dimension_def_t& dimdef = rgn->pDimensionDefinitions[d];
128     const int zone = (idr >> bitpos) & ((1 << dimdef.bits) - 1);
129     dimCase[dimdef.dimension] = zone;
130     bitpos += rgn->pDimensionDefinitions[d].bits;
131     }
132     return dimCase;
133     }
134    
135     inline std::vector<gig::DimensionRegion*> dimensionRegionsMatching(const DimensionCase& dimCase, gig::Region* rgn) {
136     std::vector<gig::DimensionRegion*> v;
137     for (int idr = 0; idr < 256; ++idr) {
138     if (!rgn->pDimensionRegions[idr]) continue;
139     DimensionCase c = dimensionCaseOf(rgn->pDimensionRegions[idr]);
140     if (!dimCase.isViolating(c)) v.push_back(rgn->pDimensionRegions[idr]);
141     }
142     return v;
143     }
144    
145 schoenebeck 1396 #endif // GIGEDIT_GLOBAL_H

  ViewVC Help
Powered by ViewVC