[4/8] d3dx9: Implement D3DXCreateCubeTextureFromFileInMemoryEx.

Matteo Bruni matteo.mystral at gmail.com
Thu May 10 09:28:43 CDT 2012


2012/5/9 Józef Kucia <joseph.kucia at gmail.com>:
> +    mip_levels = min(src_info->MipLevels, IDirect3DCubeTexture9_GetLevelCount(cube_texture));
> +    for (face = D3DCUBEMAP_FACE_POSITIVE_X; face <= D3DCUBEMAP_FACE_NEGATIVE_Z; face++)
> +    {
> +        size = src_info->Width;
> +        for (mip_level = 0; mip_level < mip_levels; mip_level++)
> +        {
> +            hr = calculate_dds_surface_size(src_info, size, size, &src_pitch, &mip_level_size);
> +            if (FAILED(hr)) return hr;
> +
> +            SetRect(&src_rect, 0, 0, size, size);
> +
> +            IDirect3DCubeTexture9_GetCubeMapSurface(cube_texture, face, mip_level, &surface);
> +            hr = D3DXLoadSurfaceFromMemory(surface, palette, NULL, pixels, src_info->Format, src_pitch,
> +                NULL, &src_rect, filter, color_key);
> +            IDirect3DSurface9_Release(surface);
> +            if (FAILED(hr)) return hr;
> +
> +            pixels += mip_level_size;
> +            size = max(1, size / 2);
> +        }
> +
> +        /* if texture has fewer mip levels than DDS file, skip excessive mip levels */
> +        while (mip_level < src_info->MipLevels)
> +        {
> +            calculate_dds_surface_size(src_info, size, size, &src_pitch, &mip_level_size);
> +            pixels += mip_level_size;
> +            size = max(1, size / 2);
> +            mip_level++;
> +        }
> +    }

Really a nitpick, you could merge the "while" into the "for" loop above.

> +    if ((caps.Caps2 & D3DCAPS2_DYNAMICTEXTURES) && (pool != D3DPOOL_DEFAULT) && (usage != D3DUSAGE_DYNAMIC))
> +    {
> +        hr = D3DXCreateCubeTexture(device, size, mip_levels, usage, format, pool, &tex);
> +        buftex = NULL;
> +    }
> +    else
> +    {
> +        hr = D3DXCreateCubeTexture(device, size, mip_levels, usage, format, D3DPOOL_SYSTEMMEM, &buftex);
> +        tex = buftex;
> +    }

The "if" condition doesn't look correct to me, since e.g. you don't
need a temporary texture if pool == D3DPOOL_DEFAULT and usage ==
D3DUSAGE_DYNAMIC.



More information about the wine-devel mailing list