OLD | NEW |
| (Empty) |
1 #include "SkGLCanvas.h" | |
2 #include "SkGLDevice.h" | |
3 #include "SkBlitter.h" | |
4 #include "SkDraw.h" | |
5 #include "SkDrawProcs.h" | |
6 #include "SkGL.h" | |
7 #include "SkTemplates.h" | |
8 #include "SkUtils.h" | |
9 #include "SkXfermode.h" | |
10 | |
11 #ifdef SK_GL_DEVICE_FBO | |
12 #define USE_FBO_DEVICE | |
13 #include "SkGLDevice_FBO.h" | |
14 #else | |
15 #define USE_SWLAYER_DEVICE | |
16 #include "SkGLDevice_SWLayer.h" | |
17 #endif | |
18 | |
19 // maximum number of entries in our texture cache (before purging) | |
20 #define kTexCountMax_Default 256 | |
21 // maximum number of bytes used (by gl) for the texture cache (before purging) | |
22 #define kTexSizeMax_Default (4 * 1024 * 1024) | |
23 | |
24 /////////////////////////////////////////////////////////////////////////////// | |
25 | |
26 SkGLCanvas::SkGLCanvas() { | |
27 glEnable(GL_TEXTURE_2D); | |
28 glEnable(GL_SCISSOR_TEST); | |
29 glEnableClientState(GL_VERTEX_ARRAY); | |
30 | |
31 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | |
32 | |
33 fViewportSize.set(0, 0); | |
34 } | |
35 | |
36 SkGLCanvas::~SkGLCanvas() { | |
37 // call this now, while our override of restore() is in effect | |
38 this->restoreToCount(1); | |
39 } | |
40 | |
41 /////////////////////////////////////////////////////////////////////////////// | |
42 | |
43 bool SkGLCanvas::getViewport(SkIPoint* size) const { | |
44 if (size) { | |
45 *size = fViewportSize; | |
46 } | |
47 return true; | |
48 } | |
49 | |
50 bool SkGLCanvas::setViewport(int width, int height) { | |
51 fViewportSize.set(width, height); | |
52 | |
53 const bool isOpaque = false; // should this be a parameter to setViewport? | |
54 const bool isForLayer = false; // viewport is the base layer | |
55 SkDevice* device = this->createDevice(SkBitmap::kARGB_8888_Config, width, | |
56 height, isOpaque, isForLayer); | |
57 this->setDevice(device)->unref(); | |
58 | |
59 return true; | |
60 } | |
61 | |
62 SkDevice* SkGLCanvas::createDevice(SkBitmap::Config, int width, int height, | |
63 bool isOpaque, bool isForLayer) { | |
64 SkBitmap bitmap; | |
65 | |
66 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); | |
67 bitmap.setIsOpaque(isOpaque); | |
68 | |
69 #ifdef USE_FBO_DEVICE | |
70 return SkNEW_ARGS(SkGLDevice_FBO, (bitmap, isForLayer)); | |
71 #elif defined(USE_SWLAYER_DEVICE) | |
72 if (isForLayer) { | |
73 bitmap.allocPixels(); | |
74 if (!bitmap.isOpaque()) { | |
75 bitmap.eraseColor(0); | |
76 } | |
77 return SkNEW_ARGS(SkGLDevice_SWLayer, (bitmap)); | |
78 } else { | |
79 return SkNEW_ARGS(SkGLDevice, (bitmap, isForLayer)); | |
80 } | |
81 #else | |
82 return SkNEW_ARGS(SkGLDevice, (bitmap, isForLayer)); | |
83 #endif | |
84 } | |
85 | |
86 /////////////////////////////////////////////////////////////////////////////// | |
87 | |
88 #include "SkTextureCache.h" | |
89 #include "SkThread.h" | |
90 | |
91 static SkMutex gTextureCacheMutex; | |
92 static SkTextureCache gTextureCache(kTexCountMax_Default, kTexSizeMax_Default); | |
93 | |
94 SkGLDevice::TexCache* SkGLDevice::LockTexCache(const SkBitmap& bitmap, | |
95 GLuint* name, SkPoint* size) { | |
96 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
97 | |
98 SkTextureCache::Entry* entry = gTextureCache.lock(bitmap); | |
99 if (NULL != entry) { | |
100 if (name) { | |
101 *name = entry->name(); | |
102 } | |
103 if (size) { | |
104 *size = entry->texSize(); | |
105 } | |
106 } | |
107 return (TexCache*)entry; | |
108 } | |
109 | |
110 void SkGLDevice::UnlockTexCache(TexCache* cache) { | |
111 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
112 gTextureCache.unlock((SkTextureCache::Entry*)cache); | |
113 } | |
114 | |
115 // public exposure of texture cache settings | |
116 | |
117 size_t SkGLCanvas::GetTextureCacheMaxCount() { | |
118 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
119 return gTextureCache.getMaxCount(); | |
120 } | |
121 | |
122 size_t SkGLCanvas::GetTextureCacheMaxSize() { | |
123 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
124 return gTextureCache.getMaxSize(); | |
125 } | |
126 | |
127 void SkGLCanvas::SetTextureCacheMaxCount(size_t count) { | |
128 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
129 gTextureCache.setMaxCount(count); | |
130 } | |
131 | |
132 void SkGLCanvas::SetTextureCacheMaxSize(size_t size) { | |
133 SkAutoMutexAcquire amc(gTextureCacheMutex); | |
134 gTextureCache.setMaxSize(size); | |
135 } | |
136 | |
137 /////////////////////////////////////////////////////////////////////////////// | |
138 | |
139 #include "SkGLTextCache.h" | |
140 | |
141 static bool deleteCachesProc(SkGlyphCache* cache, void* texturesAreValid) { | |
142 void* auxData; | |
143 if (cache->getAuxProcData(SkGLDevice::GlyphCacheAuxProc, &auxData)) { | |
144 bool valid = texturesAreValid != NULL; | |
145 SkGLTextCache* textCache = static_cast<SkGLTextCache*>(auxData); | |
146 // call this before delete, in case valid is false | |
147 textCache->deleteAllStrikes(valid); | |
148 // now free the memory for the cache itself | |
149 SkDELETE(textCache); | |
150 // now remove the entry in the glyphcache (does not call the proc) | |
151 cache->removeAuxProc(SkGLDevice::GlyphCacheAuxProc); | |
152 } | |
153 return false; // keep going | |
154 } | |
155 | |
156 void SkGLCanvas::DeleteAllTextures() { | |
157 // free the textures in our cache | |
158 | |
159 gTextureCacheMutex.acquire(); | |
160 gTextureCache.deleteAllCaches(true); | |
161 gTextureCacheMutex.release(); | |
162 | |
163 // now free the textures in the font cache | |
164 | |
165 SkGlyphCache::VisitAllCaches(deleteCachesProc, reinterpret_cast<void*>(true)
); | |
166 } | |
167 | |
168 void SkGLCanvas::AbandonAllTextures() { | |
169 // abandon the textures in our cache | |
170 | |
171 gTextureCacheMutex.acquire(); | |
172 gTextureCache.deleteAllCaches(false); | |
173 gTextureCacheMutex.release(); | |
174 | |
175 // abandon the textures in the font cache | |
176 | |
177 SkGlyphCache::VisitAllCaches(deleteCachesProc, reinterpret_cast<void*>(false
)); | |
178 } | |
179 | |
OLD | NEW |