From 9f21da385b7cdb222f226b9d5d22ef0c75154b24 Mon Sep 17 00:00:00 2001 From: Giulio De Stasio Date: Tue, 17 Jan 2023 13:57:21 +0100 Subject: [PATCH] graphics: sdl2:rects freed after use --- graphics/render.lisp | 3 ++- graphics/text-rendering.lisp | 10 ++++++--- graphics/view.lisp | 53 +++++++++++++++++++++----------------------- layers/screens.lisp | 29 ++++++++++++++++++++++-- 4 files changed, 61 insertions(+), 34 deletions(-) diff --git a/graphics/render.lisp b/graphics/render.lisp index dcd34f4..503a99b 100644 --- a/graphics/render.lisp +++ b/graphics/render.lisp @@ -68,6 +68,7 @@ to render locally use sdl2:set-render-target before calling this macro." :do (when (displayp entity) (sdl2:render-copy ,renderer (texture entity) :source-rect (screen-source entity) - :dest-rect (screen-destination entity ,plane)))))) + :dest-rect (screen-destination entity ,plane)) + )))) ;; NOTE: test if it is necessary to create render-plane-without-contents diff --git a/graphics/text-rendering.lisp b/graphics/text-rendering.lisp index 399175e..6d03125 100644 --- a/graphics/text-rendering.lisp +++ b/graphics/text-rendering.lisp @@ -32,6 +32,10 @@ `(let ((value-indexes (tr-parse-string ,value))) (loop :for character :in value-indexes :for character-position :from 0 :to (length value-indexes) - :do (sdl2:render-copy ,renderer *tr-texture* - :source-rect (sdl2:make-rect (* character 60) 0 60 130) - :dest-rect (sdl2:make-rect (+ ,x (* character-position ,width)) ,y ,width ,height))))) + :do (let ((source-rectangle (sdl2:make-rect (* character 60) 0 60 130)) + (destination-rectangle (sdl2:make-rect (+ ,x (* character-position ,width)) ,y ,width ,height))) + (sdl2:render-copy ,renderer *tr-texture* + :source-rect source-rectangle + :dest-rect destination-rectangle) + (sdl2:free-rect source-rectangle) + (sdl2:free-rect destination-rectangle))))) diff --git a/graphics/view.lisp b/graphics/view.lisp index 4303e4a..49650be 100644 --- a/graphics/view.lisp +++ b/graphics/view.lisp @@ -46,7 +46,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo (sdl2:with-init (:video) (with-playground (window *renderer* :title title) (setf *tr-texture* (let* ((font (sdl2-ttf:open-font "media/IBMPlex.ttf" 100)) ;; FIXME: this crashes the program under windows, throws error on linux but works anyway - (font-surface (sdl2-ttf:render-text-solid font *tr-string* 0 0 0 0)) + (font-surface (sdl2-ttf:render-utf8-solid font *tr-string* 0 0 0 0)) (font-texture (sdl2:create-texture-from-surface *renderer* font-surface))) (sdl2:free-surface font-surface) font-texture)) @@ -58,8 +58,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo 2 (width +plane+) (height +plane+)))) (sdl2:with-event-loop (:method :poll) (:quit () t) - (:keydown (:keysym keysym) - (declare (ignore keysym)) + (:keydown () ;; FIXME: incorporate into input.lisp. check for input every now and then outside keydown (when (sdl2:keyboard-state-p :scancode-up) (setf (cdr *viewpoint-offset*) (+ (cdr *viewpoint-offset*) 10))) (when (sdl2:keyboard-state-p :scancode-down) (setf (cdr *viewpoint-offset*) (+ (cdr *viewpoint-offset*) -10))) @@ -68,7 +67,7 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo (when (sdl2:keyboard-state-p :scancode-p) (setf *viewpoint-zoom* (+ *viewpoint-zoom* 0.2))) ; FIXME: find the scancode for the plus sign (when (sdl2:keyboard-state-p :scancode-m) (setf *viewpoint-zoom* (+ *viewpoint-zoom* -0.2))) ) - (:mousebuttondown (:x x :y y :state state) + (:mousebuttondown () (setf *is-mouse-hold* t) ) (:mousebuttonup () @@ -99,7 +98,6 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo (multiple-value-bind (x y) (sdl2:mouse-state) (setf *mouse-position* (cons x y))) ;; mouse-holding-event - ;; FIXME: absolutely horrible. to be moved inside input.lisp for better functionalities (when *is-mouse-hold* (loop :for action :in (mouse-actions *mouse-keybinds*) :do (when action (eval (car action))) ; FIXME: replace eval with a more safer DSL eval @@ -113,37 +111,36 @@ DEBUG-INFO can be used to display the content on screen for test and debug purpo (sdl2:render-clear *renderer*) ;; local viewpoint + ;; NOTE: generalize (sdl2:set-render-target *renderer* viewpoint-texture) (sdl2:render-clear *renderer*) (render-plane-and-contents *renderer* +plane+) - ;; NOTE: grid-render supports multiple colors for grids - (grid-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*) - (floor (* (width +plane+) *viewpoint-zoom*)) - (floor (* (height +plane+) *viewpoint-zoom*))) - (indexes-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*) - (floor (* (width +plane+) *viewpoint-zoom*)) - (floor (* (height +plane+) *viewpoint-zoom*))) + (when *is-grid* + (grid-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*) + (floor (* (width +plane+) *viewpoint-zoom*)) + (floor (* (height +plane+) *viewpoint-zoom*)))) + (when *is-indexes* + (indexes-render *renderer* +plane+ (car *viewpoint-offset*) (cdr *viewpoint-offset*) + (floor (* (width +plane+) *viewpoint-zoom*)) + (floor (* (height +plane+) *viewpoint-zoom*)))) + (sdl2:set-render-draw-color *renderer* 0 255 0 155) + (sdl2:set-render-draw-color *renderer* 0 0 0 255) (sdl2:set-render-target *renderer* window-texture) - (sdl2:render-copy *renderer* viewpoint-texture - :source-rect nil - :dest-rect (sdl2:make-rect (car *viewpoint-offset*) - (cdr *viewpoint-offset*) - (floor (* (width +plane+) *viewpoint-zoom*)) ; NOTE: hardcoded to +plane+, change to dynamic - (floor (* (height +plane+) *viewpoint-zoom*))) - ) - ;; Grid creation - ;; NOTE: grid creation should be done before, so to render on global, but it should be limited with actual viewpoint restrictions - ;; to reduce cycles - ;; (when *is-grid* - ;; (grid-render *renderer* +plane+)) - ;; Indexes creation - ;; (when *is-indexes* - ;; (indexes-render *renderer* +plane+)) + (let ((viewpoint-rectangle (sdl2:make-rect (car *viewpoint-offset*) + (cdr *viewpoint-offset*) + (floor (* (width +plane+) *viewpoint-zoom*)) ; NOTE: hardcoded +plane+ usage + (floor (* (height +plane+) *viewpoint-zoom*))))) + (sdl2:render-copy *renderer* viewpoint-texture + :source-rect nil + :dest-rect viewpoint-rectangle) + (sdl2:free-rect viewpoint-rectangle)) + ;; pointer section (when *pointer* (sdl2:set-render-draw-color *renderer* 128 250 33 255) (let ((select-rectangle (screen-destination (nth *pointer* (entities-list +plane+)) +plane+))) - (sdl2:render-draw-rect *renderer* select-rectangle)) + (sdl2:render-draw-rect *renderer* select-rectangle) + (sdl2:free-rect select-rectangle)) ) ;; entries generation ;; (loop :for entry :in (reverse *entries-list*) diff --git a/layers/screens.lisp b/layers/screens.lisp index 6129bf4..c2ccb27 100644 --- a/layers/screens.lisp +++ b/layers/screens.lisp @@ -59,6 +59,12 @@ where the screen should be displayed")) (path :accessor image-path :initarg :image :initform (merge-pathnames parameters:*rulp-share* "test.png")) + (s-rect :initform nil + :documentation "this value contains the source rectangle to be used, don't +interact directly with this but use screen-source instead") + (d-rect :initform nil + :documentation "this value contains the destination rectangle to be used, don't +interact directly with this but use screen-destination instead") )) ;; Real space is the pixel grid of the screen, a position of (6 . 7) means @@ -100,9 +106,28 @@ where the screen should be displayed")) "return the source rectangle, the portion of texture to display (standard all)" nil) +;; FIXME: save and use the make-rect. destroy and create a new one when +;; info don't match +;; (defmethod screen-destination ((s screen) (p t)) +;; "Without a plane of reference screens are printed full size offset of x and y +;; pixels from the upper left angle of the window" +;; (let ((rect (slot-value s 'd-rect))) +;; (if (and +;; rect +;; (equal (x s) (sdl2:rect-x rect)) +;; (equal (y s) (sdl2:rect-y rect)) +;; (equal (width s) (sdl2:rect-width rect)) +;; (equal (height s) (sdl2:rect-height rect))) +;; (rect) +;; (progn (sdl2:free-rect (slot-value s 'd-rect)) +;; (sdl2:make-rect (x s) (y s) (width s) (height s))) +;; )) +;; ) + +;; FIXME: find a way to store rectangles to later use (defmethod screen-destination ((s screen) (p t)) - "Without a plane of reference screens are printed full size offset of x and y -pixels from the upper left angle of the window" + "without a plane of reference, a screen is just printed full size from the +top left of the window" (sdl2:make-rect (x s) (y s) (width s) (height s)) ) -- 2.11.0