Skip to content

Commit

Permalink
Final scale factor tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
Ricci Adams committed Jan 8, 2012
1 parent d449347 commit 303f91c
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 24 deletions.
Binary file not shown.
1 change: 1 addition & 0 deletions Source/SwiffLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
NSUInteger m_sublayerCount;
SwiffSparseArray m_sublayers;

CGFloat m_scaleFactor;
CGAffineTransform m_baseAffineTransform;
CGAffineTransform m_scaledAffineTransform;

Expand Down
29 changes: 17 additions & 12 deletions Source/SwiffLayer.m
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ - (void) _calculateGeometryForPlacedObject: (SwiffPlacedObject *) placedObject
transform = CGAffineTransformConcat(transform, m_scaledAffineTransform);

CGAffineTransform scaleFactorTransform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);

CGRect bounds = [definition renderBounds];
bounds = sExpandRect(CGRectApplyAffineTransform(bounds, scaleFactorTransform));
transform = CGAffineTransformConcat(CGAffineTransformInvert(scaleFactorTransform), transform);
Expand Down Expand Up @@ -190,7 +190,6 @@ - (CGFloat) _scaleFactorForPlacedObject:(SwiffPlacedObject *)placedObject hairli
{
CGAffineTransform t = CGAffineTransformIdentity;
t = CGAffineTransformConcat(t, [placedObject affineTransform]);
t = CGAffineTransformConcat(t, m_scaledAffineTransform);

// Take a 1x1 square at (0,0) and apply the transform to it.
//
Expand All @@ -212,7 +211,8 @@ - (CGFloat) _scaleFactorForPlacedObject:(SwiffPlacedObject *)placedObject hairli
CGFloat max2 = MAX(leftLineLength, rightLineLength);
CGFloat max3 = MAX(max1, max2);

return SwiffScaleCeil(max3, hairlineWidth);
CGFloat contentsScale = [self contentsScale];
return SwiffScaleCeil(max3, 1) * (contentsScale * m_scaleFactor);
}


Expand Down Expand Up @@ -362,14 +362,16 @@ - (void) _addSublayersForPlacedObjects:(NSArray *)placedObjects

[sublayer setBounds:bounds];
[sublayer setAnchorPoint:CGPointMake((-bounds.origin.x / bounds.size.width), (-bounds.origin.y / bounds.size.height))];
[sublayer setContentsScale:[self contentsScale]];
[sublayer setContentsScale:1];
[sublayer setDelegate:self];
[sublayer setZPosition:depth];
[sublayer setNeedsDisplay];

// Toggle geometry flipped flag until [self addSublayer:sublayer] in _updateGeometryForSublayer:withPlacedObject:
[sublayer setGeometryFlipped:YES];

if ([sublayer contentsAreFlipped] != [self contentsAreFlipped]) {
[sublayer setGeometryFlipped:YES];
}

SwiffLog(@"View", @"adding sublayer at depth %d", (int)depth);

CALayer *existing = SwiffSparseArrayGetValueAtIndex(&self->m_sublayers, depth);
Expand Down Expand Up @@ -410,7 +412,6 @@ - (void) _updateSublayersForPlacedObjects:(NSArray *)placedObjects
CALayer *sublayer = SwiffSparseArrayGetValueAtIndex(&m_sublayers, depth);

if (!sublayer) {
NSLog(@"nothing to update!");
continue;
}

Expand Down Expand Up @@ -525,7 +526,7 @@ - (void) _transitionToFrame:(SwiffFrame *)newFrame fromFrame:(SwiffFrame *)oldFr
[self _addSublayersForPlacedObjects:sublayerAdds];
[self _invalidatePlacedObjects:rectInvalidates];

// Do updates last, as it calls +[CATransaction flush]
// Do updates last
[sublayerUpdates addObjectsFromArray:sublayerAdds];
[self _updateSublayersForPlacedObjects:sublayerUpdates];

Expand Down Expand Up @@ -554,7 +555,11 @@ - (void) setBounds:(CGRect)bounds

CGSize movieSize = [m_movie stageRect].size;

m_scaledAffineTransform = CGAffineTransformMakeScale(bounds.size.width / movieSize.width, bounds.size.height / movieSize.height);
CGFloat sx = bounds.size.width / movieSize.width;
CGFloat sy = bounds.size.height / movieSize.height;

m_scaleFactor = sx > sy ? sx : sy;
m_scaledAffineTransform = CGAffineTransformMakeScale(sx, sy);

[m_contentLayer setContentsScale:[self contentsScale]];
[m_contentLayer setFrame:bounds];
Expand Down Expand Up @@ -610,6 +615,7 @@ - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
CGContextFillRect(context, [layer bounds]);
}

SwiffRendererSetScaleFactorHint(m_renderer, [self contentsScale]);
SwiffRendererSetBaseAffineTransform(m_renderer, &m_scaledAffineTransform);
SwiffRendererSetPlacedObjects(m_renderer, filteredObjects ? filteredObjects : placedObjects);
SwiffRendererRender(m_renderer, context);
Expand Down Expand Up @@ -666,9 +672,6 @@ - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
// CGContextSetCTM() is private, so immitate it with concatenation
CGContextConcatCTM(context, CGAffineTransformInvert(base)); // CGContextSetCTM(context, CGAffineTransformIdentity)

// Refactor in contentScale
CGFloat contentsScale = [layer contentsScale];

CGFloat renderTranslationX = [[layer valueForKey:SwiffRenderTranslationXKey] doubleValue];
CGFloat renderTranslationY = [[layer valueForKey:SwiffRenderTranslationYKey] doubleValue];
CGFloat renderScaleFactor = [[layer valueForKey:SwiffRenderScaleFactorKey] doubleValue];
Expand All @@ -689,9 +692,11 @@ - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
CGFloat hairlineWidth = SwiffRendererGetHairlineWidth(m_renderer);
CGFloat fillHairlineWidth = SwiffRendererGetFillHairlineWidth(m_renderer);

CGFloat contentsScale = [self contentsScale];
SwiffRendererSetHairlineWidth(m_renderer, hairlineWidth * contentsScale);
SwiffRendererSetFillHairlineWidth(m_renderer, fillHairlineWidth * contentsScale);

SwiffRendererSetScaleFactorHint(m_renderer, 1.0);
SwiffRendererSetBaseAffineTransform(m_renderer, &base);
SwiffRendererSetPlacedObjects(m_renderer, placedObjects);
SwiffRendererRender(m_renderer, context);
Expand Down
4 changes: 2 additions & 2 deletions Source/SwiffRenderer.m
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,12 @@ static void sTracePathStrokeAdvanced(
CGContextRef context = state->context;

CGFloat scale = state->scaleFactorHint;
CGFloat offset = (lround(width) % 2) ? (scale / 2) : 0;
CGFloat offset = (lround(width * state->scaleFactorHint) % 2) ? ((1.0 / state->scaleFactorHint) / 2) : 0;

CGFloat x = NAN, y = NAN, controlX = NAN, controlY = NAN, moveX = NAN, moveY = NAN;

SwiffPathOperation prevOp = SwiffPathOperationMove;
SwiffPathOperation op;
SwiffPathOperation op = SwiffPathOperationMove;
SwiffPathOperation nextOp = *operations++;

nextOperation:
Expand Down
6 changes: 3 additions & 3 deletions Source/SwiffSoundDefinition.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
@class SwiffMovie, SwiffSoundDefinition;

// C-based API, for audio callbacks
extern CFDataRef SwiffSoundDefinitionGetData(SwiffSoundDefinition *definition);
extern NSUInteger SwiffSoundDefinitionGetOffsetForFrame(SwiffSoundDefinition *definition, CFIndex frame);
extern NSUInteger SwiffSoundDefinitionGetLengthForFrame(SwiffSoundDefinition *definition, CFIndex frame);
extern CFDataRef SwiffSoundDefinitionGetData(SwiffSoundDefinition *definition);
extern CFIndex SwiffSoundDefinitionGetOffsetForFrame(SwiffSoundDefinition *definition, CFIndex frame);
extern CFIndex SwiffSoundDefinitionGetLengthForFrame(SwiffSoundDefinition *definition, CFIndex frame);

@class SwiffSoundStreamBlock;

Expand Down
14 changes: 7 additions & 7 deletions Source/SwiffSoundDefinition.m
Original file line number Diff line number Diff line change
Expand Up @@ -152,23 +152,23 @@ CFDataRef SwiffSoundDefinitionGetData(SwiffSoundDefinition *self)
}


extern NSUInteger SwiffSoundDefinitionGetOffsetForFrame(SwiffSoundDefinition *self, CFIndex frame)
extern CFIndex SwiffSoundDefinitionGetOffsetForFrame(SwiffSoundDefinition *self, CFIndex frame)
{
if ((frame >= 0) && (frame < self->m_framesCount)) {
return self->m_frames[frame];
}

return NSNotFound;
return kCFNotFound;
}


extern NSUInteger SwiffSoundDefinitionGetLengthForFrame(SwiffSoundDefinition *self, CFIndex frame)
extern CFIndex SwiffSoundDefinitionGetLengthForFrame(SwiffSoundDefinition *self, CFIndex frame)
{
NSUInteger offset1 = SwiffSoundDefinitionGetOffsetForFrame(self, frame);
if (offset1 == NSNotFound) return 0;
CFIndex offset1 = SwiffSoundDefinitionGetOffsetForFrame(self, frame);
if (offset1 == kCFNotFound) return 0;

NSUInteger offset2 = SwiffSoundDefinitionGetOffsetForFrame(self, frame + 1);
if (offset2 == NSNotFound) {
CFIndex offset2 = SwiffSoundDefinitionGetOffsetForFrame(self, frame + 1);
if (offset2 == kCFNotFound) {
offset2 = CFDataGetLength(SwiffSoundDefinitionGetData(self));
}

Expand Down
1 change: 1 addition & 0 deletions Source/SwiffView.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ - (id) initWithFrame:(CGRect)frame movie:(SwiffMovie *)movie

if ((self = [super initWithFrame:frame])) {
m_layer = [[SwiffLayer alloc] initWithMovie:movie];
[m_layer setContentsScale:[[UIScreen mainScreen] scale]];
[[self layer] addSublayer:m_layer];
[self _layoutMovieLayer];
}
Expand Down

0 comments on commit 303f91c

Please sign in to comment.