⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macogrepngcodec.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
字号:
/*
-----------------------------------------------------------------------------
This source file is part of OGRE
    (Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/

Copyright � 2000-2002 The OGRE Team
Also see acknowledgements in Readme.html

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General  License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General  License for more details.

You should have received a copy of the GNU Lesser General  License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/

#include <ApplicationServices/ApplicationServices.h>

#include "OgrePlatform.h"
#include "OgreStdHeaders.h"
#include "OgrePNGCodec.h"
#include "OgreImage.h"
#include "OgreException.h"

#include "macDataProvider.h"

namespace Ogre {

    //---------------------------------------------------------------------
    void PNGCodec::code( const DataChunk& input, DataChunk* output, ... ) const
    {        
        OgreGuard( "PNGCodec::code" );

        Except(Exception::UNIMPLEMENTED_FEATURE, "code to memory not implemented",
            "PNGCodec::code");

        OgreUnguard();

    }
    //---------------------------------------------------------------------

    Codec::CodecData * PNGCodec::decode( const DataChunk& input, DataChunk* output, ... ) const
    {
        OgreGuard( "PNGCodec::decode" );
        ImageData * ret_data = new ImageData;
    
        CGDataProviderCallbacks providerCallbacks;
        providerCallbacks.getBytes = mac_CGgetBytes;
        providerCallbacks.skipBytes = mac_CGskipBytes;
        providerCallbacks.rewind = mac_CGrewind;
        providerCallbacks.releaseProvider = mac_CGreleaseProvider;
    
        CGDataProviderRef data = CGDataProviderCreate((void*)&input , &providerCallbacks);
    
        CGImageRef image = CGImageCreateWithPNGDataProvider(data, NULL, false, kCGRenderingIntentDefault);
        if(image == NULL) {
            CFRelease ( data );
            Except ( Exception::UNIMPLEMENTED_FEATURE,
                    "Image loading error",
                    "Could not initalize PNG loader.");
        }
    
        ret_data->width = CGImageGetWidth(image);
        ret_data->height = CGImageGetHeight(image);
        ret_data->depth = 1;
    
        uint components;
        CGColorSpaceRef colorSpace;
        CGImageAlphaInfo alphaInfo;
    
        if(CGColorSpaceGetNumberOfComponents(CGImageGetColorSpace(image)) == 1) {
            ret_data->format = PF_L8;
            components = 1;
            colorSpace = CGColorSpaceCreateDeviceGray();
            alphaInfo = kCGImageAlphaNone;
        }
        else {
            ret_data->format = PF_A8R8G8B8;
            components = 4;
            colorSpace = CGColorSpaceCreateDeviceRGB();
            alphaInfo = kCGImageAlphaPremultipliedLast;
        }
    
        uint bitsPerComponent = 8;
        uint bytesPerRow = ret_data->width * components;
        uint imageSize = bytesPerRow * ret_data->height;
    
        output->allocate(imageSize);
    
        CGContextRef destContext = CGBitmapContextCreate(output->getPtr(), ret_data->width, ret_data->height,
                                                        bitsPerComponent, bytesPerRow, colorSpace,
                                                        alphaInfo);
        if(destContext == NULL) {
            CFRelease ( colorSpace );
            CFRelease ( image );
            CFRelease ( data );
            Except ( Exception::UNIMPLEMENTED_FEATURE,
                    "Image loading error",
                    "Could not create bitmap context.");
        }
    
        CGRect destRect = CGRectMake(0, 0, ret_data->width, ret_data->height);
        CGContextDrawImage(destContext, destRect, image);
		
		ret_data->size = imageSize;
		ret_data->num_mipmaps = 0;
		ret_data->flags = 0;
    
        CFRelease( destContext );
        CFRelease( colorSpace );
        CFRelease( image );
        CFRelease( data );
    
    
        OgreUnguardRet( ret_data );
    }
    
    unsigned int PNGCodec::getILType(void) const
    { return 0; }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -