Slide 1

Slide 1 text

Patrick B. Gibson Tilde Inc. FAST IMAGE MANIPULATION

Slide 2

Slide 2 text

THE PROBLEM.

Slide 3

Slide 3 text

THE SOLUTION?

Slide 4

Slide 4 text

OPENGL.

Slide 5

Slide 5 text

■ CoreImage in a Nutshell ■ Problems with CoreImage ■ OpenGL in a Nutshell ■ Using OpenGL with CoreImage Effectively OVERVIEW

Slide 6

Slide 6 text

■ Apply effects ( lters) to images ■ Deferred rendering ■ GPU powered – with caveats ■ High-level API ■ Mac OS X version different from iOS version COREIMAGE

Slide 7

Slide 7 text

CODE. GITHUB.COM/PATR1CK/ TLDCOREIMAGEDEMO

Slide 8

Slide 8 text

// Create image CIImage *testImage = [CIImage imageWithCGImage:someCGImageRef]; // Set the new filter value CIFilter *contrastFilter = [CIFilter filterWithName:@"CIColorControls"]; [contrastFilter setDefaults]; [contrastFilter setValue:[NSNumber numberWithDouble:contrastSlider.value] forKey:@"inputContrast"]; // Apply the filter [contrastFilter setValue:testImage forKey:@"inputImage"]; // Get the results CIImage *outputImage = [contrastFilter outputImage]; COREIMAGE

Slide 9

Slide 9 text

// Get the context CGContextRef context = UIGraphicsGetCurrentContext(); // Render the image CGImageRef imageRef = [_coreImageContext createCGImage:coreImage fromRect:coreImage.extent]; // Draw it on screen CGContextSaveGState(context); CGContextTranslateCTM(context, 0.0f, coreImage.extent.size.height); CGContextScaleCTM(context, 1.0f, -1.0f); CGContextDrawImage(context, rect, imageRef); CGContextRestoreGState(context); CGImageRelease(imageRef); COREIMAGE

Slide 10

Slide 10 text

COREIMAGE

Slide 11

Slide 11 text

DEMO.

Slide 12

Slide 12 text

■ Ludicrous speed ■ Fully GPU powered ■ Very low level API ■ Steep learning curve ■ But, ludicrous speed OPENGLES

Slide 13

Slide 13 text

■ CAEAGLLayer and EAGLContext ■ Frame buffer ■ Render buffer ■ Depth buffer ■ Stencil buffer, Accumulation buffer (not used here) OPENGLES

Slide 14

Slide 14 text

glGenFramebuffers(1, &frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); glGenRenderbuffers(1, &renderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); [_eaglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); OPENGLES

Slide 15

Slide 15 text

glGenRenderbuffers(1, &depthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); glViewport(0, 0, backingWidth, backingHeight); [self drawView] OPENGLES

Slide 16

Slide 16 text

// drawView glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); [_coreImageContext drawImage:coreImage inRect:self.bounds fromRect:coreImage.extent]; glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); [_eaglContext presentRenderbuffer:GL_RENDERBUFFER];

Slide 17

Slide 17 text

DEMO.

Slide 18

Slide 18 text

REAL WORLD EXAMPLE: BRESSON

Slide 19

Slide 19 text

■ Cheat like crazy ■ Some CoreImage lters are slow (CIToneCurve) ■ CADisplayLink ■ Do not taunt TLDFastCoreImageView NOTES

Slide 20

Slide 20 text

THANK YOU.

Slide 21

Slide 21 text

@PATR1CK GITHUB.COM/PATR1CK/ TLDCOREIMAGEDEMO TILDE.IO