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