src/text.c

changeset 89
e1f682a8a145
parent 82
4e1e698f4b0d
child 92
78ce93fb46e5
equal deleted inserted replaced
88:6234b7ea48f3 89:e1f682a8a145
27 27
28 #include "ascension/context.h" 28 #include "ascension/context.h"
29 #include "ascension/error.h" 29 #include "ascension/error.h"
30 #include "ascension/ui/text.h" 30 #include "ascension/ui/text.h"
31 31
32 #include <assert.h>
32 #include <cx/printf.h> 33 #include <cx/printf.h>
33 34
34 #include <GL/glew.h> 35 #include <GL/glew.h>
35 36
36 static void asc_text_update(AscSceneNode *node) { 37 static void asc_text_update(AscSceneNode *node) {
37 AscSprite *sprite = (AscSprite*) node; 38 AscSprite *sprite = (AscSprite*) node;
38 AscText *text = (AscText*) node; 39 AscText *text = (AscText*) node;
39
40 // Generate new texture, if required
41 if (asc_texture_uninitialized(&sprite->tex)) {
42 asc_texture_init_rectangle(&sprite->tex);
43 }
44 40
45 // Render text onto a surface 41 // Render text onto a surface
46 TTF_Font *font = asc_font_load(text->font); 42 TTF_Font *font = asc_font_load(text->font);
47 static int alignments[] = { 43 static int alignments[] = {
48 TTF_WRAPPED_ALIGN_LEFT, 44 TTF_WRAPPED_ALIGN_LEFT,
65 asc_set_position2d(node, pos.x + text->offx - newoffx, pos.y); 61 asc_set_position2d(node, pos.x + text->offx - newoffx, pos.y);
66 text->offx = newoffx; 62 text->offx = newoffx;
67 } 63 }
68 64
69 // Transfer Image Data 65 // Transfer Image Data
70 asc_texture_from_surface(&sprite->tex, surface); 66 asc_texture_from_surface(sprite->texture, surface);
71 67
72 // Free the surface 68 // Free the surface
73 SDL_FreeSurface(surface); 69 SDL_FreeSurface(surface);
74 } 70 }
75 71
76 static void asc_text_free(AscSceneNode *node) { 72 static void asc_text_free(AscSceneNode *node) {
77 AscText *text = (AscText*) node; 73 AscText *text = (AscText*) node;
78 AscSprite *sprite = (AscSprite*) node; 74 AscSprite *sprite = (AscSprite*) node;
79 asc_texture_destroy(&sprite->tex); 75 asc_texture_destroy(sprite->texture, 1);
76 assert(sprite->texture->refcount == 0);
77 free(sprite->texture);
80 cx_strfree(&text->text); 78 cx_strfree(&text->text);
81 free(node); 79 free(node);
82 } 80 }
83 81
84 AscSceneNode *asc_text_create(struct asc_text_create_args args) { 82 AscSceneNode *asc_text_create(struct asc_text_create_args args) {
100 } else { 98 } else {
101 text->text = cx_mutstr(strdup(args.text)); 99 text->text = cx_mutstr(strdup(args.text));
102 } 100 }
103 101
104 // initialize 102 // initialize
103 text->base.texture = malloc(sizeof(AscTexture));
104 asc_texture_init_rectangle(text->base.texture, 1);
105 asc_text_update(node); 105 asc_text_update(node);
106 106
107 return node; 107 return node;
108 } 108 }
109 109

mercurial