init
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					repico
 | 
				
			||||||
 | 
					ols.json
 | 
				
			||||||
							
								
								
									
										171
									
								
								main.odin
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								main.odin
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "core:fmt"
 | 
				
			||||||
 | 
					import rl "vendor:raylib"
 | 
				
			||||||
 | 
					import "core:mem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					W :: 400
 | 
				
			||||||
 | 
					H :: 300
 | 
				
			||||||
 | 
					CW :: 160
 | 
				
			||||||
 | 
					CH :: 205
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					width : int = W
 | 
				
			||||||
 | 
					height : int = H
 | 
				
			||||||
 | 
					zoom : int = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Cart :: struct {
 | 
				
			||||||
 | 
						image : rl.Image,
 | 
				
			||||||
 | 
						texture : rl.Texture,
 | 
				
			||||||
 | 
						loaded : bool,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WrongSizeErrorTimer : i32 = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :: proc() {
 | 
				
			||||||
 | 
						when ODIN_DEBUG {
 | 
				
			||||||
 | 
							track : mem.Tracking_Allocator
 | 
				
			||||||
 | 
							mem.tracking_allocator_init(&track, context.allocator)
 | 
				
			||||||
 | 
							context.allocator = mem.tracking_allocator(&track)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							defer {
 | 
				
			||||||
 | 
								if len(track.allocation_map) > 0 {
 | 
				
			||||||
 | 
									fmt.eprintf("=== %v allocations not freed: ===\n", len(track.allocation_map))
 | 
				
			||||||
 | 
									for _, entry in track.allocation_map {
 | 
				
			||||||
 | 
										fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if len(track.bad_free_array) > 0 {
 | 
				
			||||||
 | 
									fmt.eprintf("=== %v incorrect frees: ===\n", len(track.bad_free_array))
 | 
				
			||||||
 | 
									for entry in track.bad_free_array {
 | 
				
			||||||
 | 
										fmt.eprintf("- %p @ %v\n", entry.memory, entry.location)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								mem.tracking_allocator_destroy(&track)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						cart := Cart{}
 | 
				
			||||||
 | 
						target := Cart{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl.InitWindow(W, H, "PicoRepico")
 | 
				
			||||||
 | 
						rl.SetTargetFPS(60)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hw : f32 = auto_cast width / 2
 | 
				
			||||||
 | 
						hh : f32 = auto_cast height / 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buttonCartRect := rl.Rectangle{
 | 
				
			||||||
 | 
							x = hw - CW - 20,
 | 
				
			||||||
 | 
							y = 8,
 | 
				
			||||||
 | 
							width = CW,
 | 
				
			||||||
 | 
							height = CH,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buttonTargetRect := rl.Rectangle{
 | 
				
			||||||
 | 
							x = hw + 20,
 | 
				
			||||||
 | 
							y = 8,
 | 
				
			||||||
 | 
							width = CW,
 | 
				
			||||||
 | 
							height = CH,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						convertButtonRect := rl.Rectangle{
 | 
				
			||||||
 | 
							x = hw - 40,
 | 
				
			||||||
 | 
							y = auto_cast height - 38,
 | 
				
			||||||
 | 
							width = 80,
 | 
				
			||||||
 | 
							height = 30,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for !rl.WindowShouldClose() {
 | 
				
			||||||
 | 
							if WrongSizeErrorTimer > 0 {
 | 
				
			||||||
 | 
								WrongSizeErrorTimer -= 1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mouse := rl.GetMousePosition()
 | 
				
			||||||
 | 
							if rl.IsFileDropped() {
 | 
				
			||||||
 | 
								droppedFiles := rl.LoadDroppedFiles()
 | 
				
			||||||
 | 
								defer rl.UnloadDroppedFiles(droppedFiles)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if droppedFiles.count == 1 {
 | 
				
			||||||
 | 
									f := droppedFiles.paths[0]
 | 
				
			||||||
 | 
									if mouse.x <= hw {
 | 
				
			||||||
 | 
										fmt.println("Got cart file: ", f)
 | 
				
			||||||
 | 
										if loadCart(&cart, f) == .Wrong_Size {
 | 
				
			||||||
 | 
											WrongSizeErrorTimer = 180
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if mouse.x > hw {
 | 
				
			||||||
 | 
										fmt.println("Got target file: ", f)
 | 
				
			||||||
 | 
										if loadCart(&target, f) == .Wrong_Size {
 | 
				
			||||||
 | 
											WrongSizeErrorTimer = 180
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							rl.BeginDrawing()
 | 
				
			||||||
 | 
							rl.GuiDummyRec(rl.Rectangle{0, 0, auto_cast width, auto_cast height}, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							rl.GuiButton(buttonCartRect, "Place here cart")
 | 
				
			||||||
 | 
							rl.GuiButton(buttonTargetRect, "Place here target")
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if WrongSizeErrorTimer > 0 {
 | 
				
			||||||
 | 
								rl.GuiLabel(rl.Rectangle{8, auto_cast height - 38, 100, 30}, "WRONG IMAGE SIZE")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if cart.loaded {
 | 
				
			||||||
 | 
								rl.DrawTexture(cart.texture, auto_cast buttonCartRect.x, auto_cast buttonCartRect.y, rl.WHITE)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if target.loaded {
 | 
				
			||||||
 | 
								rl.DrawTexture(target.texture, auto_cast buttonTargetRect.x, auto_cast buttonTargetRect.y, rl.WHITE)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if rl.GuiButton(convertButtonRect, "CONVERT!") { convertCart(&cart, &target) }
 | 
				
			||||||
 | 
							rl.EndDrawing()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unloadCart(&cart)
 | 
				
			||||||
 | 
						unloadCart(&target)
 | 
				
			||||||
 | 
					} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CartLoadError :: enum {
 | 
				
			||||||
 | 
						None,
 | 
				
			||||||
 | 
						Wrong_Size,
 | 
				
			||||||
 | 
						Allocation_Error,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loadCart :: proc(target: ^Cart, filename: cstring) -> CartLoadError {
 | 
				
			||||||
 | 
						unloadCart(target)
 | 
				
			||||||
 | 
						target.image = rl.LoadImage(filename)
 | 
				
			||||||
 | 
						if target.image.width != CW || target.image.height != CH {
 | 
				
			||||||
 | 
							return CartLoadError.Wrong_Size
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						target.texture = rl.LoadTextureFromImage(target.image)
 | 
				
			||||||
 | 
						target.loaded = true
 | 
				
			||||||
 | 
						return CartLoadError.None
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unloadCart :: proc(target: ^Cart) {
 | 
				
			||||||
 | 
						if target.loaded {
 | 
				
			||||||
 | 
							rl.UnloadTexture(target.texture)
 | 
				
			||||||
 | 
							rl.MemFree(target.image.data)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						target.loaded = false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					convertCart :: proc(cart: ^Cart, target: ^Cart) {
 | 
				
			||||||
 | 
						newCartImage := rl.ImageCopy(target.image)
 | 
				
			||||||
 | 
						for x : i32 = 0; x < newCartImage.width; x += 1 {
 | 
				
			||||||
 | 
							for y : i32 = 0; y < newCartImage.height; y += 1{
 | 
				
			||||||
 | 
								targetCol := rl.GetImageColor(target.image, x, y)
 | 
				
			||||||
 | 
								sourceCol := rl.GetImageColor(cart.image, x, y)
 | 
				
			||||||
 | 
								newCol := rl.Color{
 | 
				
			||||||
 | 
									targetCol.r & 0b11111100 | sourceCol.r & 0b00000011,
 | 
				
			||||||
 | 
									targetCol.g & 0b11111100 | sourceCol.g & 0b00000011,
 | 
				
			||||||
 | 
									targetCol.b & 0b11111100 | sourceCol.b & 0b00000011,
 | 
				
			||||||
 | 
									targetCol.a & 0b11111100 | sourceCol.a & 0b00000011,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								rl.ImageDrawPixel(&newCartImage, x, y, newCol)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl.ExportImage(newCartImage, "output.p8.png")
 | 
				
			||||||
 | 
						fmt.println("DONE!")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user