aboutsummaryrefslogtreecommitdiffstats
path: root/src/gl/SkGLTextCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl/SkGLTextCache.cpp')
-rw-r--r--src/gl/SkGLTextCache.cpp191
1 files changed, 0 insertions, 191 deletions
diff --git a/src/gl/SkGLTextCache.cpp b/src/gl/SkGLTextCache.cpp
deleted file mode 100644
index 2619dc8..0000000
--- a/src/gl/SkGLTextCache.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-#include "SkGLTextCache.h"
-#include "SkScalerContext.h"
-#include "SkTSearch.h"
-
-const GLenum gTextTextureFormat = GL_ALPHA;
-const GLenum gTextTextureType = GL_UNSIGNED_BYTE;
-
-SkGLTextCache::Strike::Strike(Strike* next, int width, int height) {
- fStrikeWidth = SkNextPow2(SkMax32(kMinStrikeWidth, width));
- fStrikeHeight = SkNextPow2(height);
- fGlyphCount = 0;
- fNextFreeOffsetX = 0;
- fNext = next;
-
- fStrikeWidthShift = SkNextLog2(fStrikeWidth);
- fStrikeHeightShift = SkNextLog2(fStrikeHeight);
-
- if (next) {
- SkASSERT(next->fStrikeHeight == fStrikeHeight);
- }
-
- // create an empty texture to receive glyphs
- fTexName = 0;
- glGenTextures(1, &fTexName);
- glBindTexture(GL_TEXTURE_2D, fTexName);
- glTexImage2D(GL_TEXTURE_2D, 0, gTextTextureFormat,
- fStrikeWidth, fStrikeHeight, 0,
- gTextTextureFormat, gTextTextureType, NULL);
-
- SK_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- SK_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- SK_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- SK_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-}
-
-SkGLTextCache::Strike::~Strike() {
- if (fTexName != 0) {
- glDeleteTextures(1, &fTexName);
- }
-}
-
-SkGLTextCache::Strike*
-SkGLTextCache::Strike::findGlyph(const SkGlyph& glyph, int* offset) {
- Strike* strike = this;
- SkDEBUGCODE(const int height = SkNextPow2(glyph.fHeight);)
-
- do {
- SkASSERT(height == strike->fStrikeHeight);
-
- int index = SkTSearch(strike->fGlyphIDArray, strike->fGlyphCount,
- glyph.fID, sizeof(strike->fGlyphIDArray[0]));
- if (index >= 0) {
- if (offset) {
- *offset = strike->fGlyphOffsetX[index];
- }
- return strike;
- }
- strike = strike->fNext;
- } while (NULL != strike);
- return NULL;
-}
-
-static void make_a_whole(void* buffer, int index, int count, size_t elemSize) {
- SkASSERT(index >= 0 && index <= count);
- size_t offset = index * elemSize;
- memmove((char*)buffer + offset + elemSize,
- (const char*)buffer + offset,
- (count - index) * elemSize);
-}
-
-SkGLTextCache::Strike*
-SkGLTextCache::Strike::addGlyphAndBind(const SkGlyph& glyph,
- const uint8_t image[], int* offset) {
-#ifdef SK_DEBUG
- SkASSERT(this->findGlyph(glyph, NULL) == NULL);
- const int height = SkNextPow2(glyph.fHeight);
- SkASSERT(height <= fStrikeHeight && height > (fStrikeHeight >> 1));
-#endif
-
- int rowBytes = glyph.rowBytes();
- SkASSERT(rowBytes >= glyph.fWidth);
-
- Strike* strike;
- if (fGlyphCount == kMaxGlyphCount ||
- fNextFreeOffsetX + rowBytes >= fStrikeWidth) {
- // this will bind the next texture for us
-// SkDebugf("--- extend strike %p\n", this);
- strike = SkNEW_ARGS(Strike, (this, rowBytes, glyph.fHeight));
- } else {
- glBindTexture(GL_TEXTURE_2D, fTexName);
- strike = this;
- }
-
- uint32_t* idArray = strike->fGlyphIDArray;
- uint16_t* offsetArray = strike->fGlyphOffsetX;
- const int glyphCount = strike->fGlyphCount;
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexSubImage2D(GL_TEXTURE_2D, 0, strike->fNextFreeOffsetX, 0, rowBytes,
- glyph.fHeight, gTextTextureFormat, gTextTextureType,
- image);
-
- // need to insert the offset
- int index = SkTSearch(idArray, glyphCount, glyph.fID, sizeof(idArray[0]));
- SkASSERT(index < 0);
- index = ~index; // this is where we should insert it
- make_a_whole(idArray, index, glyphCount, sizeof(idArray));
- make_a_whole(offsetArray, index, glyphCount, sizeof(offsetArray[0]));
- idArray[index] = glyph.fID;
- offsetArray[index] = strike->fNextFreeOffsetX;
- if (offset) {
- *offset = strike->fNextFreeOffsetX;
- }
-
-#if 0
- SkDebugf("--- strike %p glyph %x [%d %d] offset %d count %d\n",
- strike, glyph.fID, glyph.fWidth, glyph.fHeight,
- strike->fNextFreeOffsetX, glyphCount + 1);
-#endif
-
- // now update our header
- strike->fGlyphCount = glyphCount + 1;
- strike->fNextFreeOffsetX += glyph.fWidth;
- return strike;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-SkGLTextCache::SkGLTextCache() {
- sk_bzero(fStrikeList, sizeof(fStrikeList));
-}
-
-SkGLTextCache::~SkGLTextCache() {
- this->deleteAllStrikes(true);
-}
-
-void SkGLTextCache::deleteAllStrikes(bool texturesAreValid) {
- for (size_t i = 0; i < SK_ARRAY_COUNT(fStrikeList); i++) {
- Strike* strike = fStrikeList[i];
- while (strike != NULL) {
- Strike* next = strike->fNext;
- if (!texturesAreValid) {
- strike->abandonTexture();
- }
- SkDELETE(strike);
- strike = next;
- }
- }
- sk_bzero(fStrikeList, sizeof(fStrikeList));
-}
-
-SkGLTextCache::Strike* SkGLTextCache::findGlyph(const SkGlyph& glyph,
- int* offset) {
- SkASSERT(glyph.fWidth != 0);
- SkASSERT(glyph.fHeight != 0);
-
- size_t index = SkNextLog2(glyph.fHeight);
- if (index >= SK_ARRAY_COUNT(fStrikeList)) {
- // too big for us to cache;
- return NULL;
- }
-
- Strike* strike = fStrikeList[index];
- if (strike) {
- strike = strike->findGlyph(glyph, offset);
- }
- return strike;
-}
-
-SkGLTextCache::Strike* SkGLTextCache::addGlyphAndBind(const SkGlyph& glyph,
- const uint8_t image[], int* offset) {
- SkASSERT(image != NULL);
- SkASSERT(glyph.fWidth != 0);
- SkASSERT(glyph.fHeight != 0);
-
- size_t index = SkNextLog2(glyph.fHeight);
- if (index >= SK_ARRAY_COUNT(fStrikeList)) {
- // too big for us to cache;
- return NULL;
- }
-
- Strike* strike = fStrikeList[index];
- if (NULL == strike) {
- strike = SkNEW_ARGS(Strike, (NULL, glyph.rowBytes(), glyph.fHeight));
-// SkDebugf("--- create strike [%d] %p cache %p\n", index, strike, this);
- }
- strike = strike->addGlyphAndBind(glyph, image, offset);
- fStrikeList[index] = strike;
- return strike;
-}
-