OSDN Git Service

first
[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 x, y;\r
35                 switch(anchor) {\r
36                         case Letters::TEXT_ALIGN_CENTER:\r
37                                 x = mx - img.getWidth() / 2;\r
38                                 break;\r
39                         case Letters::TEXT_ALIGN_RIGHT:\r
40                                 x = mx - img.getWidth();\r
41                                 break;\r
42                         case Letters::NOT_SPECIFIED:\r
43                         case Letters::TEXT_ALIGN_LEFT:\r
44                         default:\r
45                                 x = mx;\r
46                                 break;\r
47                 }\r
48                 switch(vertical_anchor) {\r
49                         case Letters::TEXT_ALIGN_MIDDLE:\r
50                                 y = my;\r
51                                 img.centering(x, y);\r
52                                 break;\r
53                         case Letters::TEXT_ALIGN_TOP:\r
54                                 y = my;\r
55                                 img.move_to(x, y);\r
56                                 break;\r
57                         default:\r
58                                 y = my - drawee.font.size;\r
59                                 img.move_to(x, y);\r
60                                 break;\r
61                 }\r
62                 //img.draw(outer);\r
63 \r
64                 Color col(r,g,b,a);\r
65                 Rectangle targetarea(img.getLeft(), img.getTop(), img.getRight(), img.getBottom());\r
66                 const Color zero_alpha(1,1,1,0,false);\r
67                 glPushAttrib(GL_COLOR_BUFFER_BIT);\r
68                 //img.move_to(posX, posY-cache_baseY);\r
69 \r
70                 // clear destination alpha\r
71                 glBlendFunc(GL_ZERO, GL_SRC_COLOR);\r
72                 targetarea.draw(zero_alpha, outer);\r
73 \r
74                 // draw font in alpha channel\r
75                 glBlendFunc(GL_ONE, GL_ONE);\r
76                 img.draw(outer);\r
77 \r
78                 // apply alpha factor\r
79                 if(a!=1) {\r
80                         Color alpha_mask(1,1,1,a,false);\r
81                         glBlendFunc(GL_ZERO, GL_SRC_COLOR);\r
82                         targetarea.draw(alpha_mask, outer);\r
83                 }\r
84 \r
85                 // drawing in specified color by destination alpha\r
86                 glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);\r
87                 targetarea.draw(col, outer);\r
88 \r
89                 //              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
90                 glPopAttrib();\r
91         }\r
92 \r
93 \r
94         ////////        TextCacheManager        ////////\r
95         bool TextCacheManager::isCached(Letters *letters)\r
96         {\r
97                 return (map.count(letters) != 0);// && !(image_cache[img].dirty_);\r
98         }\r
99         void TextCacheManager::cache(Letters *letters, CacheOnImage *allocation)\r
100         {\r
101                 map[letters] = allocation;\r
102         }\r
103         void TextCacheManager::uncache(Letters *letters)\r
104         {\r
105                 if( isCached(letters) ) {\r
106                         map[letters]->uncache();\r
107                         map.erase(letters);\r
108                 }\r
109         }\r
110         void TextCacheManager::uncacheAll()\r
111         {\r
112                 map.clear();\r
113         }\r
114 \r
115 \r
116 }
117 }       /*      <- namespace Psycholops         */
118 \r