ecere/gfx/newFonts: Android Support
authorJerome St-Louis <jerome@ecere.com>
Tue, 28 Jun 2016 00:45:44 +0000 (20:45 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 2 Nov 2016 16:32:49 +0000 (12:32 -0400)
- Replacing glMapBuffer()
- Replacing texture re-packing
- Added __LP64__ define checks

ecere/src/gfx/newFonts/cc/cpuconfig.h
ecere/src/gfx/newFonts/cc/mmbitmap.h
ecere/src/gfx/newFonts/drawManager.ec
ecere/src/gfx/newFonts/fontRenderer.ec

index 6670de6..0e25edd 100644 (file)
@@ -55,7 +55,7 @@
    //#error "Unknown endianness"
 #endif
 
-#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN64)
+#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN64) || defined(__LP64__) || defined(__LLP64__)
 
 #if defined(__x86_64__) || defined(_M_X64)
    #define CPUCONF_ARCH_AMD64
index 75ba883..5455b38 100644 (file)
@@ -52,7 +52,7 @@ static inline int mmBitMapDirectGet( mmBitMap *bitmap, size_t entryindex )
 #ifdef MM_ATOMIC_SUPPORT
   value = (int)(( MM_ATOMIC_ACCESS_L( &bitmap->map[index] ) >> shift ) & 0x1);
 #else
-  value = ( bitmap->map[index] >> shift ) & 0x1;
+  value = (int)(( bitmap->map[index] >> shift ) & 0x1);
 #endif
   return value;
 }
@@ -92,7 +92,7 @@ static inline int mmBitMapDirectMaskGet( mmBitMap *bitmap, size_t entryindex, lo
 #ifdef MM_ATOMIC_SUPPORT
   value = (int)(( MM_ATOMIC_ACCESS_L( &bitmap->map[index] ) >> shift ) & mask);
 #else
-  value = ( bitmap->map[index] >> shift ) & mask;
+  value = (int)(( bitmap->map[index] >> shift ) & mask);
 #endif
   return value;
 }
@@ -126,7 +126,7 @@ static inline int mmBitMapGet( mmBitMap *bitmap, size_t entryindex )
   value = (int)(( mmAtomicReadL( &bitmap->map[index] ) >> shift ) & 0x1);
 #else
   mtMutexLock( &bitmap->mutex );
-  value = ( bitmap->map[index] >> shift ) & 0x1;
+  value = (int)(( bitmap->map[index] >> shift ) & 0x1);
   mtMutexUnlock( &bitmap->mutex );
 #endif
   return value;
@@ -182,7 +182,7 @@ static inline int mmBitMapMaskGet( mmBitMap *bitmap, size_t entryindex, long mas
   value = (int)(( mmAtomicReadL( &bitmap->map[index] ) >> shift ) & mask);
 #else
   mtMutexLock( &bitmap->mutex );
-  value = ( bitmap->map[index] >> shift ) & mask;
+  value = (int)(( bitmap->map[index] >> shift ) & mask);
   mtMutexUnlock( &bitmap->mutex );
 #endif
   return value;
@@ -191,10 +191,10 @@ static inline int mmBitMapMaskGet( mmBitMap *bitmap, size_t entryindex, long mas
 static inline void mmBitMapMaskSet( mmBitMap *bitmap, size_t entryindex, long value, long mask )
 {
   size_t index, shift;
-  long oldvalue, newvalue;
   index = entryindex >> CPUCONF_LONG_BITSHIFT;
   shift = entryindex & ( CPUCONF_LONG_BITS - 1 );
 #ifdef MM_ATOMIC_SUPPORT
+  long oldvalue, newvalue;
   for( ; ; )
   {
     oldvalue = (int)mmAtomicReadL( &bitmap->map[index] );
index 5336333..1ff2c11 100644 (file)
@@ -718,6 +718,9 @@ public class DrawManager
      Texture texture, bindTexture;
      DMDrawBuffer *drawBuffer;
      DMDrawVertexFlat *vboVertex = null;
+#if defined(_GLES) || defined(_GLES2)
+     DMDrawVertexFlat *vboStorage = null;
+#endif
      DMProgram *program;
 
      ERRORCHECK();
@@ -733,7 +736,9 @@ public class DrawManager
         drawBuffer = &this.drawBuffer[drawBufferIndex];
         drawBufferIndex = ( drawBufferIndex + 1 ) % DM_CONTEXT_DRAW_BUFFER_COUNT;
         glBindBuffer( GL_ARRAY_BUFFER, drawBuffer->vbo );
-#if !defined(_GLES) && !defined(_GLES2)  // TODO:
+#if defined(_GLES) || defined(_GLES2)
+        vboVertex = vboStorage = new DMDrawVertexFlat[drawBuffer->vertexAlloc * 1];
+#else
         vboVertex = glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
 #endif
         vertexCount = 0;
@@ -773,7 +778,9 @@ public class DrawManager
           {
             if( vertexCount )
             {
-#if !defined(_GLES) && !defined(_GLES2)    // TODO:
+#if defined(_GLES) || defined(_GLES2)
+              glBufferData( GL_ARRAY_BUFFER, drawBuffer->vertexAlloc * sizeof(DMDrawVertexFlat), vboStorage, GL_DYNAMIC_DRAW );
+#else
               glUnmapBuffer( GL_ARRAY_BUFFER );
 #endif
               // Flush font manager texture updates
@@ -783,7 +790,9 @@ public class DrawManager
               drawBuffer = &this.drawBuffer[drawBufferIndex];
               drawBufferIndex = ( drawBufferIndex + 1 ) % DM_CONTEXT_DRAW_BUFFER_COUNT;
               glBindBuffer( GL_ARRAY_BUFFER, drawBuffer->vbo );
-#if !defined(_GLES) && !defined(_GLES2)    // TODO:
+#if defined(_GLES) || defined(_GLES2)
+              vboVertex = vboStorage;
+#else
               vboVertex = glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
 #endif
               vertexCount = 0;
@@ -900,7 +909,10 @@ public class DrawManager
           vertexCount += 6;
         }
 
-#if !defined(_GLES) && !defined(_GLES2) // TODO:
+#if defined(_GLES) || defined(_GLES2) // TODO:
+        glBufferData( GL_ARRAY_BUFFER, drawBuffer->vertexAlloc * sizeof(DMDrawVertexFlat), vboStorage, GL_DYNAMIC_DRAW );
+        delete vboStorage;
+#else
         glUnmapBuffer( GL_ARRAY_BUFFER );
 #endif
 
index 2d178b9..5e0e406 100644 (file)
@@ -147,13 +147,25 @@ public:
         glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
 #if !defined(_GLES) && !defined(_GLES2)
         glPixelStorei( GL_UNPACK_ROW_LENGTH, textureWidth );
-        glPixelStorei( GL_UNPACK_SKIP_PIXELS, rect[0] );
-        glPixelStorei( GL_UNPACK_SKIP_ROWS, rect[1] );
+        glTexSubImage2D( GL_TEXTURE_2D, 0, rect[0], rect[1], w, h, glformat, GL_UNSIGNED_BYTE, data + (rect[1] * textureWidth + rect[0]) * channelcount);
+        //glPixelStorei( GL_UNPACK_SKIP_PIXELS, rect[0] );
+        //glPixelStorei( GL_UNPACK_SKIP_ROWS, rect[1] );
+#else
+       {
+          int row = w * channelcount;
+          byte * tmp = new byte[h * row];
+          int y;
+          for(y = 0; y < h; y++)
+            memcpy(tmp + y * row, data + textureWidth * (y + rect[1]) + rect[0], row);
+          glTexSubImage2D( GL_TEXTURE_2D, 0, rect[0], rect[1], w, h, glformat, GL_UNSIGNED_BYTE, tmp);
+          delete tmp;
+       }
 #endif
-        glTexSubImage2D( GL_TEXTURE_2D, 0, rect[0], rect[1], w, h, glformat, GL_UNSIGNED_BYTE, data );
 #if !defined(_GLES) && !defined(_GLES2)
         glPopAttrib();
         glPopClientAttrib();
+#else
+        glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
 #endif
 
       #if 0