[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