Exemplo n.º 1
0
BOOL XGraphicsOpenGL::LoadImg( LPCTSTR szFilename, int *pWidth, int *pHeight, DWORD **ppImage )
{
	XImage<DWORD> *pImage = new XImageiOS<DWORD>( TRUE );
	if( pImage->Load( szFilename ) )
	{
		*pWidth = pImage->GetMemWidth();
		*pHeight = pImage->GetMemHeight();
		DWORD **pp = (DWORD **)ppImage;
		pImage->MovePtr( pp );
		*ppImage = (DWORD *)*pp;
		SAFE_DELETE( pImage );
		return TRUE;
	}
    SAFE_DELETE_ARRAY( pImage ); 
	return FALSE;
}
Exemplo n.º 2
0
BOOL XSurfaceOpenGL::CreatePNG( LPCTSTR szFilename, BOOL bSrcKeep )
{
//	g_Pool.AllocMark(5);
    XImage<DWORD> *pImage = new XImageiOS<DWORD>( GetbHighReso() );
    pImage->Load( szFilename );

    // 빈 텍스쳐 만듬.
    SetSrcImg( NULL, pImage->GetMemWidth(), pImage->GetMemHeight() );
    int memw = GetMemWidth();
    int memh = GetMemHeight();
//	m_nWidth = pImage->GetWidth();
//	m_nHeight = pImage->GetHeight();
    // w,h값을 2^단위로 정렬한다.
    GLsizei alignedW = pImage->GetMemWidth();
    GLsizei alignedH = pImage->GetMemHeight();
    GRAPHICS->AlignPowSize( &alignedW, &alignedH );
    m_nAlignedWidth = alignedW;
    m_nAlignedHeight = alignedH;

    // 정렬된 크기로 버텍스버퍼생성.
    CreateVertexBuffer( GetWidth(), GetHeight(), 0, 0, memw, memh, alignedW, alignedH );

    glGenTextures( 1, &m_textureID );
    XBREAK( m_textureID == 0 );
    glBindTexture(GL_TEXTURE_2D, m_textureID );
    if( m_textureID == 0 )
    {
        XERROR( "memw:%d memh:%d", GetMemWidth(), GetMemHeight() );
        return FALSE;
    }
    // gl텍스쳐로 쓰기 위해 크기를 정렬한다
    {
//		g_Pool.AllocMark(4);
        DWORD *temp, *_temp, *src;
        temp = _temp = new DWORD[ alignedW * alignedH ];
        memset( temp, 0, alignedW * alignedH * sizeof(DWORD) );
        int i, j;
        src = pImage->GetTextureData();
        for( i = 0; i < memh; i ++ )
        {
            for( j = 0; j < memw; j ++ )
            {
                *_temp++ = *src++;
            }
            _temp += (alignedW - memw);
        }
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexImage2D(GL_TEXTURE_2D,
                     0,
                     GL_RGBA,
                     alignedW,
                     alignedH,
                     0,
                     GL_RGBA,
                     GL_UNSIGNED_BYTE,
                     temp );
        SAFE_DELETE( temp );
//		g_Pool.RestoreMark(4);
    }
    // 클래스내 보관용 이미지를 가져옴
    if( bSrcKeep )
    {
        DWORD *pSrcImg;
        pImage->MovePtr( &pSrcImg );    // Image메모리 소유권을 가져온다
        SetSrcImg( pSrcImg, memw, memh );
    }
    SAFE_DELETE( pImage );
//	g_Pool.RestoreMark(5);
    /*	if( bSrcKeep == FALSE ) {
    		SAFE_DELETE( temp );
    	}
    	else
    		m_pSrcImg = temp; */
    return TRUE;
}