[GWork,SDL2] 컨트롤이 안보이는 clip 오류 해결하기

샘플 붉은색으로 렌더링 되던 것을 텍스쳐만 제대로 읽어와서 출력하기만 고친 상태였습니다. 즉, 아래와 같은 상태였는데요


이게 클립핑이 제대로 계산이 안되서 발생하는 이슈였습니다. 실제로 GWork의 SDL2.cpp 소스를 보면

void SDL2::StartClip()
{
    const Gwk::Rect &rect = ClipRegion();

    int w, h;
    SDL_GetRendererOutputSize(SDL_GetRenderer(m_window), &w, &h);

    // Something wrong with clip rectangles in SDL2?
    // https://bugzilla.libsdl.org/show_bug.cgi?id=2700
    // =>   clip.y = screenHieght - clip.y - clip.h;
    const SDL_Rect clip = { rect.x, h - rect.y - rect.h, rect.w, rect.h };

    SDL_RenderSetClipRect(m_renderer, &clip);
}

이렇게 수정의 흔적이 있습니다. 하지만 SDL2도 최신이고 GWork의 소스도 최신인데 수정을 한 부분이 제대로 작동하고 있지 않더군요. 암만봐도 clip 영역 계산이 이상해서 임의로 SDL2::StartClip와 SDL2::EndClip에 return; 처리해서 클립을 처리 안하게 해봤습니다.

void SDL2::StartClip()
{
    return; //not clip
    const Gwk::Rect &rect = ClipRegion();

    int w, h;
    SDL_GetRendererOutputSize(SDL_GetRenderer(m_window), &w, &h);

    // Something wrong with clip rectangles in SDL2?
    // https://bugzilla.libsdl.org/show_bug.cgi?id=2700
    // =>   clip.y = screenHieght - clip.y - clip.h;
    const SDL_Rect clip = { rect.x, h - rect.y - rect.h, rect.w, rect.h };

    SDL_RenderSetClipRect(m_renderer, &clip);
}

void SDL2::EndClip()
{
    return; //not clip
    SDL_RenderSetClipRect(m_renderer, 0);
}


그랬더니 오호라 제대로? 나오긴 합니다. 다만 클립핑 처리를 하지 않아 영역 이외의 부분도 렌더가 되어지고 있네요. 조금 더 파봤습니다. 기존에 수정한다고 되어있던 클립핑 영역 계산은 이상해서 주석걸고 일단 기본적인 클립핑 처리로 해봤습니다.

void SDL2::StartClip()
{
    const Gwk::Rect &rect = ClipRegion();
    const SDL_Rect clip = { rect.x, rect.y, rect.w,rect.h };
    //const Gwk::Rect &rect = ClipRegion();

    //int w, h;
    //SDL_GetRendererOutputSize(SDL_GetRenderer(m_window), &w, &h);

    //// Something wrong with clip rectangles in SDL2?
    //// https://bugzilla.libsdl.org/show_bug.cgi?id=2700
    //// =>   clip.y = screenHieght - clip.y - clip.h;
    //const SDL_Rect clip = { rect.x, h - rect.y - rect.h, rect.w, rect.h };

    SDL_RenderSetClipRect(m_renderer, &clip);
}

void SDL2::EndClip()
{
    SDL_RenderSetClipRect(m_renderer, 0);
}



아주 잘 됩니다. ㅎㅎ



폰트를 나눔고딕으로 해주니 한글도 출력이 잘 되어지고 있네요. 이제 저희 프로젝트에 연동 할 일만 남았는데, 단순 UI만 포팅이 아닌 폰트랑 Input쪽도 엮여있어서 한번에 UI + Font + Input을 다 포팅 해야하는 건 함정.

관련 내용은 제가 직접 이슈 질문 올리고 직접 답변한 이곳에서 확인 가능합니다. GWork 깃헙에 pull request를 한건 아니지만 어쨌든 약간의 기여는 한 느낌? 풀 리퀘스트 해볼까나?


댓글

  1. 좋은 글 감사드립니다. 덕분에 고생하지 않고 GWork를 빌드했습니다.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

크로스 스레드 작업이 잘못되었습니다. xxx 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다