diff options
Diffstat (limited to 'src/gl/SkGLCanvas.cpp')
-rw-r--r-- | src/gl/SkGLCanvas.cpp | 192 |
1 files changed, 31 insertions, 161 deletions
diff --git a/src/gl/SkGLCanvas.cpp b/src/gl/SkGLCanvas.cpp index f7bc96d..17e6016 100644 --- a/src/gl/SkGLCanvas.cpp +++ b/src/gl/SkGLCanvas.cpp @@ -1,180 +1,50 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "SkGLCanvas.h" #include "SkGLDevice.h" -#include "SkBlitter.h" -#include "SkDraw.h" -#include "SkDrawProcs.h" -#include "SkGL.h" -#include "SkGlyphCache.h" -#include "SkTemplates.h" -#include "SkUtils.h" -#include "SkXfermode.h" - -#ifdef SK_GL_DEVICE_FBO - #define USE_FBO_DEVICE - #include "SkGLDevice_FBO.h" -#else - #define USE_SWLAYER_DEVICE - #include "SkGLDevice_SWLayer.h" -#endif - -// maximum number of entries in our texture cache (before purging) -#define kTexCountMax_Default 256 -// maximum number of bytes used (by gl) for the texture cache (before purging) -#define kTexSizeMax_Default (4 * 1024 * 1024) - -/////////////////////////////////////////////////////////////////////////////// - -SkGLCanvas::SkGLCanvas() { - glEnable(GL_TEXTURE_2D); - glEnable(GL_SCISSOR_TEST); - glEnableClientState(GL_VERTEX_ARRAY); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - fViewportSize.set(0, 0); -} - -SkGLCanvas::~SkGLCanvas() { - // call this now, while our override of restore() is in effect - this->restoreToCount(1); -} - -/////////////////////////////////////////////////////////////////////////////// - -bool SkGLCanvas::getViewport(SkIPoint* size) const { - if (size) { - *size = fViewportSize; - } - return true; -} - -bool SkGLCanvas::setViewport(int width, int height) { - fViewportSize.set(width, height); - - const bool isOpaque = false; // should this be a parameter to setViewport? - const bool isForLayer = false; // viewport is the base layer - SkDevice* device = this->createDevice(SkBitmap::kARGB_8888_Config, width, - height, isOpaque, isForLayer); - this->setDevice(device)->unref(); - - return true; -} - -SkDevice* SkGLCanvas::createDevice(SkBitmap::Config, int width, int height, - bool isOpaque, bool isForLayer) { - SkBitmap bitmap; - - bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); - bitmap.setIsOpaque(isOpaque); - -#ifdef USE_FBO_DEVICE - return SkNEW_ARGS(SkGLDevice_FBO, (bitmap, isForLayer)); -#elif defined(USE_SWLAYER_DEVICE) - if (isForLayer) { - bitmap.allocPixels(); - if (!bitmap.isOpaque()) { - bitmap.eraseColor(0); - } - return SkNEW_ARGS(SkGLDevice_SWLayer, (bitmap)); - } else { - return SkNEW_ARGS(SkGLDevice, (bitmap, isForLayer)); - } -#else - return SkNEW_ARGS(SkGLDevice, (bitmap, isForLayer)); -#endif -} -/////////////////////////////////////////////////////////////////////////////// - -#include "SkTextureCache.h" -#include "SkThread.h" - -static SkMutex gTextureCacheMutex; -static SkTextureCache gTextureCache(kTexCountMax_Default, kTexSizeMax_Default); - -SkGLDevice::TexCache* SkGLDevice::LockTexCache(const SkBitmap& bitmap, - GLuint* name, SkPoint* size) { - SkAutoMutexAcquire amc(gTextureCacheMutex); - - SkTextureCache::Entry* entry = gTextureCache.lock(bitmap); - if (NULL != entry) { - if (name) { - *name = entry->name(); - } - if (size) { - *size = entry->texSize(); - } - } - return (TexCache*)entry; -} - -void SkGLDevice::UnlockTexCache(TexCache* cache) { - SkAutoMutexAcquire amc(gTextureCacheMutex); - gTextureCache.unlock((SkTextureCache::Entry*)cache); -} - -// public exposure of texture cache settings +SkGLCanvas::SkGLCanvas() : SkCanvas(SkNEW(SkGLDeviceFactory)) {} +// static size_t SkGLCanvas::GetTextureCacheMaxCount() { - SkAutoMutexAcquire amc(gTextureCacheMutex); - return gTextureCache.getMaxCount(); -} - -size_t SkGLCanvas::GetTextureCacheMaxSize() { - SkAutoMutexAcquire amc(gTextureCacheMutex); - return gTextureCache.getMaxSize(); + return SkGLDevice::GetTextureCacheMaxCount(); } +// static void SkGLCanvas::SetTextureCacheMaxCount(size_t count) { - SkAutoMutexAcquire amc(gTextureCacheMutex); - gTextureCache.setMaxCount(count); + SkGLDevice::SetTextureCacheMaxCount(count); } -void SkGLCanvas::SetTextureCacheMaxSize(size_t size) { - SkAutoMutexAcquire amc(gTextureCacheMutex); - gTextureCache.setMaxSize(size); +// static +size_t SkGLCanvas::GetTextureCacheMaxSize() { + return SkGLDevice::GetTextureCacheMaxSize(); } -/////////////////////////////////////////////////////////////////////////////// - -#include "SkGLTextCache.h" - -static bool deleteCachesProc(SkGlyphCache* cache, void* texturesAreValid) { - void* auxData; - if (cache->getAuxProcData(SkGLDevice::GlyphCacheAuxProc, &auxData)) { - bool valid = texturesAreValid != NULL; - SkGLTextCache* textCache = static_cast<SkGLTextCache*>(auxData); - // call this before delete, in case valid is false - textCache->deleteAllStrikes(valid); - // now free the memory for the cache itself - SkDELETE(textCache); - // now remove the entry in the glyphcache (does not call the proc) - cache->removeAuxProc(SkGLDevice::GlyphCacheAuxProc); - } - return false; // keep going +// static +void SkGLCanvas::SetTextureCacheMaxSize(size_t size) { + SkGLDevice::SetTextureCacheMaxSize(size); } +// static void SkGLCanvas::DeleteAllTextures() { - // free the textures in our cache - - gTextureCacheMutex.acquire(); - gTextureCache.deleteAllCaches(true); - gTextureCacheMutex.release(); - - // now free the textures in the font cache - - SkGlyphCache::VisitAllCaches(deleteCachesProc, reinterpret_cast<void*>(true)); + SkGLDevice::DeleteAllTextures(); } +// static void SkGLCanvas::AbandonAllTextures() { - // abandon the textures in our cache - - gTextureCacheMutex.acquire(); - gTextureCache.deleteAllCaches(false); - gTextureCacheMutex.release(); - - // abandon the textures in the font cache - - SkGlyphCache::VisitAllCaches(deleteCachesProc, reinterpret_cast<void*>(false)); + SkGLDevice::AbandonAllTextures(); } - |