gosu 0.7.33 → 0.7.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gosu/Async.hpp +10 -8
- data/Gosu/Audio.hpp +6 -4
- data/Gosu/AutoLink.hpp +0 -0
- data/Gosu/Bitmap.hpp +4 -5
- data/Gosu/ButtonsX.hpp +1 -1
- data/Gosu/Color.hpp +8 -8
- data/Gosu/Font.hpp +2 -2
- data/Gosu/Graphics.hpp +4 -6
- data/Gosu/IO.hpp +11 -4
- data/Gosu/Image.hpp +9 -7
- data/Gosu/ImageData.hpp +10 -4
- data/Gosu/Input.hpp +4 -5
- data/Gosu/Sockets.hpp +10 -12
- data/Gosu/TR1.hpp +44 -0
- data/Gosu/TextInput.hpp +2 -2
- data/Gosu/Version.hpp +2 -2
- data/Gosu/WinUtility.hpp +5 -6
- data/Gosu/Window.hpp +5 -6
- data/GosuImpl/Async.cpp +4 -3
- data/GosuImpl/Audio/ALChannelManagement.hpp +23 -11
- data/GosuImpl/Audio/AudioFile.hpp +11 -3
- data/GosuImpl/Audio/AudioOpenAL.cpp +613 -0
- data/GosuImpl/Audio/AudioOpenAL.mm +1 -605
- data/GosuImpl/Audio/AudioSDL.cpp +12 -14
- data/GosuImpl/Audio/AudioToolboxFile.hpp +0 -1
- data/GosuImpl/Audio/OggFile.hpp +2 -0
- data/GosuImpl/Audio/SndFile.hpp +158 -0
- data/GosuImpl/DirectoriesWin.cpp +18 -18
- data/GosuImpl/Graphics/BitmapApple.mm +17 -19
- data/GosuImpl/Graphics/BitmapBMP.cpp +7 -2
- data/GosuImpl/Graphics/BitmapFreeImage.cpp +11 -12
- data/GosuImpl/Graphics/BitmapGDIplus.cpp +35 -31
- data/GosuImpl/Graphics/BitmapUtils.cpp +1 -1
- data/GosuImpl/Graphics/BlockAllocator.cpp +7 -8
- data/GosuImpl/Graphics/BlockAllocator.hpp +3 -4
- data/GosuImpl/Graphics/Common.hpp +3 -2
- data/GosuImpl/Graphics/DrawOp.hpp +2 -3
- data/GosuImpl/Graphics/DrawOpQueue.hpp +28 -20
- data/GosuImpl/Graphics/Font.cpp +13 -13
- data/GosuImpl/Graphics/FormattedString.hpp +93 -86
- data/GosuImpl/Graphics/Graphics.cpp +16 -14
- data/GosuImpl/Graphics/Image.cpp +7 -3
- data/GosuImpl/Graphics/LargeImageData.hpp +4 -5
- data/GosuImpl/Graphics/Macro.hpp +11 -11
- data/GosuImpl/Graphics/RenderState.hpp +5 -4
- data/GosuImpl/Graphics/TexChunk.cpp +3 -3
- data/GosuImpl/Graphics/TexChunk.hpp +4 -4
- data/GosuImpl/Graphics/Text.cpp +29 -30
- data/GosuImpl/Graphics/TextMac.cpp +9 -7
- data/GosuImpl/Graphics/TextTTFWin.cpp +3 -1
- data/GosuImpl/Graphics/TextTouch.mm +0 -1
- data/GosuImpl/Graphics/TextUnix.cpp +12 -4
- data/GosuImpl/Graphics/TextWin.cpp +4 -2
- data/GosuImpl/Graphics/Texture.cpp +7 -6
- data/GosuImpl/Graphics/Texture.hpp +3 -4
- data/GosuImpl/InputMac.mm +12 -15
- data/GosuImpl/InputTouch.mm +3 -3
- data/GosuImpl/InputWin.cpp +149 -159
- data/GosuImpl/InputX.cpp +0 -0
- data/GosuImpl/MacUtility.hpp +9 -4
- data/GosuImpl/RubyGosu.swg +38 -43
- data/GosuImpl/RubyGosu_wrap.cxx +89 -96
- data/GosuImpl/Sockets/CommSocket.cpp +5 -5
- data/GosuImpl/Sockets/Sockets.hpp +4 -4
- data/GosuImpl/TimingApple.cpp +2 -3
- data/GosuImpl/Utility.cpp +18 -0
- data/GosuImpl/WinMain.cpp +0 -1
- data/GosuImpl/WinUtility.cpp +2 -2
- data/GosuImpl/WindowMac.mm +20 -17
- data/GosuImpl/WindowTouch.mm +8 -7
- data/GosuImpl/WindowWin.cpp +12 -7
- data/GosuImpl/WindowX.cpp +67 -18
- data/lib/gosu.rb +14 -12
- data/linux/extconf.rb +11 -6
- metadata +8 -7
- data/GosuImpl/Audio/AudioAudiere.cpp +0 -448
- data/GosuImpl/RubyGosu_DllMain.cxx +0 -31
| @@ -2,16 +2,21 @@ | |
| 2 2 | 
             
            #include <Gosu/Bitmap.hpp>
         | 
| 3 3 | 
             
            #include <Gosu/IO.hpp>
         | 
| 4 4 | 
             
            #include <Gosu/Platform.hpp>
         | 
| 5 | 
            +
            #include <Gosu/TR1.hpp>
         | 
| 5 6 | 
             
            #include <Gosu/Utility.hpp>
         | 
| 6 7 | 
             
            #include <Gosu/WinUtility.hpp>
         | 
| 7 | 
            -
            #include < | 
| 8 | 
            -
            #include <boost/algorithm/string.hpp>
         | 
| 8 | 
            +
            #include <cwctype>
         | 
| 9 9 | 
             
            #include <map>
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include <objidl.h>
         | 
| 12 12 | 
             
            #include <gdiplus.h>
         | 
| 13 13 | 
             
            #include <windows.h>
         | 
| 14 14 |  | 
| 15 | 
            +
            using namespace std;
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            // TODO: Move into proper internal header
         | 
| 18 | 
            +
            namespace Gosu { bool isExtension(const wchar_t* str, const wchar_t* ext); }
         | 
| 19 | 
            +
             | 
| 15 20 | 
             
            namespace
         | 
| 16 21 | 
             
            {
         | 
| 17 22 | 
             
                bool initialized = false;
         | 
| @@ -23,7 +28,7 @@ namespace | |
| 23 28 | 
             
                {
         | 
| 24 29 | 
             
                    // Since GDI+ only supports ARGB=BGRA formats, we
         | 
| 25 30 | 
             
                    // manually exchange the R and B channels to get to ABGR=RGBA.
         | 
| 26 | 
            -
                     | 
| 31 | 
            +
                    std::tr1::uint32_t* p = reinterpret_cast<std::tr1::uint32_t*>(bitmap.data());
         | 
| 27 32 | 
             
                    for (int i = bitmap.width() * bitmap.height(); i > 0; --i, ++p)
         | 
| 28 33 | 
             
                        *p = (*p & 0xff00ff00) | ((*p << 16) & 0x00ff0000) | ((*p >> 16) & 0x000000ff);
         | 
| 29 34 | 
             
                }    
         | 
| @@ -31,7 +36,7 @@ namespace | |
| 31 36 | 
             
                void check(Gdiplus::Status status, const char* action)
         | 
| 32 37 | 
             
                {
         | 
| 33 38 | 
             
                    if (status != Gdiplus::Ok)
         | 
| 34 | 
            -
                        throw  | 
| 39 | 
            +
                        throw runtime_error(string("A GDI+ error occured while ") + action);
         | 
| 35 40 | 
             
                }
         | 
| 36 41 |  | 
| 37 42 | 
             
                void closeGDIplus()
         | 
| @@ -48,9 +53,8 @@ namespace | |
| 48 53 | 
             
                    atexit(closeGDIplus);
         | 
| 49 54 | 
             
                }
         | 
| 50 55 |  | 
| 51 | 
            -
                Gosu::Bitmap  | 
| 56 | 
            +
                void gdiPlusToGosu(Gosu::Bitmap& result, Gdiplus::Bitmap& bitmap)
         | 
| 52 57 | 
             
                {
         | 
| 53 | 
            -
                    Gosu::Bitmap result;
         | 
| 54 58 | 
             
                    result.resize(bitmap.GetWidth(), bitmap.GetHeight());
         | 
| 55 59 |  | 
| 56 60 | 
             
                    GUID guid;
         | 
| @@ -79,11 +83,9 @@ namespace | |
| 79 83 |  | 
| 80 84 | 
             
                    if (guid == Gdiplus::ImageFormatBMP)
         | 
| 81 85 | 
             
                        applyColorKey(result, Gosu::Color::FUCHSIA);
         | 
| 82 | 
            -
                    
         | 
| 83 | 
            -
                    return result;
         | 
| 84 86 | 
             
                }
         | 
| 85 87 |  | 
| 86 | 
            -
                 | 
| 88 | 
            +
                tr1::shared_ptr<IStream> readToIStream(Gosu::Reader reader)
         | 
| 87 89 | 
             
                {
         | 
| 88 90 | 
             
                    unsigned remaining = reader.resource().size() - reader.position();
         | 
| 89 91 | 
             
                    HGLOBAL buffer = ::GlobalAlloc(GMEM_MOVEABLE, remaining);
         | 
| @@ -100,14 +102,14 @@ namespace | |
| 100 102 | 
             
                    if (::CreateStreamOnHGlobal(buffer, TRUE, &stream) != S_OK)
         | 
| 101 103 | 
             
                    {
         | 
| 102 104 | 
             
                        ::GlobalFree(buffer);
         | 
| 103 | 
            -
                        throw  | 
| 105 | 
            +
                        throw runtime_error("Could not create IStream");
         | 
| 104 106 | 
             
                    }
         | 
| 105 107 | 
             
                    return Gosu::Win::shareComPtr(stream);
         | 
| 106 108 | 
             
                }
         | 
| 107 109 |  | 
| 108 | 
            -
                CLSID& encoderFromMimeType(const  | 
| 110 | 
            +
                CLSID& encoderFromMimeType(const wstring& mimeType)
         | 
| 109 111 | 
             
                {
         | 
| 110 | 
            -
                    static  | 
| 112 | 
            +
                    static map<wstring, CLSID> cache;
         | 
| 111 113 | 
             
                    if (cache.count(mimeType))
         | 
| 112 114 | 
             
                        return cache[mimeType];
         | 
| 113 115 |  | 
| @@ -115,25 +117,27 @@ namespace | |
| 115 117 | 
             
                    check(Gdiplus::GetImageEncodersSize(&num, &size), "counting encoders");
         | 
| 116 118 | 
             
                    // Do the eleet int-based ceil(size / sizeof)
         | 
| 117 119 | 
             
                    unsigned vecSize = (size + sizeof(Gdiplus::ImageCodecInfo) - 1) / sizeof(Gdiplus::ImageCodecInfo);
         | 
| 118 | 
            -
                     | 
| 120 | 
            +
                    vector<Gdiplus::ImageCodecInfo> codecs(vecSize);
         | 
| 119 121 | 
             
                    check(Gdiplus::GetImageEncoders(num, size,
         | 
| 120 122 | 
             
                        &codecs[0]), "enumerating encoders");
         | 
| 121 123 | 
             
                    for (int i = 0; i < num; ++i)
         | 
| 122 124 | 
             
                        if (codecs[i].MimeType == mimeType)
         | 
| 123 125 | 
             
                            return cache[mimeType] = codecs[i].Clsid;
         | 
| 124 | 
            -
                    throw  | 
| 126 | 
            +
                    throw runtime_error("No encoder found for " + Gosu::wstringToUTF8(mimeType));
         | 
| 125 127 | 
             
                }
         | 
| 126 128 |  | 
| 127 | 
            -
                CLSID encoderFromHint(const  | 
| 129 | 
            +
                CLSID encoderFromHint(const wstring& formatHint)
         | 
| 128 130 | 
             
                {
         | 
| 129 | 
            -
                     | 
| 130 | 
            -
                     | 
| 131 | 
            -
                    if (idx ==  | 
| 131 | 
            +
                    wstring::size_type idx = formatHint.rfind('.');
         | 
| 132 | 
            +
                    wstring mimeType = L"image/";
         | 
| 133 | 
            +
                    if (idx == wstring::npos)
         | 
| 132 134 | 
             
                        mimeType += formatHint;
         | 
| 133 135 | 
             
                    else
         | 
| 134 136 | 
             
                        mimeType += formatHint.substr(idx + 1);
         | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            +
                        
         | 
| 138 | 
            +
                    for (int i = 0; i < mimeType.size(); ++i)
         | 
| 139 | 
            +
                        mimeType[i] = towlower((wint_t)mimeType[i]);
         | 
| 140 | 
            +
                    
         | 
| 137 141 | 
             
                    // Fix pitfalls
         | 
| 138 142 | 
             
                    if (mimeType == L"image/jpg")
         | 
| 139 143 | 
             
                        mimeType = L"image/jpeg";
         | 
| @@ -144,31 +148,31 @@ namespace | |
| 144 148 | 
             
                }
         | 
| 145 149 | 
             
            }
         | 
| 146 150 |  | 
| 147 | 
            -
             | 
| 151 | 
            +
            void Gosu::loadImageFile(Gosu::Bitmap& result, const wstring& filename)
         | 
| 148 152 | 
             
            {
         | 
| 149 153 | 
             
                requireGDIplus();
         | 
| 150 154 |  | 
| 151 155 | 
             
                Gdiplus::Bitmap bitmap(filename.c_str());
         | 
| 152 156 | 
             
                check(bitmap.GetLastStatus(), ("loading " + wstringToUTF8(filename)).c_str());
         | 
| 153 | 
            -
                 | 
| 157 | 
            +
                gdiPlusToGosu(result, bitmap);
         | 
| 154 158 | 
             
            }
         | 
| 155 159 |  | 
| 156 | 
            -
             | 
| 160 | 
            +
            void Gosu::loadImageFile(Gosu::Bitmap& result, Reader reader)
         | 
| 157 161 | 
             
            {
         | 
| 158 162 | 
             
                requireGDIplus();
         | 
| 159 163 |  | 
| 160 | 
            -
                 | 
| 164 | 
            +
                tr1::shared_ptr<IStream> stream = readToIStream(reader);
         | 
| 161 165 | 
             
                Gdiplus::Bitmap bitmap(stream.get());
         | 
| 162 166 | 
             
                check(bitmap.GetLastStatus(), "loading a bitmap from memory");
         | 
| 163 | 
            -
                 | 
| 167 | 
            +
                gdiPlusToGosu(result, bitmap);
         | 
| 164 168 | 
             
            }
         | 
| 165 169 |  | 
| 166 | 
            -
            void Gosu::saveImageFile(const Bitmap& bitmap, const  | 
| 170 | 
            +
            void Gosu::saveImageFile(const Bitmap& bitmap, const wstring& filename)
         | 
| 167 171 | 
             
            {
         | 
| 168 172 | 
             
                requireGDIplus();
         | 
| 169 173 |  | 
| 170 174 | 
             
                Bitmap input = bitmap;
         | 
| 171 | 
            -
                if ( | 
| 175 | 
            +
                if (isExtension(filename.c_str(), L".bmp"))
         | 
| 172 176 | 
             
                    unapplyColorKey(input, Color::FUCHSIA);
         | 
| 173 177 | 
             
                reshuffleBitmap(input);
         | 
| 174 178 | 
             
                Gdiplus::Bitmap output(input.width(), input.height(), input.width() * 4,
         | 
| @@ -179,12 +183,12 @@ void Gosu::saveImageFile(const Bitmap& bitmap, const std::wstring& filename) | |
| 179 183 | 
             
                    ("writing to " + wstringToUTF8(filename)).c_str());
         | 
| 180 184 | 
             
            }
         | 
| 181 185 |  | 
| 182 | 
            -
            void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const  | 
| 186 | 
            +
            void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const wstring& formatHint)
         | 
| 183 187 | 
             
            {
         | 
| 184 188 | 
             
                requireGDIplus();
         | 
| 185 189 |  | 
| 186 190 | 
             
                Bitmap input = bitmap;
         | 
| 187 | 
            -
                if ( | 
| 191 | 
            +
                if (isExtension(formatHint.c_str(), L".bmp"))
         | 
| 188 192 | 
             
                    unapplyColorKey(input, Color::FUCHSIA);
         | 
| 189 193 | 
             
                reshuffleBitmap(input);
         | 
| 190 194 | 
             
                Gdiplus::Bitmap output(input.width(), input.height(), input.width() * 4,
         | 
| @@ -193,8 +197,8 @@ void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const std::wstring | |
| 193 197 |  | 
| 194 198 | 
             
                IStream* stream = NULL;
         | 
| 195 199 | 
             
                if (CreateStreamOnHGlobal(0, TRUE, &stream) != S_OK)
         | 
| 196 | 
            -
                    throw  | 
| 197 | 
            -
                 | 
| 200 | 
            +
                    throw runtime_error("Could not create IStream for writing");
         | 
| 201 | 
            +
                tr1::shared_ptr<IStream> streamGuard(Gosu::Win::shareComPtr(stream));
         | 
| 198 202 | 
             
                check(output.Save(stream, &encoderFromHint(formatHint)),
         | 
| 199 203 | 
             
                    "saving a bitmap to memory");
         | 
| 200 204 |  | 
| @@ -72,24 +72,23 @@ unsigned Gosu::BlockAllocator::height() const | |
| 72 72 | 
             
                return pimpl->height;
         | 
| 73 73 | 
             
            }
         | 
| 74 74 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
                Gosu::BlockAllocator::alloc(unsigned aWidth, unsigned aHeight)
         | 
| 75 | 
            +
            bool Gosu::BlockAllocator::alloc(unsigned aWidth, unsigned aHeight, Block& b)
         | 
| 77 76 | 
             
            {
         | 
| 78 77 | 
             
                // The rect wouldn't even fit onto the texture!
         | 
| 79 78 | 
             
                if (aWidth > width() || aHeight > height())
         | 
| 80 | 
            -
                    return  | 
| 79 | 
            +
                    return false;
         | 
| 81 80 |  | 
| 82 81 | 
             
                // We know there's no space left.
         | 
| 83 82 | 
             
                if (aWidth > pimpl->maxW && aHeight > pimpl->maxH)
         | 
| 84 | 
            -
                    return  | 
| 83 | 
            +
                    return false;
         | 
| 85 84 |  | 
| 86 85 | 
             
                // Start to look for a place next to the last returned rect. Chances are
         | 
| 87 86 | 
             
                // good we'll find a place there.
         | 
| 88 | 
            -
                 | 
| 87 | 
            +
                b = Block(pimpl->firstX, pimpl->firstY, aWidth, aHeight);
         | 
| 89 88 | 
             
                if (pimpl->isBlockFree(b))
         | 
| 90 89 | 
             
                {
         | 
| 91 90 | 
             
                    pimpl->markBlockUsed(b, aWidth, aHeight);
         | 
| 92 | 
            -
                    return  | 
| 91 | 
            +
                    return true;
         | 
| 93 92 | 
             
                }
         | 
| 94 93 |  | 
| 95 94 | 
             
                // Brute force: Look for a free place on this texture.
         | 
| @@ -110,13 +109,13 @@ boost::optional<Gosu::BlockAllocator::Block> | |
| 110 109 | 
             
                            --x;
         | 
| 111 110 |  | 
| 112 111 | 
             
                        pimpl->markBlockUsed(b, aWidth, aHeight);
         | 
| 113 | 
            -
                        return  | 
| 112 | 
            +
                        return true;
         | 
| 114 113 | 
             
                    }
         | 
| 115 114 |  | 
| 116 115 | 
             
                // So there was no space for the bitmap. Remember this for later.
         | 
| 117 116 | 
             
                pimpl->maxW = aWidth - 1;
         | 
| 118 117 | 
             
                pimpl->maxH = aHeight - 1;
         | 
| 119 | 
            -
                return  | 
| 118 | 
            +
                return false;
         | 
| 120 119 | 
             
            }
         | 
| 121 120 |  | 
| 122 121 | 
             
            void Gosu::BlockAllocator::free(unsigned left, unsigned top)
         | 
| @@ -1,15 +1,14 @@ | |
| 1 1 | 
             
            #ifndef GOSUIMPL_BLOCKALLOCATOR_HPP
         | 
| 2 2 | 
             
            #define GOSUIMPL_BLOCKALLOCATOR_HPP
         | 
| 3 3 |  | 
| 4 | 
            -
            #include < | 
| 5 | 
            -
            #include <boost/scoped_ptr.hpp>
         | 
| 4 | 
            +
            #include <memory>
         | 
| 6 5 |  | 
| 7 6 | 
             
            namespace Gosu
         | 
| 8 7 | 
             
            {
         | 
| 9 8 | 
             
                class BlockAllocator
         | 
| 10 9 | 
             
                {
         | 
| 11 10 | 
             
                    struct Impl;
         | 
| 12 | 
            -
                     | 
| 11 | 
            +
                    const std::auto_ptr<Impl> pimpl;
         | 
| 13 12 |  | 
| 14 13 | 
             
                public:
         | 
| 15 14 | 
             
                    struct Block
         | 
| @@ -26,7 +25,7 @@ namespace Gosu | |
| 26 25 | 
             
                    unsigned width() const;
         | 
| 27 26 | 
             
                    unsigned height() const;
         | 
| 28 27 |  | 
| 29 | 
            -
                     | 
| 28 | 
            +
                    bool alloc(unsigned width, unsigned height, Block& block);
         | 
| 30 29 | 
             
                    void free(unsigned left, unsigned top);
         | 
| 31 30 | 
             
                };
         | 
| 32 31 | 
             
            }
         | 
| @@ -61,10 +61,11 @@ namespace Gosu | |
| 61 61 | 
             
                inline Transform multiply(const Transform& left, const Transform& right)
         | 
| 62 62 | 
             
                {
         | 
| 63 63 | 
             
                    Gosu::Transform result;
         | 
| 64 | 
            -
                     | 
| 65 | 
            -
             | 
| 64 | 
            +
                    for (int i = 0; i < 16; ++i) {
         | 
| 65 | 
            +
                        result[i] = 0;
         | 
| 66 66 | 
             
                        for (int j = 0; j < 4; ++j)
         | 
| 67 67 | 
             
                            result[i] += left[i / 4 * 4 + j] * right[i % 4 + j * 4];
         | 
| 68 | 
            +
                    }
         | 
| 68 69 | 
             
                    return result;
         | 
| 69 70 | 
             
                }
         | 
| 70 71 |  | 
| @@ -6,14 +6,13 @@ | |
| 6 6 | 
             
            #include <GosuImpl/Graphics/Common.hpp>
         | 
| 7 7 | 
             
            #include <GosuImpl/Graphics/TexChunk.hpp>
         | 
| 8 8 | 
             
            #include <GosuImpl/Graphics/RenderState.hpp>
         | 
| 9 | 
            -
            #include <boost/cstdint.hpp>
         | 
| 10 9 |  | 
| 11 10 | 
             
            namespace Gosu
         | 
| 12 11 | 
             
            {
         | 
| 13 12 | 
             
                struct ArrayVertex
         | 
| 14 13 | 
             
                {
         | 
| 15 14 | 
             
                    float texCoords[2];
         | 
| 16 | 
            -
                     | 
| 15 | 
            +
                    unsigned color;
         | 
| 17 16 | 
             
                    float vertices[3];
         | 
| 18 17 | 
             
                };
         | 
| 19 18 | 
             
                typedef std::vector<ArrayVertex> VertexArray;
         | 
| @@ -52,7 +51,7 @@ namespace Gosu | |
| 52 51 | 
             
                        static int spriteCounter = 0;
         | 
| 53 52 | 
             
                        static float spriteVertices[12 * MAX_AUTOGROUP];
         | 
| 54 53 | 
             
                        static float spriteTexcoords[12 * MAX_AUTOGROUP];
         | 
| 55 | 
            -
                        static  | 
| 54 | 
            +
                        static unsigned spriteColors[6 * MAX_AUTOGROUP];
         | 
| 56 55 |  | 
| 57 56 | 
             
                        // iPhone specific setup
         | 
| 58 57 | 
             
                        static bool isSetup = false;
         | 
| @@ -1,11 +1,10 @@ | |
| 1 1 | 
             
            #ifndef GOSUIMPL_GRAPHICS_DRAWOPQUEUE_HPP
         | 
| 2 2 | 
             
            #define GOSUIMPL_GRAPHICS_DRAWOPQUEUE_HPP
         | 
| 3 3 |  | 
| 4 | 
            +
            #include <Gosu/TR1.hpp>
         | 
| 4 5 | 
             
            #include <GosuImpl/Graphics/Common.hpp>
         | 
| 5 6 | 
             
            #include <GosuImpl/Graphics/DrawOp.hpp>
         | 
| 6 | 
            -
            #include < | 
| 7 | 
            -
            #include <boost/function.hpp>
         | 
| 8 | 
            -
            #include <boost/optional.hpp>
         | 
| 7 | 
            +
            #include <cassert>
         | 
| 9 8 | 
             
            #include <algorithm>
         | 
| 10 9 | 
             
            #include <map>
         | 
| 11 10 | 
             
            #include <vector>
         | 
| @@ -14,7 +13,7 @@ class Gosu::DrawOpQueue | |
| 14 13 | 
             
            {
         | 
| 15 14 | 
             
                typedef std::vector<DrawOp> DrawOps;
         | 
| 16 15 | 
             
                DrawOps ops;
         | 
| 17 | 
            -
                typedef std::multimap<ZPos,  | 
| 16 | 
            +
                typedef std::multimap<ZPos, std::tr1::function<void()> > CodeMap;
         | 
| 18 17 | 
             
                CodeMap code;
         | 
| 19 18 |  | 
| 20 19 | 
             
                struct ClipRect
         | 
| @@ -23,15 +22,21 @@ class Gosu::DrawOpQueue | |
| 23 22 | 
             
                    unsigned width, height;
         | 
| 24 23 | 
             
                };
         | 
| 25 24 | 
             
                std::vector<ClipRect> clipRectStack;
         | 
| 26 | 
            -
                 | 
| 25 | 
            +
                ClipRect effectiveRect;
         | 
| 26 | 
            +
                bool haveEffectiveRect; // is effectiveRect valid?
         | 
| 27 | 
            +
                
         | 
| 27 28 | 
             
                void updateEffectiveRect()
         | 
| 28 29 | 
             
                {
         | 
| 29 30 | 
             
                    if (clipRectStack.empty())
         | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 31 | 
            +
                    {
         | 
| 32 | 
            +
                        haveEffectiveRect = false;
         | 
| 33 | 
            +
                        return;
         | 
| 34 | 
            +
                    }
         | 
| 35 | 
            +
                    
         | 
| 32 36 | 
             
                    ClipRect result = { 0, 0, 0x7fffffff, 0x7fffffff };
         | 
| 33 | 
            -
                     | 
| 37 | 
            +
                    for (int i = 0; i < clipRectStack.size(); ++i)
         | 
| 34 38 | 
             
                    {
         | 
| 39 | 
            +
                        const ClipRect& rect = clipRectStack[i];
         | 
| 35 40 | 
             
                        int right = std::min<int>(result.x + result.width, rect.x + rect.width);
         | 
| 36 41 | 
             
                        int bottom = std::min<int>(result.y + result.height, rect.y + rect.height);
         | 
| 37 42 | 
             
                        result.x = std::max<int>(result.x, rect.x);
         | 
| @@ -39,7 +44,7 @@ class Gosu::DrawOpQueue | |
| 39 44 |  | 
| 40 45 | 
             
                        if (result.x >= right || result.y >= bottom)
         | 
| 41 46 | 
             
                        {
         | 
| 42 | 
            -
                             | 
| 47 | 
            +
                            haveEffectiveRect = false;
         | 
| 43 48 | 
             
                            return;
         | 
| 44 49 | 
             
                        }
         | 
| 45 50 |  | 
| @@ -51,14 +56,18 @@ class Gosu::DrawOpQueue | |
| 51 56 | 
             
                    result.x *= fac, result.y *= fac, result.width *= fac, result.height *= fac;
         | 
| 52 57 |  | 
| 53 58 | 
             
                    effectiveRect = result;
         | 
| 59 | 
            +
                    haveEffectiveRect = true;
         | 
| 54 60 | 
             
                }
         | 
| 55 61 |  | 
| 56 62 | 
             
            public:
         | 
| 63 | 
            +
                DrawOpQueue() : haveEffectiveRect(false) {}
         | 
| 64 | 
            +
                
         | 
| 57 65 | 
             
                // I really wish I would trust ADL. :|
         | 
| 58 66 | 
             
                void swap(DrawOpQueue& other)
         | 
| 59 67 | 
             
                {
         | 
| 60 68 | 
             
                    clipRectStack.swap(other.clipRectStack);
         | 
| 61 69 | 
             
                    std::swap(effectiveRect, other.effectiveRect);
         | 
| 70 | 
            +
                    std::swap(haveEffectiveRect, other.haveEffectiveRect);
         | 
| 62 71 | 
             
                    ops.swap(other.ops);
         | 
| 63 72 | 
             
                    code.swap(other.code);
         | 
| 64 73 | 
             
                }
         | 
| @@ -70,13 +79,12 @@ public: | |
| 70 79 | 
             
                    assert (op.usedVertices == 4);
         | 
| 71 80 | 
             
                    #endif
         | 
| 72 81 |  | 
| 73 | 
            -
                    if ( | 
| 82 | 
            +
                    if (haveEffectiveRect)
         | 
| 74 83 | 
             
                    {
         | 
| 75 | 
            -
                         | 
| 76 | 
            -
                        op. | 
| 77 | 
            -
                        op. | 
| 78 | 
            -
                        op. | 
| 79 | 
            -
                        op.clipHeight = rect.height;
         | 
| 84 | 
            +
                        op.clipX      = effectiveRect.x;
         | 
| 85 | 
            +
                        op.clipY      = effectiveRect.y;
         | 
| 86 | 
            +
                        op.clipWidth  = effectiveRect.width;
         | 
| 87 | 
            +
                        op.clipHeight = effectiveRect.height;
         | 
| 80 88 | 
             
                    }
         | 
| 81 89 | 
             
                    else if (!clipRectStack.empty())
         | 
| 82 90 | 
             
                        // When we have no effect rect but the stack is not empty, we have clipped
         | 
| @@ -87,7 +95,7 @@ public: | |
| 87 95 | 
             
                    ops.push_back(op);
         | 
| 88 96 | 
             
                }
         | 
| 89 97 |  | 
| 90 | 
            -
                void scheduleGL( | 
| 98 | 
            +
                void scheduleGL(std::tr1::function<void()> customCode, ZPos z)
         | 
| 91 99 | 
             
                {
         | 
| 92 100 | 
             
                    code.insert(std::make_pair(z, customCode));
         | 
| 93 101 | 
             
                }
         | 
| @@ -110,8 +118,8 @@ public: | |
| 110 118 | 
             
                    // Allows us to make some assumptions.
         | 
| 111 119 | 
             
                    if (ops.empty())
         | 
| 112 120 | 
             
                    {
         | 
| 113 | 
            -
                         | 
| 114 | 
            -
                             | 
| 121 | 
            +
                        for (CodeMap::iterator it = code.begin(), end = code.end(); it != end; ++it)
         | 
| 122 | 
            +
                            it->second();
         | 
| 115 123 | 
             
                        return;
         | 
| 116 124 | 
             
                    }
         | 
| 117 125 |  | 
| @@ -179,8 +187,8 @@ public: | |
| 179 187 |  | 
| 180 188 | 
             
                    va.reserve(ops.size());
         | 
| 181 189 | 
             
                    std::stable_sort(ops.begin(), ops.end());
         | 
| 182 | 
            -
                     | 
| 183 | 
            -
                        op | 
| 190 | 
            +
                    for (DrawOps::const_iterator op = ops.begin(), end = ops.end(); op != end; ++op)
         | 
| 191 | 
            +
                        op->compileTo(va);
         | 
| 184 192 | 
             
                }
         | 
| 185 193 | 
             
            };
         | 
| 186 194 |  | 
    
        data/GosuImpl/Graphics/Font.cpp
    CHANGED
    
    | @@ -3,10 +3,10 @@ | |
| 3 3 | 
             
            #include <Gosu/Image.hpp>
         | 
| 4 4 | 
             
            #include <Gosu/Math.hpp>
         | 
| 5 5 | 
             
            #include <Gosu/Text.hpp>
         | 
| 6 | 
            +
            #include <Gosu/TR1.hpp>
         | 
| 6 7 | 
             
            #include <GosuImpl/Graphics/Common.hpp>
         | 
| 7 8 | 
             
            #include <GosuImpl/Graphics/FormattedString.hpp>
         | 
| 8 | 
            -
            #include < | 
| 9 | 
            -
            #include <boost/shared_ptr.hpp>
         | 
| 9 | 
            +
            #include <cassert>
         | 
| 10 10 | 
             
            #include <map>
         | 
| 11 11 | 
             
            using namespace std;
         | 
| 12 12 |  | 
| @@ -38,16 +38,16 @@ struct Gosu::Font::Impl | |
| 38 38 | 
             
                // IMPR: I couldn't find a way to determine the size of wchar_t at compile
         | 
| 39 39 | 
             
                // time, so I can't get rid of the magic numbers or even do some #ifdef
         | 
| 40 40 | 
             
                // magic.
         | 
| 41 | 
            -
                typedef  | 
| 42 | 
            -
                 | 
| 41 | 
            +
                typedef tr1::array<auto_ptr<Image>, 65536> CharChunk;
         | 
| 42 | 
            +
                auto_ptr<CharChunk> chunks[65536][ffCombinations];
         | 
| 43 43 |  | 
| 44 | 
            -
                 | 
| 44 | 
            +
                map<wstring, tr1::shared_ptr<Image> > entityCache;
         | 
| 45 45 |  | 
| 46 46 | 
             
                const Image& imageAt(const FormattedString& fs, unsigned i)
         | 
| 47 47 | 
             
                {
         | 
| 48 48 | 
             
                    if (fs.entityAt(i))
         | 
| 49 49 | 
             
                    {
         | 
| 50 | 
            -
                         | 
| 50 | 
            +
                        tr1::shared_ptr<Image>& ptr = entityCache[fs.entityAt(i)];
         | 
| 51 51 | 
             
                        if (!ptr)
         | 
| 52 52 | 
             
                            ptr.reset(new Image(*graphics, entityBitmap(fs.entityAt(i)), false));
         | 
| 53 53 | 
             
                        return *ptr;
         | 
| @@ -61,12 +61,12 @@ struct Gosu::Font::Impl | |
| 61 61 | 
             
                    size_t chunkIndex = wc / 65536;
         | 
| 62 62 | 
             
                    size_t charIndex = wc % 65536;
         | 
| 63 63 |  | 
| 64 | 
            -
                    if (!chunks[chunkIndex][flags])
         | 
| 64 | 
            +
                    if (!chunks[chunkIndex][flags].get())
         | 
| 65 65 | 
             
                        chunks[chunkIndex][flags].reset(new CharChunk);
         | 
| 66 66 |  | 
| 67 | 
            -
                     | 
| 67 | 
            +
                    auto_ptr<Image>& imgPtr = (*chunks[chunkIndex][flags])[charIndex];
         | 
| 68 68 |  | 
| 69 | 
            -
                    if (imgPtr)
         | 
| 69 | 
            +
                    if (imgPtr.get())
         | 
| 70 70 | 
             
                        return *imgPtr;
         | 
| 71 71 |  | 
| 72 72 | 
             
                    wstring charString(1, wc);
         | 
| @@ -99,7 +99,7 @@ Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned fontHeigh | |
| 99 99 | 
             
                pimpl->flags = fontFlags;
         | 
| 100 100 | 
             
            }
         | 
| 101 101 |  | 
| 102 | 
            -
             | 
| 102 | 
            +
            wstring Gosu::Font::name() const
         | 
| 103 103 | 
             
            {
         | 
| 104 104 | 
             
                return pimpl->name;
         | 
| 105 105 | 
             
            }
         | 
| @@ -114,9 +114,9 @@ unsigned Gosu::Font::flags() const | |
| 114 114 | 
             
                return pimpl->flags;
         | 
| 115 115 | 
             
            }
         | 
| 116 116 |  | 
| 117 | 
            -
            double Gosu::Font::textWidth(const  | 
| 117 | 
            +
            double Gosu::Font::textWidth(const wstring& text, double factorX) const
         | 
| 118 118 | 
             
            {
         | 
| 119 | 
            -
                FormattedString fs(text, flags());
         | 
| 119 | 
            +
                FormattedString fs(text.c_str(), flags());
         | 
| 120 120 | 
             
                double result = 0;
         | 
| 121 121 | 
             
                for (unsigned i = 0; i < fs.length(); ++i)
         | 
| 122 122 | 
             
                    result += pimpl->imageAt(fs, i).width() * pimpl->factorAt(fs, i);
         | 
| @@ -126,7 +126,7 @@ double Gosu::Font::textWidth(const std::wstring& text, double factorX) const | |
| 126 126 | 
             
            void Gosu::Font::draw(const wstring& text, double x, double y, ZPos z,
         | 
| 127 127 | 
             
                double factorX, double factorY, Color c, AlphaMode mode) const
         | 
| 128 128 | 
             
            {
         | 
| 129 | 
            -
                FormattedString fs(text, flags());
         | 
| 129 | 
            +
                FormattedString fs(text.c_str(), flags());
         | 
| 130 130 |  | 
| 131 131 | 
             
                enum {
         | 
| 132 132 | 
             
                    LTR = 1,
         |