| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								--
							 | 
						
						
						
							| 
								
							 | 
							
								--  raylib [textures] example - Image processing
							 | 
						
						
						
							| 
								
							 | 
							
								--
							 | 
						
						
						
							| 
								
							 | 
							
								--  NOTE: Images are loaded in CPU memory (RAM) textures are loaded in GPU memory (VRAM)
							 | 
						
						
						
							| 
								
							 | 
							
								--
							 | 
						
						
						
							| 
								
							 | 
							
								--  This example has been created using raylib 1.6 (www.raylib.com)
							 | 
						
						
						
							| 
								
							 | 
							
								--  raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
							 | 
						
						
						
							| 
								
							 | 
							
								--
							 | 
						
						
						
							| 
								
							 | 
							
								--  Copyright (c) 2014-2016 Ramon Santamaria (@raysan5)
							 | 
						
						
						
							| 
								
							 | 
							
								--
							 | 
						
						
						
							| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								--#include <stdlib.h>     -- Required for: free()
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								NUM_PROCESSES = 8
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								-- enum ImageProcess
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_NONE = 1
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_GRAYSCALE = 2
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_TINT = 3
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_INVERT = 4
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_CONTRAST = 5
							 | 
						
						
						
							| 
								
							 | 
							
								local COLOR_BRIGHTNESS = 6
							 | 
						
						
						
							| 
								
							 | 
							
								local FLIP_VERTICAL = 7
							 | 
						
						
						
							| 
								
							 | 
							
								local FLIP_HORIZONTAL = 8
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								local processText = {
							 | 
						
						
						
							| 
								
							 | 
							
								    "NO PROCESSING",
							 | 
						
						
						
							| 
								
							 | 
							
								    "COLOR GRAYSCALE",
							 | 
						
						
						
							| 
								
							 | 
							
								    "COLOR TINT",
							 | 
						
						
						
							| 
								
							 | 
							
								    "COLOR INVERT",
							 | 
						
						
						
							| 
								
							 | 
							
								    "COLOR CONTRAST",
							 | 
						
						
						
							| 
								
							 | 
							
								    "COLOR BRIGHTNESS",
							 | 
						
						
						
							| 
								
							 | 
							
								    "FLIP VERTICAL",
							 | 
						
						
						
							| 
								
							 | 
							
								    "FLIP HORIZONTAL"
							 | 
						
						
						
							| 
								
							 | 
							
								}
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								-- Initialization
							 | 
						
						
						
							| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								local screenWidth = 800
							 | 
						
						
						
							| 
								
							 | 
							
								local screenHeight = 450
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								InitWindow(screenWidth, screenHeight, "raylib [textures] example - image processing")
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								-- NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								local image = LoadImage("resources/parrots.png")   -- Loaded in CPU memory (RAM)
							 | 
						
						
						
							| 
								
							 | 
							
								image = ImageFormat(image, TextureFormat.UNCOMPRESSED_R8G8B8A8)         -- Format image to RGBA 32bit (required for texture update)
							 | 
						
						
						
							| 
								
							 | 
							
								local texture = LoadTextureFromImage(image)        -- Image converted to texture, GPU memory (VRAM)
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								local currentProcess = COLOR_NONE
							 | 
						
						
						
							| 
								
							 | 
							
								local textureReload = false
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								local selectRecs = {}
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								for i = 1, NUM_PROCESSES do selectRecs[i] = Rectangle(40, 50 + 32*i, 150, 30) end
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								SetTargetFPS(60)
							 | 
						
						
						
							| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								-- Main game loop
							 | 
						
						
						
							| 
								
							 | 
							
								while not WindowShouldClose() do            -- Detect window close button or ESC key
							 | 
						
						
						
							| 
								
							 | 
							
								    -- Update
							 | 
						
						
						
							| 
								
							 | 
							
								    ---------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								    if (IsKeyPressed(KEY.DOWN)) then
							 | 
						
						
						
							| 
								
							 | 
							
								        currentProcess = currentProcess + 1
							 | 
						
						
						
							| 
								
							 | 
							
								        if (currentProcess > NUM_PROCESSES) then currentProcess = 1 end
							 | 
						
						
						
							| 
								
							 | 
							
								        textureReload = true
							 | 
						
						
						
							| 
								
							 | 
							
								    elseif (IsKeyPressed(KEY.UP)) then
							 | 
						
						
						
							| 
								
							 | 
							
								        currentProcess = currentProcess - 1
							 | 
						
						
						
							| 
								
							 | 
							
								        if (currentProcess < 1) then currentProcess = NUM_PROCESSES end
							 | 
						
						
						
							| 
								
							 | 
							
								        textureReload = true
							 | 
						
						
						
							| 
								
							 | 
							
								    end
							 | 
						
						
						
							| 
								
							 | 
							
								    
							 | 
						
						
						
							| 
								
							 | 
							
								    if (textureReload) then
							 | 
						
						
						
							| 
								
							 | 
							
								        UnloadImage(image)                         -- Unload current image data
							 | 
						
						
						
							| 
								
							 | 
							
								        image = LoadImage("resources/parrots.png") -- Re-load image data
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								        -- NOTE: Image processing is a costly CPU process to be done every frame, 
							 | 
						
						
						
							| 
								
							 | 
							
								        -- If image processing is required in a frame-basis, it should be done 
							 | 
						
						
						
							| 
								
							 | 
							
								        -- with a texture and by shaders
							 | 
						
						
						
							| 
								
							 | 
							
								        if (currentProcess == COLOR_GRAYSCALE) then image = ImageColorGrayscale(image)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == COLOR_TINT) then image = ImageColorTint(image, GREEN)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == COLOR_INVERT) then image = ImageColorInvert(image)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == COLOR_CONTRAST) then image = ImageColorContrast(image, -40)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == COLOR_BRIGHTNESS) then image = ImageColorBrightness(image, -80)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == FLIP_VERTICAL) then image = ImageFlipVertical(image)
							 | 
						
						
						
							| 
								
							 | 
							
								        elseif (currentProcess == FLIP_HORIZONTAL) then image = ImageFlipHorizontal(image)
							 | 
						
						
						
							| 
								
							 | 
							
								        end
							 | 
						
						
						
							| 
								
							 | 
							
								        
							 | 
						
						
						
							| 
								
							 | 
							
								        local pixels = {}
							 | 
						
						
						
							| 
								
							 | 
							
								        pixels = GetImageData(image)                -- Get pixel data from image (RGBA 32bit)
							 | 
						
						
						
							| 
								
							 | 
							
								        texture = UpdateTexture(texture, pixels)    -- Update texture with new image data
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								        textureReload = false
							 | 
						
						
						
							| 
								
							 | 
							
								    end
							 | 
						
						
						
							| 
								
							 | 
							
								    ---------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								    -- Draw
							 | 
						
						
						
							| 
								
							 | 
							
								    ---------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								    BeginDrawing()
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								        ClearBackground(RAYWHITE)
							 | 
						
						
						
							| 
								
							 | 
							
								        
							 | 
						
						
						
							| 
								
							 | 
							
								        DrawText("IMAGE PROCESSING:", 40, 30, 10, DARKGRAY)
							 | 
						
						
						
							| 
								
							 | 
							
								        
							 | 
						
						
						
							| 
								
							 | 
							
								        -- Draw rectangles
							 | 
						
						
						
							| 
								
							 | 
							
								        for i = 1, NUM_PROCESSES do
							 | 
						
						
						
							| 
								
							 | 
							
								            if (i == currentProcess) then
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawRectangleRec(selectRecs[i], SKYBLUE)
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawRectangleLines(selectRecs[i].x, selectRecs[i].y, selectRecs[i].width, selectRecs[i].height, BLUE)
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawText(processText[i], selectRecs[i].x + selectRecs[i].width/2 - MeasureText(processText[i], 10)//2, selectRecs[i].y + 11, 10, DARKBLUE)
							 | 
						
						
						
							| 
								
							 | 
							
								            else
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawRectangleRec(selectRecs[i], LIGHTGRAY)
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawRectangleLines(selectRecs[i].x, selectRecs[i].y, selectRecs[i].width, selectRecs[i].height, GRAY)
							 | 
						
						
						
							| 
								
							 | 
							
								                DrawText(processText[i], selectRecs[i].x + selectRecs[i].width/2 - MeasureText(processText[i], 10)//2, selectRecs[i].y + 11, 10, DARKGRAY)
							 | 
						
						
						
							| 
								
							 | 
							
								            end
							 | 
						
						
						
							| 
								
							 | 
							
								        end
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								        DrawTexture(texture, screenWidth - texture.width - 60, screenHeight/2 - texture.height/2, WHITE)
							 | 
						
						
						
							| 
								
							 | 
							
								        DrawRectangleLines(screenWidth - texture.width - 60, screenHeight/2 - texture.height/2, texture.width, texture.height, BLACK)
							 | 
						
						
						
							| 
								
							 | 
							
								        
							 | 
						
						
						
							| 
								
							 | 
							
								    EndDrawing()
							 | 
						
						
						
							| 
								
							 | 
							
								    ---------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								end
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								-- De-Initialization
							 | 
						
						
						
							| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								UnloadTexture(texture)       -- Unload texture from VRAM
							 | 
						
						
						
							| 
								
							 | 
							
								UnloadImage(image)           -- Unload image from RAM
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								CloseWindow()                -- Close window and OpenGL context
							 | 
						
						
						
							| 
								
							 | 
							
								-------------------------------------------------------------------------------------------
							 |