text: /*
   * This file is part of the SDWebImage package.
   * (c) Olivier Poitrey <rs@dailymotion.com>
   *
   * Created by james <https://github.com/mystcolor> on 9/28/11.
   *
   * For the full copyright and license information, please view the LICENSE
   * file that was distributed with this source code.
   */
  
  #import "SDWebImageDecoder.h"
  
  @implementation UIImage (ForceDecode)
  
  + (UIImage *)decodedImageWithImage:(UIImage *)image {
      // while downloading huge amount of images
      // autorelease the bitmap context
      // and all vars to help system to free memory
      // when there are memory warning.
      // on iOS7, do not forget to call
      // [[SDImageCache sharedImageCache] clearMemory];
  
      if (image == nil) { // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error
          return nil;
      }
  
      @autoreleasepool{
          // do not decode animated images
          if (image.images) { return image; }
          
          CGImageRef imageRef = image.CGImage;
          
          CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef);
          BOOL anyAlpha = (alpha == kCGImageAlphaFirst ||
                           alpha == kCGImageAlphaLast ||
                           alpha == kCGImageAlphaPremultipliedFirst ||
                           alpha == kCGImageAlphaPremultipliedLast);
          
          if (anyAlpha) { return image; }
          
          // current
          CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef));
          CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef);
          
          bool unsupportedColorSpace = (imageColorSpaceModel == 0 || imageColorSpaceModel == -1 || imageColorSpaceModel == kCGColorSpaceModelCMYK || imageColorSpaceModel == kCGColorSpaceModelIndexed);
          if (unsupportedColorSpace)
              colorspaceRef = CGColorSpaceCreateDeviceRGB();
          
          size_t width = CGImageGetWidth(imageRef);
          size_t height = CGImageGetHeight(imageRef);
          NSUInteger bytesPerPixel = 4;
          NSUInteger bytesPerRow = bytesPerPixel * width;
          NSUInteger bitsPerComponent = 8;
          
          CGContextRef context = CGBitmapContextCreate(NULL,
                                                       width,
                                                       height,
                                                       bitsPerComponent,
                                                       bytesPerRow,
                                                       colorspaceRef,
                                                       kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
          
          // Draw the image into the context and retrieve the new image, which will now have an alpha layer
          CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
          CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(context);
          UIImage *imageWithAlpha = [UIImage imageWithCGImage:imageRefWithAlpha scale:image.scale orientation:image.imageOrientation];
          
          if (unsupportedColorSpace)
              CGColorSpaceRelease(colorspaceRef);
          
          CGContextRelease(context);
          CGImageRelease(imageRefWithAlpha);
          
          return imageWithAlpha;
      }
  }
  
  @end
  