Explorar el Código

Reviewed ImageConvertToPOT()

raysan5 hace 10 años
padre
commit
07858c3a1f
Se han modificado 1 ficheros con 129 adiciones y 122 borrados
  1. 129 122
      src/textures.c

+ 129 - 122
src/textures.c

@@ -330,7 +330,6 @@ Texture2D LoadTexture(const char *fileName)
     else
     {
         TraceLog(WARNING, "Texture could not be created");
-        
         texture.id = 0;
     }
 
@@ -391,7 +390,8 @@ void UnloadImage(Image image)
 {
     free(image.data);
     
-    TraceLog(INFO, "Unloaded image data");
+    // NOTE: It becomes anoying every time a texture is loaded
+    //TraceLog(INFO, "Unloaded image data");
 }
 
 // Unload texture from GPU memory
@@ -519,136 +519,139 @@ Image GetTextureData(Texture2D texture)
 // Convert image data to desired format
 void ImageConvertFormat(Image *image, int newFormat)
 {
-    if ((image->format != newFormat) && (image->format < 8) && (newFormat < 8))
+    if (image->format != newFormat)
     {
-        Color *pixels = GetImageData(*image);
-        
-        free(image->data);
-        
-        image->format = newFormat;
-
-        int k = 0;
-        
-        switch (image->format)
+        if ((image->format < 8) && (newFormat < 8))
         {
-            case UNCOMPRESSED_GRAYSCALE:
+            Color *pixels = GetImageData(*image);
+            
+            free(image->data);
+            
+            image->format = newFormat;
+
+            int k = 0;
+            
+            switch (image->format)
             {
-                image->data = (unsigned char *)malloc(image->width*image->height*sizeof(unsigned char));
-                
-                for (int i = 0; i < image->width*image->height; i++)
+                case UNCOMPRESSED_GRAYSCALE:
                 {
-                    ((unsigned char *)image->data)[i] = (unsigned char)((float)pixels[k].r*0.299f + (float)pixels[k].g*0.587f + (float)pixels[k].b*0.114f);
-                    k++;
-                }
-        
-            } break;
-            case UNCOMPRESSED_GRAY_ALPHA:
-            {
-               image->data = (unsigned char *)malloc(image->width*image->height*2*sizeof(unsigned char));
-                
-               for (int i = 0; i < image->width*image->height*2; i += 2)
+                    image->data = (unsigned char *)malloc(image->width*image->height*sizeof(unsigned char));
+                    
+                    for (int i = 0; i < image->width*image->height; i++)
+                    {
+                        ((unsigned char *)image->data)[i] = (unsigned char)((float)pixels[k].r*0.299f + (float)pixels[k].g*0.587f + (float)pixels[k].b*0.114f);
+                        k++;
+                    }
+            
+                } break;
+                case UNCOMPRESSED_GRAY_ALPHA:
                 {
-                    ((unsigned char *)image->data)[i] = (unsigned char)((float)pixels[k].r*0.299f + (float)pixels[k].g*0.587f + (float)pixels[k].b*0.114f);
-                    ((unsigned char *)image->data)[i + 1] = pixels[k].a;
-                    k++;
-                }
+                   image->data = (unsigned char *)malloc(image->width*image->height*2*sizeof(unsigned char));
+                    
+                   for (int i = 0; i < image->width*image->height*2; i += 2)
+                    {
+                        ((unsigned char *)image->data)[i] = (unsigned char)((float)pixels[k].r*0.299f + (float)pixels[k].g*0.587f + (float)pixels[k].b*0.114f);
+                        ((unsigned char *)image->data)[i + 1] = pixels[k].a;
+                        k++;
+                    }
 
-            } break;
-            case UNCOMPRESSED_R5G6B5:
-            {
-                image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
-                
-                unsigned char r;
-                unsigned char g;
-                unsigned char b;
-                
-                for (int i = 0; i < image->width*image->height; i++)
+                } break;
+                case UNCOMPRESSED_R5G6B5:
                 {
-                    r = (unsigned char)(round((float)pixels[k].r*31/255));
-                    g = (unsigned char)(round((float)pixels[k].g*63/255));
-                    b = (unsigned char)(round((float)pixels[k].b*31/255));
+                    image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
+                    
+                    unsigned char r;
+                    unsigned char g;
+                    unsigned char b;
                     
-                    ((unsigned short *)image->data)[i] = (unsigned short)r << 11 | (unsigned short)g << 5 | (unsigned short)b;
+                    for (int i = 0; i < image->width*image->height; i++)
+                    {
+                        r = (unsigned char)(round((float)pixels[k].r*31/255));
+                        g = (unsigned char)(round((float)pixels[k].g*63/255));
+                        b = (unsigned char)(round((float)pixels[k].b*31/255));
+                        
+                        ((unsigned short *)image->data)[i] = (unsigned short)r << 11 | (unsigned short)g << 5 | (unsigned short)b;
 
-                    k++;
-                }
+                        k++;
+                    }
 
-            } break;
-            case UNCOMPRESSED_R8G8B8:
-            {
-                image->data = (unsigned char *)malloc(image->width*image->height*3*sizeof(unsigned char));
-                
-                for (int i = 0; i < image->width*image->height*3; i += 3)
+                } break;
+                case UNCOMPRESSED_R8G8B8:
                 {
-                    ((unsigned char *)image->data)[i] = pixels[k].r;
-                    ((unsigned char *)image->data)[i + 1] = pixels[k].g;
-                    ((unsigned char *)image->data)[i + 2] = pixels[k].b;
-                    k++;
-                }
-            } break;
-            case UNCOMPRESSED_R5G5B5A1:
-            {
-                image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
-                
-                unsigned char r;
-                unsigned char g;
-                unsigned char b;
-                unsigned char a = 1;
-                
-                for (int i = 0; i < image->width*image->height; i++)
+                    image->data = (unsigned char *)malloc(image->width*image->height*3*sizeof(unsigned char));
+                    
+                    for (int i = 0; i < image->width*image->height*3; i += 3)
+                    {
+                        ((unsigned char *)image->data)[i] = pixels[k].r;
+                        ((unsigned char *)image->data)[i + 1] = pixels[k].g;
+                        ((unsigned char *)image->data)[i + 2] = pixels[k].b;
+                        k++;
+                    }
+                } break;
+                case UNCOMPRESSED_R5G5B5A1:
                 {
-                    r = (unsigned char)(round((float)pixels[k].r*31/255));
-                    g = (unsigned char)(round((float)pixels[k].g*31/255));
-                    b = (unsigned char)(round((float)pixels[k].b*31/255));
-                    a = (pixels[k].a > 50) ? 1 : 0;
+                    image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
+                    
+                    unsigned char r;
+                    unsigned char g;
+                    unsigned char b;
+                    unsigned char a = 1;
                     
-                    ((unsigned short *)image->data)[i] = (unsigned short)r << 11 | (unsigned short)g << 6 | (unsigned short)b << 1| (unsigned short)a;
+                    for (int i = 0; i < image->width*image->height; i++)
+                    {
+                        r = (unsigned char)(round((float)pixels[k].r*31/255));
+                        g = (unsigned char)(round((float)pixels[k].g*31/255));
+                        b = (unsigned char)(round((float)pixels[k].b*31/255));
+                        a = (pixels[k].a > 50) ? 1 : 0;
+                        
+                        ((unsigned short *)image->data)[i] = (unsigned short)r << 11 | (unsigned short)g << 6 | (unsigned short)b << 1| (unsigned short)a;
 
-                    k++;
-                }
+                        k++;
+                    }
 
-            } break;
-            case UNCOMPRESSED_R4G4B4A4:
-            {
-                image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
-                
-                unsigned char r;
-                unsigned char g;
-                unsigned char b;
-                unsigned char a;
-                
-                for (int i = 0; i < image->width*image->height; i++)
+                } break;
+                case UNCOMPRESSED_R4G4B4A4:
                 {
-                    r = (unsigned char)(round((float)pixels[k].r*15/255));
-                    g = (unsigned char)(round((float)pixels[k].g*15/255));
-                    b = (unsigned char)(round((float)pixels[k].b*15/255));
-                    a = (unsigned char)(round((float)pixels[k].a*15/255));
+                    image->data = (unsigned short *)malloc(image->width*image->height*sizeof(unsigned short));
+                    
+                    unsigned char r;
+                    unsigned char g;
+                    unsigned char b;
+                    unsigned char a;
                     
-                    ((unsigned short *)image->data)[i] = (unsigned short)r << 12 | (unsigned short)g << 8| (unsigned short)b << 4| (unsigned short)a;
+                    for (int i = 0; i < image->width*image->height; i++)
+                    {
+                        r = (unsigned char)(round((float)pixels[k].r*15/255));
+                        g = (unsigned char)(round((float)pixels[k].g*15/255));
+                        b = (unsigned char)(round((float)pixels[k].b*15/255));
+                        a = (unsigned char)(round((float)pixels[k].a*15/255));
+                        
+                        ((unsigned short *)image->data)[i] = (unsigned short)r << 12 | (unsigned short)g << 8| (unsigned short)b << 4| (unsigned short)a;
 
-                    k++;
-                }
-                
-            } break;
-            case UNCOMPRESSED_R8G8B8A8:
-            {
-                image->data = (unsigned char *)malloc(image->width*image->height*4*sizeof(unsigned char));
-                
-                for (int i = 0; i < image->width*image->height*4; i += 4)
+                        k++;
+                    }
+                    
+                } break;
+                case UNCOMPRESSED_R8G8B8A8:
                 {
-                    ((unsigned char *)image->data)[i] = pixels[k].r;
-                    ((unsigned char *)image->data)[i + 1] = pixels[k].g;
-                    ((unsigned char *)image->data)[i + 2] = pixels[k].b;
-                    ((unsigned char *)image->data)[i + 3] = pixels[k].a;
-                    k++;
-                }
-            } break;
-            default: break;
+                    image->data = (unsigned char *)malloc(image->width*image->height*4*sizeof(unsigned char));
+                    
+                    for (int i = 0; i < image->width*image->height*4; i += 4)
+                    {
+                        ((unsigned char *)image->data)[i] = pixels[k].r;
+                        ((unsigned char *)image->data)[i + 1] = pixels[k].g;
+                        ((unsigned char *)image->data)[i + 2] = pixels[k].b;
+                        ((unsigned char *)image->data)[i + 3] = pixels[k].a;
+                        k++;
+                    }
+                } break;
+                default: break;
+            }
+            
+            free(pixels);
         }
-        
-        free(pixels);
+        else TraceLog(WARNING, "Image data format is compressed, can not be converted");
     }
-    else TraceLog(WARNING, "Image data format is compressed, can not be converted");
 }
 
 
@@ -656,8 +659,8 @@ void ImageConvertFormat(Image *image, int newFormat)
 // NOTE: Requirement on OpenGL ES 2.0 (RPI, HTML5)
 void ImageConvertToPOT(Image *image, Color fillColor)
 {
-    // TODO: Review for new image struct
-    /*
+    Color *pixels = GetImageData(*image);   // Get pixels data
+    
     // Just add the required amount of pixels at the right and bottom sides of image...
     int potWidth = GetNextPOT(image->width);
     int potHeight = GetNextPOT(image->height);
@@ -665,29 +668,33 @@ void ImageConvertToPOT(Image *image, Color fillColor)
     // Check if POT texture generation is required (if texture is not already POT)
     if ((potWidth != image->width) || (potHeight != image->height))
     {
-        Color *imgDataPixelPOT = NULL;
+        Color *pixelsPOT = NULL;
 
         // Generate POT array from NPOT data
-        imgDataPixelPOT = (Color *)malloc(potWidth * potHeight * sizeof(Color));
+        pixelsPOT = (Color *)malloc(potWidth * potHeight * sizeof(Color));
 
         for (int j = 0; j < potHeight; j++)
         {
             for (int i = 0; i < potWidth; i++)
             {
-                if ((j < image->height) && (i < image->width)) imgDataPixelPOT[j*potWidth + i] = image->data[j*image->width + i];
-                else imgDataPixelPOT[j*potWidth + i] = fillColor;
+                if ((j < image->height) && (i < image->width)) pixelsPOT[j*potWidth + i] = pixels[j*image->width + i];
+                else pixelsPOT[j*potWidth + i] = fillColor;
             }
         }
 
         TraceLog(WARNING, "Image converted to POT: (%ix%i) -> (%ix%i)", image->width, image->height, potWidth, potHeight);
 
-        free(image->pixels);
+        free(pixels);                       // Free pixels data
+        free(image->data);                  // Free old image data
+        
+        int format = image->format;         // Store image data format to reconvert later
+        
+        *image = LoadImageEx(pixelsPOT, potWidth, potHeight);
+        
+        free(pixelsPOT);                    // Free POT pixels data
 
-        image->pixels = imgDataPixelPOT;
-        image->width = potWidth;
-        image->height = potHeight;
+        ImageConvertFormat(image, format);  // Reconvert image to previous format
     }
-    */
 }
 
 // Copy an image to a new image