00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Graphics2D/Sprite/SpritePictureRGBA8.h"
00027 #include "Graphics/Renderer/RenderingDevice.h"
00028 #include "Core/Codec/LinearMinificationFilter/LinearMinificationFilter.h"
00029
00030 namespace Lamp{
00031
00032
00033
00034
00035
00036 SpritePictureRGBA8::SpritePictureRGBA8() : image_(NULL){
00037 }
00038
00039
00040 SpritePictureRGBA8::~SpritePictureRGBA8(){
00041 SafeArrayDelete(image_);
00042 }
00043
00044
00045
00046
00047 void SpritePictureRGBA8::setSize(const DimensionI& size){
00048 SpritePicture::setSize(size);
00049 SafeArrayDelete(image_);
00050 image_ = new Color4c[size.width * size.height];
00051 }
00052
00053
00054
00055
00056 bool SpritePictureRGBA8::compileD3DTexture(){
00057 Assert(image_ != NULL);
00058 Direct3DTexture* d3dTexture;
00059 const DimensionI& size = getSize();
00060 d3dTexture = RenderingDevice::getInstance()->createTexture(
00061 D3DFMT_A8R8G8B8, size.width, size.height);
00062 setD3DTexture(d3dTexture);
00063
00064 if(!compileMipmap(image_, size, 0)){ return false; }
00065 return true;
00066 }
00067
00068
00069 bool SpritePictureRGBA8::compileImage(
00070 const Color4c* image, const DimensionI& size, int mipmapLevel){
00071 RenderingDevice* device = RenderingDevice::getInstance();
00072 D3DLOCKED_RECT lockedRect =
00073 device->lockTexture(getD3DTexture(), mipmapLevel);
00074 u_char* lineAddr = (u_char*)lockedRect.pBits;
00075 for(int i = 0; i < size.height; i++){
00076 u_int* writeAddr = (u_int*)lineAddr;
00077 int offset = i * size.width;
00078 for(int j = 0; j < size.width; j++){
00079 (*writeAddr) = image[offset + j].getARGB();
00080 writeAddr++;
00081 }
00082 lineAddr += lockedRect.Pitch;
00083 }
00084 device->unlockTexture(getD3DTexture(), mipmapLevel);
00085 return true;
00086 }
00087
00088
00089 bool SpritePictureRGBA8::compileMipmap(
00090 const Color4c* image, const DimensionI& size, int mipmapLevel){
00091
00092 if(!compileImage(image, size, mipmapLevel)){ return false; }
00093
00094 mipmapLevel++;
00095 if((size.width == 1) && (size.height == 1)){
00096 Assert(getD3DTexture()->GetLevelCount() == mipmapLevel);
00097 return true;
00098 }
00099 DimensionI nextSize = LinearMinificationFilter::getNextSize(size);
00100 Color4c* nextImage = new Color4c[nextSize.width * nextSize.height];
00101
00102 LinearMinificationFilter::filter(image, size, nextImage, nextSize);
00103 bool nextLevelResult = compileMipmap(nextImage, nextSize, mipmapLevel);
00104 delete[] nextImage;
00105 return nextLevelResult;
00106 }
00107
00108 }
00109