Slide 1

Slide 1 text

!UTV[VLJ ೋ࣍ݩίʔυΛಡΈऔΓ΍͘͢͢ΔͨΊʹ ը໘Λڧ੍తʹ໌Δ͘͢Δͷ͸ ΋͏΍Ίʹ͠·ͤΜ͔ʁ👀 J04%$+BQBO 

Slide 2

Slide 2 text

ΊͬͪΌἤͬͯΔλΠτϧͬΆ͍Ͱ͕͢ ͋͘·Ͱ͝ఏҊͰ͢🙇 

Slide 3

Slide 3 text

ೋ࣍ݩόʔίʔυͷը໘ᚶ͍͠໰୊ 

Slide 4

Slide 4 text

ͳͥը໘Λ໌Δ͘͢Δͷ͔ʁ 

Slide 5

Slide 5 text

ϝϦοτɾσϝϦοτ 

Slide 6

Slide 6 text

ϝϦοτ w໌Δ͘͢Δ͜ͱͰεϜʔζʹεΩϟϯ͢Δ͜ͱ͕Ͱ͖Δ 
 ʢը໘͕҉͍ͱεΩϟϯ͕೉͘͠ͳΔʣ 

Slide 7

Slide 7 text

ᚶ͍͠ʂ σϝϦοτ 

Slide 8

Slide 8 text

wᚶ͍͠ w࣮૷తͳίετ΋͔͔Δ σϝϦοτ 

Slide 9

Slide 9 text

wը໘ભҠલͷً౓Λอ࣋ 
 ֘౰ը໘͔ΒҠಈͨ͠Βݩͷً౓ʹ໭͢ 
 wϢʔβʔ͕֘౰ը໘Ͱҙਤతʹ໌Δ͞ΛԼ͛ͨΒ ͦͷঢ়ଶ͸อ࣋͢Δ ྫʣ࣮૷తͳίετ΋͔͔Δ 

Slide 10

Slide 10 text

ΈΜͳͷ໨ΛकΓ͍ͨ 

Slide 11

Slide 11 text

ͦ͜Ͱ&%3 

Slide 12

Slide 12 text

&%3ͱ͸ʁ &YUFOEFE%ZOBNJD3BOHF ֦ுμΠφϛοΫϨϯδ 
 "QQMFͷ)%3ςΫϊϩδʔ 

Slide 13

Slide 13 text

֦ு͕͋ΔͳΒඪ४͕͋Γ·͢ʂ 

Slide 14

Slide 14 text

4%3 4UBOEBSE%ZOBNJD3BOHF 3(#ͷࠇΛ നΛͱͯ͠දݱ͢Δैདྷ ͷํ๏ 

Slide 15

Slide 15 text

&%3ͱ͸ʁ &YUFOEFE%ZOBNJD3BOHF &%3Ͱ͸ΑΓେ͖ͳ஋Λར༻ͯ͠͞Βʹ ໌Δ͍ըૉΛදݱ͢Δ͜ͱ͕Ͱ͖Δ ϔουϧʔϜ௒͑Δ஋͸ΫϦοϓ͞ΕΔ ϔουϧʔϜͷ஋͸σΟεϓϨΠͷछྨ΍ 
 ໌Δ͞ͷมԽपғͷঢ়گͰมΘΔ 

Slide 16

Slide 16 text

&%3ͷྫ 

Slide 17

Slide 17 text

&%3ͱ͸ʁ Ҿ༻ɿIUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED SDR EDR 

Slide 18

Slide 18 text

͍͢͝ 

Slide 19

Slide 19 text

Ͳ͏΍ͬͯ23ʹ&%3Λద༻͢Δͷʁ🧐 

Slide 20

Slide 20 text

ެࣜͷTNQMFϓϩδΣΫτ͕͋Γ·͢ʂ 

Slide 21

Slide 21 text

"QQMF4BNQMFϓϩδΣΫτ wIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFJNBHF HFOFSBUJOH@BO@BOJNBUJPO@XJUI@B@DPSF@JNBHF@SFOEFS@EFTUJOBUJPO 

Slide 22

Slide 22 text

͜ΕΛ23όʔδϣϯʹ 
 ͪ͠Ό͑͹ྑͦ͞͏ʂ 

Slide 23

Slide 23 text

&%3ͷ23ίʔυ࡞Δ  23ίʔυͷ࡞੒  .5,7JFXΛར༻ͯ͠)FBESPPNΛऔಘ  )FBESPPNΛదԠͨ͠$*$PMPSΛ࡞੒  $*'JMUFSCMFOE8JUI.BTL Ͱ߹੒͢Δ  .5,7JFXʹ߹੒ͨ͠ը૾Λදࣔ͢Δ 

Slide 24

Slide 24 text

 23ίʔυͷੜ੒ let filter = CIFilter.qrCodeGenerator() filter.message = Data("Πάβϛφʔڧ͍".utf8) filter.correctionLevel = "H" return filter.outputImage 

Slide 25

Slide 25 text

 .FUBMΛར༻ͯ͠)FBESPPNΛऔಘ Π.5,7JFXΛ༻ҙ ϩ.5,7JFX%FMFHBUFΛ࢖͍ESBXϝιου Λܧঝ͢Δ ϋҾ਺ͷWJFX͔ΒIFBESPPNΛऔಘ͢Δ 

Slide 26

Slide 26 text

🚨஫ҙ🚨 

Slide 27

Slide 27 text

.FUBMͰ&%3Λར༻͢Δ৚݅ wJ04Ҏ߱ w࣮ػͷΈ 4JNVMBUPS͸࢖͑ͳ͍ʣ 

Slide 28

Slide 28 text

.FUBMͰ&%3Λར༻͢Δ৚݅ w୺຤͕࣋ͭ࠷େͷ)FBESPPNΛද͢ w)FBESPPNͷ஋͕ΑΓେ͖͍৔߹ͷΈ&%3Λ࢖͏͜ͱ͕Ͱ ͖Δ UIScreen.main.potentialEDRHeadroom 

Slide 29

Slide 29 text

࣮૷ͷͨΊͷొ৔ਓ෺ MetalView Renderer ContentView 

Slide 30

Slide 30 text

࣮૷ͷͨΊͷొ৔ਓ෺ MetalView Renderer ContentView 

Slide 31

Slide 31 text

.FUBM7JFX w.5,7JFXΛ6*7JFX3FQSFTFOUBCMFΛར ༻ͯ͠4XJGU6*ͷੈքʹ࣋ͪࠐΉ 
 .FUBMϑϨʔϜϫʔΫΛ࢖༻ͯ͠(16্ͰඳըΛ ߦ͏ͨΊͷ6*7JFXͷαϒΫϥε w.5,7JFX͸ϨϯμϦϯάΛ௚઀୲౰͠ͳ͍ wϨϯμϦϯάΛߦ͏ͨΊͷσϦήʔτΛ࢖༻ MetalView ViewRepresentable delegate 

Slide 32

Slide 32 text

࣮૷ͷͨΊͷొ৔ਓ෺ MetalView Renderer ContentView 

Slide 33

Slide 33 text

3FOEFSFS wάϥϑΟοΫεঢ়ଶͷॳظԽΛ୲౰ w.5,7JFX%FMFHBUFͱͯ͠ඞཁͳ ESBX ϝιου΋࣮૷ w͔͠͠ɺͲͷΑ͏ͳը૾Λඳը͢Δ͔Λܾఆ ͢Δ௚઀తͳ੹೚ΛෛΘͳ͍ wJNBHF1SPWJEFSΛ࢖༻ͯ͠ɺඳը͢Δ $**NBHFΛऔಘ͢Δ Renderer MTLCommandQueue draw() CIContext imageProvider 

Slide 34

Slide 34 text

࣮૷ͷͨΊͷొ৔ਓ෺ MetalView Renderer ContentView 

Slide 35

Slide 35 text

$POUFOU7JFX w3FOEFSFSͱ.FUBM7JFXͷ઀ଓ w͜͜Ͱ23ͷը૾Λ3FOEFSFSʹ౉͢ wϨϯμϦϯά͞ΕΔ$**NBHFΛఏڙ͢Δ 
 ˠ23ίʔυΛੜ੒͠ɺ&%3Λར༻ͨ͠৭ ۭؒͷϑΟϧλʔͱ૊Έ߹Θͤͨ$**NBHF Λ.FUBM7JFXʹ౉͢ ContentView provider() Generate QRCode 

Slide 36

Slide 36 text

Π .5,7JFXΛ༻ҙ 

Slide 37

Slide 37 text

public struct MetalKitView: UIViewRepresentable { @StateObject public var renderer: Renderer public func makeUIView(context: Context) -> MTKView { let view = MTKView(frame: .zero, device: renderer.device) view.preferredFramesPerSecond = 10 view.delegate = renderer if let layer = view.layer as? CAMetalLayer { layer.wantsExtendedDynamicRangeContent = true layer.colorspace = CGColorSpace( name: CGColorSpace.extendedLinearDisplayP3 ) view.colorPixelFormat = MTLPixelFormat.rgba16Float } return view } 

Slide 38

Slide 38 text

ϩ .5,7JFX%FMFHBUFΛ࢖͍ 
 ESBXϝιουΛܧঝ 

Slide 39

Slide 39 text

public struct MetalKitView: UIViewRepresentable { @StateObject public var renderer: Renderer public func makeUIView(context: Context) -> MTKView { let view = MTKView(frame: .zero, device: renderer.device) view.preferredFramesPerSecond = 10 view.delegate = renderer if let layer = view.layer as? CAMetalLayer { layer.wantsExtendedDynamicRangeContent = true layer.colorspace = CGColorSpace( name: CGColorSpace.extendedLinearDisplayP3 ) view.colorPixelFormat = MTLPixelFormat.rgba16Float } return view } 

Slide 40

Slide 40 text

public struct MetalKitView: UIViewRepresentable { @StateObject public var renderer: Renderer public func makeUIView(context: Context) -> MTKView { let view = MTKView(frame: .zero, device: renderer.device) view.preferredFramesPerSecond = 10 view.delegate = renderer if let layer = view.layer as? CAMetalLayer { layer.wantsExtendedDynamicRangeContent = true layer.colorspace = CGColorSpace( name: CGColorSpace.extendedLinearDisplayP3 ) view.colorPixelFormat = MTLPixelFormat.rgba16Float } return view } EDRΛ࢖͏͜ͱΛڭ͑Δ 

Slide 41

Slide 41 text

ϋ Ҿ਺ͷWJFX͔ΒIFBESPPNΛऔಘ͢Δ extension Renderer: MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { let headroom: CGFloat = view.window ?. screen.currentEDRHeadroom ?? 1.0 guard var image = self.imageProvider(contentScaleFactor, headroom) else { return } 

Slide 42

Slide 42 text

 )FBESPPNΛదԠͨ͠$*$PMPSΛ࡞੒ 

Slide 43

Slide 43 text

·ͣ$POUFOU7JFXΛ࡞੒ 

Slide 44

Slide 44 text

public struct ContentView: View { var content: String public var body: some View { MetalKitView( renderer: Renderer( imageProvider: { (scaleFactor: CGFloat, headroom: CGFloat) -> CIImage? in ……… 

Slide 45

Slide 45 text

let colorSpace = CGColorSpace( name: CGColorSpace.extendedLinearSRGB )! let maxFillColor = CIColor( red: headroom, green: headroom, blue: headroom, colorSpace: colorSpace ) ContentView 

Slide 46

Slide 46 text

 $*'JMUFSCMFOE8JUI.BTL Ͱ߹੒͢Δ let fillImage = CIImage(color: maxFillColor) let maskFilter = CIFilter.blendWithMask() maskFilter.maskImage = image maskFilter.inputImage = fillImage maskFilter.outputImage ? . cropped( .. . ) ContentView 

Slide 47

Slide 47 text

·ͱΊ MetalView ViewRepresentable ContentView provider() delegate Renderer MTLCommandQueue draw() CIContext imageProvider 

Slide 48

Slide 48 text

&%3ΛదԠͨ͠23ίʔυ wը໘શମͰ͸ͳ͘ɺҰ෦෼͚ͩΛ໌Δ͘͢Δ͜ͱ ͕Ͱ͖Δ wᚶ͘͠ͳ͍ʂ w໨ʹ༏͍͔͠΋ʁ 

Slide 49

Slide 49 text

044ެ։🎉 ελʔ͍ͩ͘͞⭐ wIUUQTHJUIVCDPNUTV[VLJIBTIJ&%3@4XJGU 

Slide 50

Slide 50 text

&%3ͷσϝϦοτ 

Slide 51

Slide 51 text

&%3ͷσϝϦοτ wϢʔβʔʹཧղ͞Εͳ͍ 
 ɹˠόάͩͱࢥΘΕΔ w͙͢ʹ໌Δ͘ͳΒͳ͍ 
 ɹˠपғͷঢ়گʹԠͯ͡ಈతʹ໌Δ͕͞มΘΔ w͢Ͱʹը໘ͷً౓͕໌Δ͍৔߹ͷରԠΛߟ͑Δඞཁ͕͋Δ 

Slide 52

Slide 52 text

͝ར༻͸ܭըతʹʂ 

Slide 53

Slide 53 text

ࣗݾ঺հ ܈അݝࡏॅ🐎 %F/"Ͱ1PDPDIB։ൃ 
 ϞτϠϑ झຯ 
 4QMBUPPO🦑 
 ݸਓΞϓϦ։ൃ📱 
 

Slide 54

Slide 54 text

ݸਓΞϓϦ঺հ 

Slide 55

Slide 55 text

ऴΘΓ