1 // Copyright (c) 2015 Sergio Gonzalez. All rights reserved. 2 // License: https://github.com/serge-rgb/milton#license 3 4 #pragma once 5 6 #include "common.h" 7 #include "system_includes.h" 8 #include "vector.h" 9 10 struct LayerEffect; 11 12 enum RenderBackendFlags 13 { 14 RenderBackendFlags_NONE = 0, 15 16 RenderBackendFlags_GUI_VISIBLE = 1<<0, 17 }; 18 19 typedef u64 RenderHandle; 20 21 struct Arena; 22 struct RenderBackend; 23 struct ColorPicker; 24 struct RenderBackend; 25 struct CanvasView; 26 struct Exporter; 27 struct Stroke; 28 struct Layer; 29 struct Milton; 30 struct CanvasState; 31 32 RenderBackend* gpu_allocate_render_backend(Arena* arena); 33 34 b32 gpu_init(RenderBackend* renderer, CanvasView* view, ColorPicker* picker); 35 36 37 // Immediate-mode functions 38 void imm_begin_frame(RenderBackend* renderer); 39 void imm_rect(RenderBackend* renderer, float left, float right, float top, float bottom, float line_width); 40 // End of immediate-mode functions 41 42 enum BrushOutlineEnum 43 { 44 BrushOutline_NO_FILL = 1<<0, 45 BrushOutline_FILL = 1<<1, 46 }; 47 void gpu_update_brush_outline(RenderBackend* renderer, i32 cx, i32 cy, i32 radius, 48 BrushOutlineEnum outline_enum = BrushOutline_NO_FILL, 49 v4f color = {}); 50 51 52 53 54 void gpu_resize(RenderBackend* renderer, CanvasView* view); 55 void gpu_update_picker(RenderBackend* renderer, ColorPicker* picker); 56 void gpu_update_scale(RenderBackend* renderer, i32 scale); 57 void gpu_update_export_rect(RenderBackend* renderer, Exporter* exporter); 58 void gpu_update_background(RenderBackend* renderer, v3f background_color); 59 void gpu_update_canvas(RenderBackend* renderer, CanvasState* canvas, CanvasView* view); 60 61 void gpu_get_viewport_limits(RenderBackend* renderer, float* out_viewport_limits); 62 i32 gpu_get_num_clipped_strokes(Layer* root_layer); 63 64 65 enum CookStrokeOpt 66 { 67 CookStroke_NEW = 0, 68 CookStroke_UPDATE_WORKING_STROKE = 1, 69 }; 70 void gpu_reset_stroke(RenderBackend* r, RenderHandle handle); 71 72 void gpu_cook_stroke(Arena* arena, RenderBackend* renderer, Stroke* stroke, 73 CookStrokeOpt cook_option = CookStroke_NEW); 74 75 void gpu_free_strokes(RenderBackend* renderer, CanvasState* canvas); 76 77 78 // Creates OpenGL objects for strokes that are in view but are not loaded on the GPU. Deletes 79 // content for strokes that are far away. 80 enum ClipFlags 81 { 82 ClipFlags_UPDATE_GPU_DATA = 1<<0, // Free all strokes that are far away. 83 ClipFlags_JUST_CLIP = 1<<1, 84 }; 85 void gpu_clip_strokes_and_update(Arena* arena, 86 RenderBackend* renderer, 87 CanvasView* view, i64 render_scale, 88 Layer* root_layer, Stroke* working_stroke, 89 i32 x, i32 y, i32 w, i32 h, ClipFlags flags = ClipFlags_JUST_CLIP); 90 91 void gpu_reset_render_flags(RenderBackend* renderer, int flags); 92 93 void gpu_render(RenderBackend* renderer, i32 view_x, i32 view_y, i32 view_width, i32 view_height); 94 void gpu_render_to_buffer(Milton* milton, u8* buffer, i32 scale, i32 x, i32 y, i32 w, i32 h, f32 background_alpha); 95 96 void gpu_release_data(RenderBackend* renderer); 97 98