`t_image *init_image(void *mlx)` 함수는 MiniLibX 라이브러리를 사용하여 새로운 이미지 객체를 초기화하는 역할을 합니다. 이 함수는 메모리에 새로운 이미지를 생성하고, 이미지의 메모리 주소와 관련된 정보를 설정합니다.
### 함수 설명
1. **메모리 할당**:
```c
image = malloc(sizeof(t_image));
```
- `t_image` 구조체를 위한 메모리를 할당합니다. 만약 메모리 할당에 실패하면 `NULL`을 반환합니다.
2. **이미지 생성**:
```c
image->image = mlx_new_image(mlx, WINDOW_WIDTH, WINDOW_HEIGHT);
```
- `mlx_new_image` 함수를 사용하여 지정된 너비와 높이의 새로운 이미지를 생성합니다. 이 함수는 이미지의 식별자를 반환하며, 이후 이미지 조작에 사용됩니다.
3. **이미지 데이터 주소 가져오기**:
```c
image->buffer = mlx_get_data_addr(image->image, &image->pixel_bits, \
&image->line_bytes, &image->endian);
```
- `mlx_get_data_addr` 함수는 생성된 이미지의 메모리 주소를 가져옵니다. 이 함수는 이미지의 각 픽셀에 대한 정보를 설정합니다:
- `image->buffer`: 이미지의 시작 메모리 주소.
- `image->pixel_bits`: 각 픽셀에 사용되는 비트 수.
- `image->line_bytes`: 이미지의 한 줄에 사용되는 바이트 수.
- `image->endian`: 바이트 순서(endianess) 정보.
4. **기타 초기화**:
```c
image->line = NULL;
```
- `image->line` 필드는 현재 NULL로 초기화되며, 이후에 선 그리기와 같은 기능에서 사용될 수 있습니다.
### `&`를 붙이는 이유
`mlx_get_data_addr` 함수는 `bits_per_pixel`, `line_length`, `endian`의 주소를 인자로 받습니다. 이는 MiniLibX가 이 함수를 호출할 때, 해당 변수의 값을 설정하도록 하기 위함입니다.
- **Call by Reference**: C 언어에서 함수에 변수의 주소를 전달하면, 함수 내에서 해당 변수의 값을 변경할 수 있습니다. 이는 "Call by Reference"라고 불리며, 함수가 호출된 후에도 변수의 값이 유지됩니다.
- **변수 주소 전달**: `&image->pixel_bits`, `&image->line_bytes`, `&image->endian`과 같이 변수의 주소를 전달하면, `mlx_get_data_addr` 함수가 이 변수들의 값을 설정할 수 있습니다.
예를 들어, `image->pixel_bits`는 함수 호출 후에 각 픽셀에 사용되는 비트 수로 설정됩니다. 이를 통해 이후에 픽셀 색상을 설정할 때 정확한 비트 수를 사용할 수 있습니다.
### 예시 코드
```c
int main(void)
{
void *mlx;
t_image image;
mlx = mlx_init();
image.image = mlx_new_image(mlx, 1920, 1080);
image.buffer = mlx_get_data_addr(image.image, &image.pixel_bits, &image.line_bytes, &image.endian);
// 이후 이미지 조작 코드...
return (0);
}
```
이 코드는 이미지의 메모리 주소와 관련된 정보를 설정하는 예시입니다. `mlx_get_data_addr` 함수를 호출하여 이미지의 각 픽셀에 대한 정보를 설정합니다.
Citations:
[1] https://love-every-moment.tistory.com/62
[2] https://80000coding.oopy.io/adf8b9d2-475e-4bda-91a2-1d03df9e0d31
[3] https://rrddo.tistory.com/196
[4] https://42kchoi.tistory.com/229
[5] https://velog.io/@sham/miniRT-1-mlxMiniLibX-%EB%90%98%EB%8F%8C%EC%95%84%EB%B3%B4%EA%B8%B0
[6] https://malbongcode.tistory.com/149
[7] https://velog.io/@parksj3205/miniLibX%EB%A1%9C-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%83%9D%EC%84%B1%EA%B3%BC-%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%8F%84%ED%98%95-%EA%B7%B8%EB%A6%AC%EA%B8%B0
[8] https://github.com/psj3205/MiniLibX_man_kor/blob/main/mlx_new_image.md
'C Language' 카테고리의 다른 글
get_next_line 간단 구현 (0) | 2025.02.21 |
---|---|
printf 함수 간단 구현 (0) | 2025.02.21 |
3D 표현에서 x,y 값과 z값의 의미 (0) | 2025.02.17 |
3D 축 기준 회전 공식 (0) | 2025.02.07 |
2차원 배열을 사용한 3차원 표현방법 (0) | 2025.02.06 |