Sfoglia il codice sorgente

REDESIGNED: ImageResize(), optimized #1218

raysan5 5 anni fa
parent
commit
bfa6544030
1 ha cambiato i file con 39 aggiunte e 14 eliminazioni
  1. 39 14
      src/textures.c

+ 39 - 14
src/textures.c

@@ -1313,25 +1313,50 @@ void ImageResize(Image *image, int newWidth, int newHeight)
 {
     // Security check to avoid program crash
     if ((image->data == NULL) || (image->width == 0) || (image->height == 0)) return;
+    
+    bool fastPath = true;
+    if ((image->format != UNCOMPRESSED_GRAYSCALE) && (image->format != UNCOMPRESSED_GRAY_ALPHA) && (image->format != UNCOMPRESSED_R8G8B8) && (image->format != UNCOMPRESSED_R8G8B8A8)) fastPath = true;
+    
+    if (fastPath)
+    {
+        int bytesPerPixel = GetPixelDataSize(1, 1, image->format);
+        unsigned char *output = RL_MALLOC(newWidth*newHeight*bytesPerPixel);
+        
+        switch (image->format)
+        {
+            case UNCOMPRESSED_GRAYSCALE: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 1); break;
+            case UNCOMPRESSED_GRAY_ALPHA: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 2); break;
+            case UNCOMPRESSED_R8G8B8: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 3); break;
+            case UNCOMPRESSED_R8G8B8A8: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 4); break;
+            default: break;
+        }
 
-    // Get data as Color pixels array to work with it
-    Color *pixels = GetImageData(*image);
-    Color *output = (Color *)RL_MALLOC(newWidth*newHeight*sizeof(Color));
+        RL_FREE(image->data);
+        image->data = output;
+        image->width = newWidth;
+        image->height = newHeight;
+    }
+    else
+    {
+        // Get data as Color pixels array to work with it
+        Color *pixels = GetImageData(*image);
+        Color *output = (Color *)RL_MALLOC(newWidth*newHeight*sizeof(Color));
 
-    // NOTE: Color data is casted to (unsigned char *), there shouldn't been any problem...
-    stbir_resize_uint8((unsigned char *)pixels, image->width, image->height, 0, (unsigned char *)output, newWidth, newHeight, 0, 4);
+        // NOTE: Color data is casted to (unsigned char *), there shouldn't been any problem...
+        stbir_resize_uint8((unsigned char *)pixels, image->width, image->height, 0, (unsigned char *)output, newWidth, newHeight, 0, 4);
 
-    int format = image->format;
-    
-    RL_FREE(pixels);
-    RL_FREE(image->data);
+        int format = image->format;
+        
+        RL_FREE(pixels);
+        RL_FREE(image->data);
 
-    image->data = output;
-    image->width = newWidth;
-    image->height = newHeight;
-    image->format = UNCOMPRESSED_R8G8B8A8;
+        image->data = output;
+        image->width = newWidth;
+        image->height = newHeight;
+        image->format = UNCOMPRESSED_R8G8B8A8;
 
-    ImageFormat(image, format);  // Reformat 32bit RGBA image to original format
+        ImageFormat(image, format);  // Reformat 32bit RGBA image to original format
+    }
 }
 
 // Resize and image to new size using Nearest-Neighbor scaling algorithm