Modulasi Warna

Kita bisa mengubah kecerahan warna berdasarkan nilai R, G dan B yang dimiliki suatu warna dalam gambar yang akan kita tampilkan. Untuk mengubah warna dari texture, kita bisa menggunakan SDL_SetTextureColorMod. Jika kita menggunakan surface, yang kita gunakan adalah SDL_SetSurfaceColorMod.
  • int SDL_SetSurfaceColorMod (SDL_Surface* surface, Uint8 r, Uint8 g, Uint8 b);
  • int SDL_SetTextureColorMod (SDL_Texture* texture, Uint8 r, Uint8 g, Uint8 b);
Kali ini, saya akan pakai gambar di bawah ini sebagai contoh untuk mempermudah kalian melihat warna apa saja yang berubah.
Kalau sudah disiapkan gambarnya, sekarang kita langsung lanjut ke kode programnya. Nama gambarnya coba kalian perkirakan sendiri dari kode program berikut ini. Kalau programnya tidak menampilkan gambar atau error, artinya kalian belum meletakkan gambar yang diperlukan di folder project atau program kalian. Kalau kalian sudah paham function mana yang digunakan untuk memuat gambar dan parameter-parameternya, seharusnya kalian tahu nama file gambar yang kalian perlukan.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 && IMG_Init(IMG_INIT_JPG|IMG_INIT_PNG)){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            SDL_Renderer *trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

            SDL_Surface *tmp=IMG_Load("Codelogi.png");

            if(tmp){
                int panjang=tmp->w;
                int tinggi=tmp->h;
                SDL_Texture *bmp=SDL_CreateTextureFromSurface(trender, tmp);
                SDL_FreeSurface(tmp);

                if(bmp){
                    SDL_Rect rct;
                    while(evt.type!=SDL_QUIT){
                        while(SDL_PollEvent(&evt)){
                            if(evt.type==SDL_KEYDOWN){
                                switch(evt.key.keysym.sym){
                                    case SDLK_q:
                                        SDL_SetTextureColorMod(bmp, 255, 128, 255);
                                        break;
                                    case SDLK_w:
                                        SDL_SetTextureColorMod(bmp, 255, 255, 128);
                                        break;
                                    case SDLK_e:
                                        SDL_SetTextureColorMod(bmp, 128, 255, 255);
                                        break;
                                    case SDLK_r:
                                        SDL_SetTextureColorMod(bmp, 128, 128, 128);
                                        break;
                                    case SDLK_a:
                                        SDL_SetTextureColorMod(bmp, 255, 128, 128);
                                        break;
                                    case SDLK_s:
                                        SDL_SetTextureColorMod(bmp, 128, 255, 128);
                                        break;
                                    case SDLK_d:
                                        SDL_SetTextureColorMod(bmp, 128, 128, 255);
                                        break;
                                    default:
                                        SDL_SetTextureColorMod(bmp, 255, 255, 255);
                                        break;
                                }
                            }
                        }

                        SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                        SDL_RenderClear(trender);
                        rct.x=0;
                        rct.w=0;
                        rct.w=panjang;
                        rct.h=tinggi;
                        SDL_RenderSetViewport(trender, &rct);

                        SDL_RenderCopy(trender, bmp, NULL, NULL);
                        SDL_RenderPresent(trender);
                    }
                }
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Dalam kode program di atas, saya menggunakan event keyboard. Kalian bisa mencoba menekan tombol q, w, e, r, a, s, d, atau tombol-tombol lain untuk melihat perubahan warna dari gambar. Jika yang kita tekan tombol q, warna hijau tidak akan berubah karena nilai parameter ketiga yang mewakili warna hijau adalah 255. 255 adalah nilai maksimal dari nilai R, G, dan B. Jika kita menggunakan 128, artinya kecerahan dari suatu warna adalah setengahnya.

Selanjutnya, coba tekan tombol lain, dan lihat warna yang tidak berubah!