OSDN Git Service

cache
[psychlops/cpp.git] / psychlops / platform / gl / psychlops_g_cache.cpp
1 #include <vector>\r
2 #include <string>
3 \r
4 #if defined(__APPLE__)\r
5 #include <OpenGL/gl.h>
6 #else\r
7 #include <windows.h>
8 #include <gl/gl.h>
9 #endif\r
10 \r
11 #include "psychlops_g_cache.h"\r
12 \r
13 namespace Psychlops {\r
14 namespace Utilities {\r
15 \r
16 \r
17         ////////        TextCacheAllocation     ////////\r
18         CacheOnImage::CacheOnImage() {  }\r
19         CacheOnImage::~CacheOnImage() { uncache(); }\r
20         void CacheOnImage::dirty() { dirty_ = true; }\r
21         void CacheOnImage::uncache()\r
22         {\r
23                 img.release();\r
24         }\r
25         void CacheOnImage::draw(\r
26                 Letters &drawee, const double xx, const double yy,\r
27                 const double r, const double g, const double b, const double a,\r
28                 const int horiz_align, const int vertical_align, const double max_width, Drawable &outer)\r
29         {\r
30                 const int anchor = horiz_align, vertical_anchor = vertical_align;\r
31                 double mx = xx, my = yy;\r
32                 //double mx = drawee.getDatum().x, my = drawee.getDatum().y;\r
33 \r
34                 double w_ratio = 1.0;\r
35                 if(drawee._zoom_cache) { w_ratio = drawee.font.size/font_size; img._zoom_(100.0*w_ratio); }\r
36 \r
37                 double x, y;\r
38                 switch(anchor) {\r
39                         case Letters::TEXT_ALIGN_CENTER:\r
40                                 x = mx - img.getWidth() * w_ratio / 2;\r
41                                 break;\r
42                         case Letters::TEXT_ALIGN_RIGHT:\r
43                                 x = mx - img.getWidth() * w_ratio;\r
44                                 break;\r
45                         case Letters::NOT_SPECIFIED:\r
46                         case Letters::TEXT_ALIGN_LEFT:\r
47                         default:\r
48                                 x = mx;\r
49                                 break;\r
50                 }\r
51                 switch(vertical_anchor) {\r
52                         case Letters::TEXT_ALIGN_MIDDLE:\r
53                                 y = my;\r
54                                 img.centering(x, y);\r
55                                 break;\r
56                         case Letters::TEXT_ALIGN_TOP:\r
57                                 y = my;\r
58                                 img.move_to(x, y);\r
59                                 break;\r
60                         default:\r
61                                 y = my - drawee.font.size;\r
62                                 img.move_to(x, y);\r
63                                 break;\r
64                 }\r
65                 //img.draw(outer);\r
66 \r
67 \r
68                 Color col(r,g,b,a);\r
69                 Rectangle targetarea;\r
70                 if(drawee._zoom_cache) {\r
71                         targetarea.set(img.getLeft(), img.getTop(), img.getRight(), img.getBottom());\r
72                 } else {\r
73                         targetarea.set(img.getLeft(), img.getTop(), img.getRight(), img.getBottom());\r
74                 }\r
75                 const Color zero_alpha(1,1,1,0,false);\r
76                 glPushAttrib(GL_COLOR_BUFFER_BIT);\r
77                 //img.move_to(posX, posY-cache_baseY);\r
78 \r
79                 // clear destination alpha\r
80                 glBlendFunc(GL_ZERO, GL_SRC_COLOR);\r
81                 targetarea.draw(zero_alpha, outer);\r
82 \r
83                 // draw font in alpha channel\r
84                 glBlendFunc(GL_ONE, GL_ONE);\r
85                 img.draw(outer);\r
86 \r
87                 // apply alpha factor\r
88                 if(a!=1) {\r
89                         Color alpha_mask(1,1,1,a,false);\r
90                         glBlendFunc(GL_ZERO, GL_SRC_COLOR);\r
91                         targetarea.draw(alpha_mask, outer);\r
92                 }\r
93 \r
94                 // drawing in specified color by destination alpha\r
95                 glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);\r
96                 targetarea.draw(col, outer);\r
97 \r
98                 //              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
99                 glPopAttrib();\r
100         }\r
101 \r
102 \r
103         ////////        TextCacheManager        ////////\r
104         bool TextCacheManager::isCached(Letters *letters)\r
105         {\r
106                 return (map.count(letters) != 0);// && !(image_cache[img].dirty_);\r
107         }\r
108         void TextCacheManager::cache(Letters *letters, CacheOnImage *allocation)\r
109         {\r
110                 map[letters] = allocation;\r
111         }\r
112         void TextCacheManager::uncache(Letters *letters)\r
113         {\r
114                 if( isCached(letters) ) {\r
115                         map[letters]->uncache();\r
116                         map.erase(letters);\r
117                 }\r
118         }\r
119         void TextCacheManager::uncacheAll()\r
120         {\r
121                 map.clear();\r
122         }\r
123 \r
124 \r
125 }
126 }       /*      <- namespace Psycholops         */
127 \r