ImageProcessor.swift 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // ImageProcessor.swift
  3. // Kingfisher
  4. //
  5. // Created by WANG WEI on 2016/08/26.
  6. // Copyright © 2016年 Wei Wang. All rights reserved.
  7. //
  8. import Foundation
  9. enum ImageProcessItem {
  10. case image(Image)
  11. case data(Data)
  12. }
  13. protocol ImageProcessor {
  14. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image?
  15. }
  16. typealias ProcessorImp = ((ImageProcessItem, KingfisherOptionsInfo) -> Image?)
  17. extension ImageProcessor {
  18. func append(another: ImageProcessor) -> ImageProcessor {
  19. return GeneralProcessor { item, options in
  20. if let image = self.process(item: item, options: options) {
  21. return another.process(item: .image(image), options: options)
  22. } else {
  23. return nil
  24. }
  25. }
  26. }
  27. }
  28. struct GeneralProcessor: ImageProcessor {
  29. let p: ProcessorImp
  30. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  31. return p(item, options)
  32. }
  33. }
  34. struct DefaultProcessor: ImageProcessor {
  35. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  36. switch item {
  37. case .image(let image):
  38. return image
  39. case .data(let data):
  40. return Image.kf_image(data: data, scale: options.scaleFactor, preloadAllGIFData: options.preloadAllGIFData)
  41. }
  42. }
  43. }
  44. struct RoundCornerImageProcessor: ImageProcessor {
  45. let cornerRadius: Float
  46. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
  47. switch item {
  48. case .image(let image):
  49. return image
  50. case .data(let data):
  51. return (DefaultProcessor() |> self).process(item: .data(data), options: options)
  52. }
  53. }
  54. }
  55. infix operator |>: DefaultPrecedence
  56. func |>(left: ImageProcessor, right: ImageProcessor) -> ImageProcessor {
  57. return left.append(another: right)
  58. }