mirror of https://github.com/LIJI32/SameBoy.git
94 lines
3.3 KiB
Objective-C
94 lines
3.3 KiB
Objective-C
#define GBLayoutInternal
|
|
#import "GBVerticalLayout.h"
|
|
|
|
@implementation GBVerticalLayout
|
|
|
|
- (instancetype)initWithTheme:(GBTheme *)theme
|
|
{
|
|
self = [super initWithTheme:theme];
|
|
if (!self) return nil;
|
|
|
|
CGSize resolution = self.resolution;
|
|
|
|
CGRect screenRect = {0,};
|
|
screenRect.size.width = self.hasFractionalPixels? resolution.width : floor(resolution.width / 160) * 160;
|
|
screenRect.size.height = screenRect.size.width / 160 * 144;
|
|
|
|
screenRect.origin.x = (resolution.width - screenRect.size.width) / 2;
|
|
screenRect.origin.y = (resolution.height - screenRect.size.height) / 2;
|
|
self.fullScreenRect = screenRect;
|
|
|
|
double screenBorderWidth = MIN(screenRect.size.width / 40, 16 * self.factor);
|
|
screenRect.origin.y = self.minY + MIN(screenBorderWidth * 2, 20 * self.factor);
|
|
self.screenRect = screenRect;
|
|
|
|
double controlAreaStart = screenRect.origin.y + screenRect.size.height + MIN(screenBorderWidth * 2, 20 * self.factor);
|
|
|
|
self.selectLocation = (CGPoint){
|
|
MIN(resolution.width / 4, 120 * self.factor),
|
|
MIN(resolution.height - 80 * self.factor, (resolution.height - controlAreaStart) * 0.75 + controlAreaStart)
|
|
};
|
|
|
|
self.startLocation = (CGPoint){
|
|
resolution.width - self.selectLocation.x,
|
|
self.selectLocation.y
|
|
};
|
|
|
|
double buttonRadius = 36 * self.factor;
|
|
CGSize buttonsDelta = [self buttonDeltaForMaxHorizontalDistance:resolution.width / 2 - buttonRadius * 2 - screenBorderWidth * 2];
|
|
|
|
self.dpadLocation = (CGPoint) {
|
|
self.selectLocation.x,
|
|
self.selectLocation.y - 140 * self.factor
|
|
};
|
|
|
|
CGPoint buttonsCenter = {
|
|
resolution.width - self.dpadLocation.x,
|
|
self.dpadLocation.y,
|
|
};
|
|
|
|
self.aLocation = (CGPoint) {
|
|
round(buttonsCenter.x + buttonsDelta.width / 2),
|
|
round(buttonsCenter.y - buttonsDelta.height / 2)
|
|
};
|
|
|
|
self.bLocation = (CGPoint) {
|
|
round(buttonsCenter.x - buttonsDelta.width / 2),
|
|
round(buttonsCenter.y + buttonsDelta.height / 2)
|
|
};
|
|
|
|
self.abComboLocation = buttonsCenter;
|
|
|
|
double controlsTop = self.dpadLocation.y - 80 * self.factor;
|
|
double middleSpace = self.bLocation.x - buttonRadius - (self.dpadLocation.x + 80 * self.factor);
|
|
|
|
if (theme.renderingPreview) {
|
|
UIGraphicsBeginImageContextWithOptions((CGSize){resolution.width / 8, resolution.height / 8}, true, 1);
|
|
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1 / 8.0, 1 / 8.0);
|
|
}
|
|
else {
|
|
UIGraphicsBeginImageContextWithOptions(resolution, true, 1);
|
|
}
|
|
[self drawBackground];
|
|
[self drawScreenBezels];
|
|
|
|
[self drawThemedLabelsWithBlock:^{
|
|
if (controlsTop - controlAreaStart > 24 * self.factor + screenBorderWidth * 2) {
|
|
[self drawLogoInVerticalRange:(NSRange){controlAreaStart + screenBorderWidth, 24 * self.factor}
|
|
controlPadding:0];
|
|
}
|
|
else if (middleSpace > 160 * self.factor) {
|
|
[self drawLogoInVerticalRange:(NSRange){controlAreaStart + screenBorderWidth, 24 * self.factor}
|
|
controlPadding:self.dpadLocation.x * 2];
|
|
}
|
|
|
|
[self drawLabels];
|
|
}];
|
|
|
|
self.background = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
return self;
|
|
}
|
|
|
|
@end
|