| 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) { |