This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
4.2 KiB
91 lines
4.2 KiB
// |
|
// Created by Gabriel Handford on 3/1/09. |
|
// Copyright 2009-2013. All rights reserved. |
|
// Created by John Boiles on 10/20/11. |
|
// Copyright (c) 2011. All rights reserved |
|
// Modified by Felix Schulze on 2/11/13. |
|
// Copyright 2013. All rights reserved. |
|
// |
|
// Permission is hereby granted, free of charge, to any person |
|
// obtaining a copy of this software and associated documentation |
|
// files (the "Software"), to deal in the Software without |
|
// restriction, including without limitation the rights to use, |
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
// copies of the Software, and to permit persons to whom the |
|
// Software is furnished to do so, subject to the following |
|
// conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be |
|
// included in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
// OTHER DEALINGS IN THE SOFTWARE. |
|
// |
|
|
|
#import "UIImage+Compare.h" |
|
|
|
@implementation UIImage (Compare) |
|
|
|
- (BOOL)compareWithImage:(UIImage *)image |
|
{ |
|
NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size."); |
|
|
|
// The images have the equal size, so we could use the smallest amount of bytes because of byte padding |
|
size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage)); |
|
size_t referenceImageSizeBytes = CGImageGetHeight(self.CGImage) * minBytesPerRow; |
|
void *referenceImagePixels = calloc(1, referenceImageSizeBytes); |
|
void *imagePixels = calloc(1, referenceImageSizeBytes); |
|
|
|
if (!referenceImagePixels || !imagePixels) { |
|
free(referenceImagePixels); |
|
free(imagePixels); |
|
return NO; |
|
} |
|
|
|
CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels, |
|
CGImageGetWidth(self.CGImage), |
|
CGImageGetHeight(self.CGImage), |
|
CGImageGetBitsPerComponent(self.CGImage), |
|
minBytesPerRow, |
|
CGImageGetColorSpace(self.CGImage), |
|
(CGBitmapInfo)kCGImageAlphaPremultipliedLast |
|
); |
|
CGContextRef imageContext = CGBitmapContextCreate(imagePixels, |
|
CGImageGetWidth(image.CGImage), |
|
CGImageGetHeight(image.CGImage), |
|
CGImageGetBitsPerComponent(image.CGImage), |
|
minBytesPerRow, |
|
CGImageGetColorSpace(image.CGImage), |
|
(CGBitmapInfo)kCGImageAlphaPremultipliedLast |
|
); |
|
|
|
CGFloat scaleFactor = [UIScreen mainScreen].scale; |
|
CGContextScaleCTM(referenceImageContext, scaleFactor, scaleFactor); |
|
CGContextScaleCTM(imageContext, scaleFactor, scaleFactor); |
|
|
|
if (!referenceImageContext || !imageContext) { |
|
CGContextRelease(referenceImageContext); |
|
CGContextRelease(imageContext); |
|
free(referenceImagePixels); |
|
free(imagePixels); |
|
return NO; |
|
} |
|
|
|
CGContextDrawImage(referenceImageContext, CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), self.CGImage); |
|
CGContextDrawImage(imageContext, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage); |
|
CGContextRelease(referenceImageContext); |
|
CGContextRelease(imageContext); |
|
|
|
BOOL imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0); |
|
free(referenceImagePixels); |
|
free(imagePixels); |
|
return imageEqual; |
|
} |
|
|
|
@end
|
|
|