@ 16. 1 ~ 17. 1/게임프로그래밍의 정석

(챕터 03) 이미지 파일을 사용하자(2)

namoeye 2014. 3. 1. 18:35

이미지의 높이와 폭을 읽어보자.

사양서에 따르면

dwHeight가 8바이트째부터 4바이트

dwWidth가 12바이트째부터 4바이트

그런게 맨 처음에 나온 dwMagic(4바이트) 크기를 더하면 최종

dwHeight가 12바이트째부터 4바이트

dwWidth가 16바이트째부터 4바이트가 원하는 값이 된다.

 char* fileImage; //여기에 DDS파일을 읽어왔다면..
 unsigned height, width;

 height=*(reinterpret_cast<unsigned int*>(&fileImage[12]));
 width=*(reinterpret_cast<unsigned int*>(&fileImage[16]));

 

char*를 강제로 unsigned*로 변환해서 unsigned를 추출하는데 그 이유는 DWORD가 unsigned이기 떄문이다.

(DWORD dwHeight, DWORD dwWidth 이므로..)

 

책에서는 강제로 다른형의 포인터로 바꿔 읽는것은 좋지 않다고 이야기한다. 그러면서 세가지 기능을 이야기 하는데

1. 캐스트(static_cast, const_cast, reinterpret_cast, dynamic_cast)

2. 얼라인먼트

3. 엔디안(리틀엔디안, 빅엔디안)

개인적으로 책내용도 보고 찾아봐야 이해가 된다.

 

어쩄든..책에서는 4바이트의 값을 원해서..아래와 같은 함수를 만들게 된다.

unsigned int getUnsigned(const char*p)
{
     const unsigned char* up;
     up=reinterpret_cast<const unsigned char*>(p);
     unsigned ret=up[0];
     ret|=(up[1]<<8);
     ret|=(up[2]<<16);
     ret|=(up[3]<<24);
     return ret;
}

 char* fileImage; //여기에 DDS파일을 읽어왔다면..
 unsigned height, width;

 height=getUnsigned(&fileImage[12]);
 width=getUnsigned(&fileImage[16]);

이렇게 하여 이미지의 높이와 폭을 구한다.

그 다음 이미지의 높이와 폭을 구했으면 픽셀을 구해서 그 크기에 맞게 뿌려주면된다.

사양서에 따르면 DDSURFACEDESC2크기는 124바이트 dwMagic 4바이트를 더한 128바이트까지가 포멧정보와 기타들..128이후가 픽셀이 들어있다.

unsigned* image=new unsigned[width*height];
     for(unsigned i=0;i<width*height;i++){
      image[i]=getUnsigned(&fileImage[128+i*4]);
 }

책에서는 4바이트씩 진행하므로 [128+i*4]라고 한다.

근데 왜 4바이트 (128+i*4)씩 진행을 해야하나? 그 이유는 데이터 본체는 unsigned 배열이고 여기서 다루는 dds는 32비트라 한다...

이미지를 화면에 표현은

unsigned* vram=videoMemory();

vram[y*windowWidth+x] = image[y*imagewidth+y];

이런식으로..(책보면 이해감..)