bitmap 공식

Scanline = bitCount * width + (4-((bitCount * width)%4));
스캔라인 = 비트수 * 비트맵이가지고 있는 가로넓이 + (4-(비트수*넓이)%4)

위에 4-... 라는 것이 만들어진것은 비트맵 자체가 저장이 될때 4바이트 단위(DWORD)로 저장이 되기때문이다.

예를 들어서 24비트, 가로99, 세로 10의 사이즈를 가진다고 하면, 99 * 10 * 3(24/8한값임)의 바이트수를 가지는 값일거라 생각들 하지만, 실제로는 그렇게 가지지 않는다는것을 알수 있다.
가로99는 4단위로 저장을 한다고 가정을 하면, 4로 나누어서 딱 떨어지는 값이 나오질 않기때문에 이렇게 표현을 할수가 있다.

99 = 4 * 24 + 3

말 그대로 4바이트 단위로 저장을 했을때, 24번 저장이 되고, 3바이트가 남는다는것이다. 4바이트단위로 저장된다고 해서 3바이트를 버릴수는 없으니, 4* 24 + (3+1) 이 되어 버리고 필요없는 1바이트값이 더 생기는 것이다.
그래서 총 사이즈는 필요 없는 값 1바이트가 더 붙었으므로 1 * h 만큼 더 늘어나게 된다. 위의 공식에 잠시 대입을 해보자면...

3*99 + (4-((3*99)%4) = 297 + (4-1) = 300

한 라인이 가지는 실제 크기는 300 바이트가 되는것이다.
여기에 높이값만 곱해주면 실제 사이즈가 된다.
(같은 비트와 같은 높이라면 가로가 99나 100이나 같다는 소리다)

TotalSize = Scanline * height;


이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/04/26 09:40 2010/04/26 09:40
Wind
프로그래밍 2010/04/26 09:40

SyntaxHighlight 버전업!

오늘 야비군을 다녀왔다가 새로운 기분을 만들기 위해서 스킨을 변경했다.
변경을 했더니... 이게 왠걸 SyntaxHighlight 가 주석란의 세로간격이 겹처서 이상하게 출력이 되어서
새로운 버전이 있나 하던 차에 보니...
코드구글에 있던것이 아예 위키를 차려서 2.0 이상 버전으로 업그레이드가 됐다.

코드를 눈에 확실하게 보여주기 위해서 몇가지 기능들이 추가가 되었고, 환경설정등의 기능이 대폭추가 된 것 같다.

자세한 내용은 아래 링크에서 확인 하면 될것 같다


흠.... 근데 난 하이라이트로 표시되는 색이 맘에 들지 않아 자바스크립트 소스좀 들여봐야 할것 같다. ㅋ
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/08/18 22:48 2009/08/18 22:48
Wind
프로그래밍 2009/08/18 22:48

IE8 때문에 Visual Stdio 2008의 프로젝트가 생성 되지 않는 문제.

http://blogs.msdn.com/vcblog/archive/20 ··· ror.aspx
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/05/04 09:29 2009/05/04 09:29
Wind
프로그래밍/C++ 2009/05/04 09:29

루비와 첫 대면, 주의할것들

이번에 서버에서 빈번하게 반복되게 사용 되는 코드를 생성하는 스크립트를 만들기 위해 루비를 선택하고 한번 만들어 보았다.

http://www.ruby-doc.org/core/ 에서 api를 참조 하였다.



위의 결과는... 456이다.
기본이 ref 인듯 싶다.

그래서 찾은 방법이.. 두가지..

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/11/27 14:37 2008/11/27 14:37
Wind
프로그래밍/Ruby 2008/11/27 14:37

Agent Work

Agent Work는 디비 엔진상에서 백그라운드로 지정된 시간에 지정된 sp 나 sql을 실행 할 수 있는 기능이다.
포토샵이 뜨질 않아서.. 나중에 이미지로 함께 올릴것임!
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/09/26 17:51 2008/09/26 17:51
Wind
프로그래밍/MSSQL 2008/09/26 17:51

기본 디바이스 생성하기.

1. 사전준비

일단... Direct 3D를 사용 하기 위해서는... Visual Stdio (꼭은 아니지만..) 말고...
Direct X SDK 가 필요하다. 현제 최신버전이 DX9.0c 이니...
Direct X SDK 9.0을 받아도 무관하지만... DX 같은경우, 2달인가 3달마다... 새로운 버전이 나오기때문에
그것을 받아서 설치 할 경우 최근에 변화된 기술을 바로 적용 시킬수 있다.
다운로드는 Microsoft.com에서나... 그외에 다른곳에도 있다. ( 마소홈에서 받을땐... 정품인증 안되면 못 받는다. )

다운로드를 받아서 설치를 해준경우 Include와 lib 디렉토리가 사용 할 수 있게 Visual Stdio에 등록이 되어 있는지 확인한다.
VS.NET 2003 같은경우 메뉴에서.. 도구-옵션-프로젝트-VC디렉토리 에서, 포함이 되어 있어야 한다.


포함(include)파일에는 Direct X SDK 설치폴더의 include를 지정해주면 되고,
라이브러리(lib)파일에는 Direct X SDK 설치폴더의 lib를 지정해주면 된다.


2. 코드안에서의 준비
기본적으로... Direct 3D도 라이브러리 이기 때문에 lib과 *.h 파일을 포함해야 사용이 가능하다.
일단 기본적으로
는 포함을 한다. ( 추후에 어떤것을 사용 하는것에 따라 추가로 해더를 포함 할 수도 있다.)

또한 여기서 사용하는 lib 파일을 포함 해야 하는데...
VS(비주얼스트디오)에서는 두가지 방법을 지원한다.

* 첫번째, 프로젝트에 포함하는 방법.
이 방법은 솔루션 탐색기 안의 프로젝트를 선택한 후에 마우스 우 클릭 후 '속성'을 선택한다. (단축기 알트+p+p)


위와 같이 링커(Linker)-입력(Input)-추가종속성(Depend Lib?)을 선택 한 후에 안에 아래와 같이 입력한다.
d3dxof.lib dxguid.lib d3d9.lib d3dx9d.lib winmm.lib
일단은.. D3D를 이용한 프로그램은 무조건 필요하다고 생각하고 넣어주기 바란다.
각각의 라이브러리 파일들이 어떤 것 때문에 필요한것인지를 알고 싶다면... 설치된 SDK 안에 문서를 보고 찾아보면 나온다.

* 두번째, 전처리 명령어를 이용하는 방법.
위에서 입력한 라이브러리를 해당소스 파일에다가 이렇게 입력이 가능하다.

이와 같이 모든 라이브러리를 입력해주면... 사용자가 만든 소스를 사용 하는 경우 프로젝트의 속성을 통한 라이브러리를 추가해 줄 필요가 없게 된다.

전처리에 대한 것은 msdn에 자세히 나와 있으니 참조하기 바람.
3. D3D 디바이스 생성하기.

위의 함수 처럼 간단히 3디 객체를 만들고, 그 객체를 통해서 3디 디바이스를 생성한다.
3디 디바이스를 만들때 아래의 구조체를 사용해서, 우리가 원하는 형태의 디바이스를 생성한다.
원형은 아래와 같다. 자세한 설명은 msdn 문서를 참조.

4. 렌더링

이번에는 디바이스를 생성하였으니.. 화면에 보이도록 렌더링을 하는 차례이다.
디바이스가 유효한지 검사한 후에 화면을 지우고, 렌더링을 시작한다. 렌더링이 끝난 후에는 화면에 출력을 한다.

여기서 보면, 후면 버퍼라고 했는데...
일단, Direct 3D는 기본적으로 '더블버퍼링'을 사용한다.

간단하게 예를 들어 이미지를 화면에 출력하는 것을 생각하면...
비트맵을 메모리에 로딩한다. -> 화면에 출력한다.

그런데 만약에 출력해야할 이미지가 한장이 아니고 3장을 동시에 보여줘야 한다면 어떨까?
비트맵을 메모리에 로딩한다. -> 화면에 출력한다. -> 비트맵을 메모리에 로딩한다. -> 화면에 출력한다. -> 비트맵을 메모리에 로딩한다. -> 화면에 출력한다. 내지는...

비트맵을 메모리에 로딩한다. -> 비트맵을 메모리에 로딩한다. -> 비트맵을 메모리에 로딩한다. -> 화면에 출력한다. -> 화면에 출력한다. -> 화면에 출력한다.
이다. 이 과정에서 여러 이미지를 출력해본 경험이 있다면, 화면이 깜빡이는 현상을 느낄 수 있었을 것이다.


원리는 위의 그림과 같다. ( 왼쪽 - 일반 이미지 출력, 오른쪽 - 더블버퍼링을 사용한 출력 )

결론적으로 말하면,
더블버퍼링을 사용 했을 경우... 깜빡이는 현상을 없앨 수 있다는 이점을 가지고 올 수 있다.

렌더링을 할 경우, 반드시 BeginScene() 과 EndScene() 안에서 작업을 끝내야한다.
예를 들어서 텍스처(이미지)를 화면에 출력 하고자 하는 과정도 다 위의 함수들 사이에서 끝내야한다.

5. 끝.
지금까지 간단하게... 3디객체를 만들어서 3디 디바이스를 생성하고, 화면을 지우는 것 까지를 해봤는데...
간단하게 보이면서도 무지 복잡해 보이는 작업이다.
사용자를 극히 제한 해버리면, 모르지만... 그렇지 않을 경우, 사용자가 가지고 있는 그래픽 카드에 대해서 가속등등을 지원하는지 안하는지 검사를 하여 그에 맞게 디바이스를 생성해야 하기 때문이다.

6. 사용된 코드 (DXSDK 9.0 튜토리얼 1번코드임)

2006년 초에 다른곳에 썼었던 글을 옮겨온 것임.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/09/18 14:55 2008/09/18 14:55
Wind
프로그래밍/C++ 2008/09/18 14:55

함수 포인터

1. 함수 포인터 선언

리턴값 (함수형태 *변수명) (인자리스트);

 

2. 사용

변수 = 함수;

 

3. 예제

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)

{

    어쩌구...

}

 

요 함수를 함수 포인터로 받아보면...

 

HRESULT (__stdcall *m_DllGetClassObject)(REFCLSID rclsid, REFIID riid, LPVOID *ppv);

 

사용시...

m_DllGetClassObject = DllGetClassObject;

m_DllGetClassObject ( rclsid, riid, ppv );

 

이렇게 사용 하면 됩니다.

원래 STDAPI = extern "C" HRESULT __stdcall 요렇게 정의가 되어 있는데...

위에서 사용 한것은.. 제가 클래스 내부에서 사용했던 예를 그대로 가지고 왔기 때문에 extern "C" 요것은 빼 버렸음.

그냥 쓴다고 해도... extern "C" 이것은 함수포인터 사용 할때 필요가 없어보임.

틀린거 있으면.. 리플 달아주세요.^^

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/09/18 14:50 2008/09/18 14:50
Wind
프로그래밍/C++ 2008/09/18 14:50
Powerd by Textcube, designed by criuce
rss