SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
commit a48f251039c3305f411f2ca85b363fe5bc95297f parent 9a2e8e1acfc3ff3cac39441d7afeca710fa93632 Author: Lior Halphon <LIJI32@gmail.com> Date: Sun, 20 Feb 2022 14:23:49 +0200 New and faster palette viewer Diffstat:
| M | Cocoa/Document.h | 5 | +++-- |
| M | Cocoa/Document.m | 40 | +++------------------------------------- |
| M | Cocoa/Document.xib | 137 | +++++++++++++------------------------------------------------------------------ |
| D | Cocoa/GBColorCell.h | 5 | ----- |
| D | Cocoa/GBColorCell.m | 49 | ------------------------------------------------- |
| M | Cocoa/GBObjectView.m | 2 | +- |
| A | Cocoa/GBPaletteView.h | 6 | ++++++ |
| A | Cocoa/GBPaletteView.m | 91 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | Cocoa/GBPaletteViewRow.xib | 74 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
9 files changed, 200 insertions(+), 209 deletions(-)
diff --git a/Cocoa/Document.h b/Cocoa/Document.h @@ -6,9 +6,10 @@ #include "GBOSDView.h" @class GBCheatWindowController; +@class GBPaletteView; @class GBObjectView; -@interface Document : NSDocument <NSWindowDelegate, GBImageViewDelegate, NSTableViewDataSource, NSTableViewDelegate, NSSplitViewDelegate> +@interface Document : NSDocument <NSWindowDelegate, GBImageViewDelegate, NSSplitViewDelegate> @property (nonatomic, readonly) GB_gameboy_t *gb; @property (nonatomic, strong) IBOutlet GBView *view; @property (nonatomic, strong) IBOutlet NSTextView *consoleOutput; @@ -30,7 +31,7 @@ @property (nonatomic, strong) IBOutlet NSTabView *vramTabView; @property (nonatomic, strong) IBOutlet NSPanel *vramWindow; @property (nonatomic, strong) IBOutlet NSTextField *vramStatusLabel; -@property (nonatomic, strong) IBOutlet NSTableView *paletteTableView; +@property (nonatomic, strong) IBOutlet GBPaletteView *paletteView; @property (nonatomic, strong) IBOutlet GBObjectView *objectView; @property (nonatomic, strong) IBOutlet NSPanel *printerFeedWindow; @property (nonatomic, strong) IBOutlet NSImageView *feedImageView; diff --git a/Cocoa/Document.m b/Cocoa/Document.m @@ -12,7 +12,7 @@ #import "BigSurToolbar.h" #import "GBPaletteEditorController.h" #import "GBObjectView.h" - +#import "GBPaletteView.h" #define GB_MODEL_PAL_BIT_OLD 0x1000 @@ -1477,7 +1477,7 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) /* Palettes */ { dispatch_async(dispatch_get_main_queue(), ^{ - [self.paletteTableView reloadData]; + [self.paletteView reloadData:self]; }); } break; @@ -1751,7 +1751,7 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) window_rect.size.height = 512 + height_diff + 48; break; case 3: - window_rect.size.height = 20 * 16 + height_diff + 34; + window_rect.size.height = 24 * 16 + height_diff; break; default: @@ -1824,45 +1824,11 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) } } -- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView -{ - if (tableView == self.paletteTableView) { - return 16; /* 8 BG palettes, 8 OBJ palettes*/ - } - return 0; -} - - (GB_oam_info_t *)oamInfo { return _oamInfo; } -- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row -{ - NSUInteger columnIndex = [[tableView tableColumns] indexOfObject:tableColumn]; - if (tableView == self.paletteTableView) { - if (columnIndex == 0) { - return [NSString stringWithFormat:@"%s %u", row >= 8 ? "Object" : "Background", (unsigned)(row & 7)]; - } - - uint8_t *palette_data = GB_get_direct_access(&gb, row >= 8? GB_DIRECT_ACCESS_OBP : GB_DIRECT_ACCESS_BGP, NULL, NULL); - - uint16_t index = columnIndex - 1 + (row & 7) * 4; - return @((palette_data[(index << 1) + 1] << 8) | palette_data[(index << 1)]); - } - return nil; -} - -- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row -{ - return false; -} - -- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row -{ - return false; -} - - (IBAction)showVRAMViewer:(id)sender { [self.vramWindow makeKeyAndOrderFront:sender]; diff --git a/Cocoa/Document.xib b/Cocoa/Document.xib @@ -27,7 +27,7 @@ <outlet property="memoryWindow" destination="mRm-dL-mCj" id="VPR-lu-vtI"/> <outlet property="objectView" destination="fIM-GT-QXJ" id="jzs-q8-Z2U"/> <outlet property="osdView" destination="MX4-l2-7NE" id="Am7-fq-uvu"/> - <outlet property="paletteTableView" destination="gfC-d3-dmq" id="fTC-eL-Qg3"/> + <outlet property="paletteView" destination="ZuP-AU-0pA" id="ef6-27-Bci"/> <outlet property="printerFeedWindow" destination="NdE-0B-WCf" id="yVK-cS-NOJ"/> <outlet property="tilemapImageView" destination="LlK-tV-bjv" id="nSY-Xd-BjZ"/> <outlet property="tilemapMapButton" destination="YIJ-Qc-SIZ" id="BB7-Gg-7XP"/> @@ -341,17 +341,17 @@ </textFieldCell> </textField> <tabView fixedFrame="YES" drawsBackground="NO" type="noTabsNoBorder" initialItem="pXb-od-Wb1" translatesAutoresizingMaskIntoConstraints="NO" id="AZz-Mh-rPA"> - <rect key="frame" x="0.0" y="24" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <font key="font" metaFont="system"/> <tabViewItems> <tabViewItem label="Tileset" identifier="1" id="pXb-od-Wb1"> <view key="view" id="lCG-Gt-XMF"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QcQ-ex-36R" customClass="GBImageView"> - <rect key="frame" x="0.0" y="0.0" width="512" height="384"/> + <rect key="frame" x="0.0" y="24" width="512" height="384"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="axesIndependently" id="pXc-O8-jg5"/> <connections> @@ -360,7 +360,7 @@ </connections> </imageView> <popUpButton focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TLv-xS-X5K"> - <rect key="frame" x="4" y="388" width="128" height="17"/> + <rect key="frame" x="4" y="412" width="128" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <popUpButtonCell key="cell" type="roundRect" title="None" bezelStyle="roundedRect" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="border" focusRingType="none" imageScaling="proportionallyDown" inset="2" selectedItem="G8p-CH-PlV" id="1jI-s4-4YY"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> @@ -392,7 +392,7 @@ </connections> </popUpButton> <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fL6-2S-Rgd"> - <rect key="frame" x="452" y="388" width="56" height="17"/> + <rect key="frame" x="452" y="412" width="56" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> <buttonCell key="cell" type="roundRect" title="Grid" bezelStyle="roundedRect" alignment="center" controlSize="mini" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="pDn-9a-Se6"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/> @@ -407,11 +407,11 @@ </tabViewItem> <tabViewItem label="Tilemap" identifier="2" id="kaY-Wy-Yt1"> <view key="view" id="c6j-cM-dDx"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DhM-Em-hj7"> - <rect key="frame" x="385" y="388" width="63" height="17"/> + <rect key="frame" x="385" y="412" width="63" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> <buttonCell key="cell" type="roundRect" title="Scrolling" bezelStyle="roundedRect" alignment="center" controlSize="mini" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="P2E-5t-BN9"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/> @@ -422,7 +422,7 @@ </connections> </button> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LlK-tV-bjv" customClass="GBImageView"> - <rect key="frame" x="0.0" y="0.0" width="512" height="384"/> + <rect key="frame" x="0.0" y="24" width="512" height="384"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="axesIndependently" id="RvP-El-ILj"/> <connections> @@ -431,7 +431,7 @@ </connections> </imageView> <popUpButton focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="loB-0k-Qff"> - <rect key="frame" x="4" y="388" width="128" height="17"/> + <rect key="frame" x="4" y="412" width="128" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <popUpButtonCell key="cell" type="roundRect" title="Effective Palettes" bezelStyle="roundedRect" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="border" focusRingType="none" imageScaling="proportionallyDown" inset="2" selectedItem="oUH-Sa-Ec1" id="Eij-Cp-URa"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> @@ -464,7 +464,7 @@ </connections> </popUpButton> <popUpButton focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YIJ-Qc-SIZ"> - <rect key="frame" x="135" y="388" width="96" height="17"/> + <rect key="frame" x="135" y="412" width="96" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <popUpButtonCell key="cell" type="roundRect" title="Effective Tilemap" bezelStyle="roundedRect" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="border" focusRingType="none" imageScaling="proportionallyDown" inset="2" selectedItem="XRF-Vj-3gs" id="3W1-Db-wDn"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> @@ -482,7 +482,7 @@ </connections> </popUpButton> <popUpButton focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="k4c-Vg-MBu"> - <rect key="frame" x="235" y="388" width="96" height="17"/> + <rect key="frame" x="235" y="412" width="96" height="17"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <popUpButtonCell key="cell" type="roundRect" title="Effective Tileset" bezelStyle="roundedRect" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="border" focusRingType="none" imageScaling="proportionallyDown" inset="2" selectedItem="CRe-dX-rzY" id="h53-sb-Odg"> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> @@ -504,18 +504,18 @@ </tabViewItem> <tabViewItem label="Objects" identifier="" id="a08-eg-Maw"> <view key="view" ambiguous="YES" id="EiO-p0-3xn"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <scrollView fixedFrame="YES" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vhq-K4-baH"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <clipView key="contentView" ambiguous="YES" id="JYu-CM-49p"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view ambiguous="YES" id="fIM-GT-QXJ" customClass="GBObjectView"> - <rect key="frame" x="0.0" y="0.0" width="512" height="682"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="706"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> </view> </subviews> @@ -523,11 +523,11 @@ </clipView> <edgeInsets key="contentInsets" left="0.0" right="0.0" top="0.0" bottom="0.0"/> <scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="zUB-xg-cXq"> - <rect key="frame" x="0.0" y="392" width="512" height="16"/> + <rect key="frame" x="0.0" y="416" width="512" height="16"/> <autoresizingMask key="autoresizingMask"/> </scroller> <scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="jMe-gO-ERw"> - <rect key="frame" x="496" y="0.0" width="16" height="408"/> + <rect key="frame" x="496" y="0.0" width="16" height="432"/> <autoresizingMask key="autoresizingMask"/> </scroller> </scrollView> @@ -536,106 +536,13 @@ </tabViewItem> <tabViewItem label="Palettes" identifier="" id="vLb-Nh-UYE"> <view key="view" id="qIg-ci-WTA"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <scrollView fixedFrame="YES" borderType="none" horizontalLineScroll="20" horizontalPageScroll="10" verticalLineScroll="20" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="iSs-Ow-wwb"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> + <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZuP-AU-0pA" customClass="GBPaletteView"> + <rect key="frame" x="0.0" y="0.0" width="512" height="432"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <clipView key="contentView" ambiguous="YES" id="bP9-su-zQw"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="18" id="gfC-d3-dmq"> - <rect key="frame" x="0.0" y="0.0" width="512" height="408"/> - <autoresizingMask key="autoresizingMask"/> - <size key="intercellSpacing" width="3" height="2"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - <tableViewGridLines key="gridStyleMask" dashed="YES"/> - <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> - <tableColumns> - <tableColumn width="125" minWidth="40" maxWidth="1000" id="Aje-FQ-fUw"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" refusesFirstResponder="YES" title="Text Cell" id="Ygb-xo-X8v"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - </tableColumn> - <tableColumn width="93" minWidth="40" maxWidth="1000" id="4EN-0j-lda"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" refusesFirstResponder="YES" title="Text Cell" id="3a2-A4-XQW" customClass="GBColorCell"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - </tableColumn> - <tableColumn width="93" minWidth="10" maxWidth="3.4028234663852886e+38" id="syl-os-nSf"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" refusesFirstResponder="YES" alignment="left" title="Text Cell" id="3ql-bn-AxP" customClass="GBColorCell"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - </tableColumn> - <tableColumn width="93" minWidth="10" maxWidth="3.4028234663852886e+38" id="Qw3-u2-c1s"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" refusesFirstResponder="YES" title="Text Cell" id="9at-mH-PWc" customClass="GBColorCell"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - </tableColumn> - <tableColumn width="93" minWidth="10" maxWidth="3.4028234663852886e+38" id="gTl-gN-qLn"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" refusesFirstResponder="YES" alignment="left" title="Text Cell" id="dY8-Zu-d4t" customClass="GBColorCell"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - </tableColumn> - </tableColumns> - <connections> - <outlet property="dataSource" destination="-2" id="F2f-nK-QTN"/> - <outlet property="delegate" destination="-2" id="7hn-MM-DDD"/> - </connections> - </tableView> - </subviews> - </clipView> - <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="OS3-sw-bjv"> - <rect key="frame" x="-100" y="-100" width="510" height="16"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="4HA-2m-8TZ"> - <rect key="frame" x="-100" y="-100" width="15" height="102"/> - <autoresizingMask key="autoresizingMask"/> - </scroller> - </scrollView> + </customView> </subviews> </view> </tabViewItem> diff --git a/Cocoa/GBColorCell.h b/Cocoa/GBColorCell.h @@ -1,5 +0,0 @@ -#import <Cocoa/Cocoa.h> - -@interface GBColorCell : NSTextFieldCell - -@end diff --git a/Cocoa/GBColorCell.m b/Cocoa/GBColorCell.m @@ -1,49 +0,0 @@ -#import "GBColorCell.h" - -static inline double scale_channel(uint8_t x) -{ - x &= 0x1F; - return x / 31.0; -} - -@implementation GBColorCell -{ - NSInteger _integerValue; -} - -- (void)setObjectValue:(id)objectValue -{ - _integerValue = [objectValue integerValue]; - uint8_t r = _integerValue & 0x1F, - g = (_integerValue >> 5) & 0x1F, - b = (_integerValue >> 10) & 0x1F; - super.objectValue = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"$%04x", (uint16_t)(_integerValue & 0x7FFF)] attributes:@{ - NSForegroundColorAttributeName: r * 3 + g * 4 + b * 2 > 120? [NSColor blackColor] : [NSColor whiteColor], - NSFontAttributeName: [NSFont userFixedPitchFontOfSize:12] - }]; -} - -- (NSInteger)integerValue -{ - return _integerValue; -} - -- (int)intValue -{ - return (int)_integerValue; -} - - -- (NSColor *) backgroundColor -{ - /* Todo: color correction */ - uint16_t color = self.integerValue; - return [NSColor colorWithRed:scale_channel(color) green:scale_channel(color >> 5) blue:scale_channel(color >> 10) alpha:1.0]; -} - -- (BOOL)drawsBackground -{ - return true; -} - -@end diff --git a/Cocoa/GBObjectView.m b/Cocoa/GBObjectView.m @@ -102,7 +102,7 @@ } NSRect frame = self.frame; - CGFloat newHeight = MAX(68 * ((length + 3) / 4), 408); + CGFloat newHeight = MAX(68 * ((length + 3) / 4), self.superview.frame.size.height); frame.origin.y -= newHeight - frame.size.height; frame.size.height = newHeight; self.frame = frame; diff --git a/Cocoa/GBPaletteView.h b/Cocoa/GBPaletteView.h @@ -0,0 +1,6 @@ +#import <Cocoa/Cocoa.h> +#import "Document.h" + +@interface GBPaletteView : NSView +- (void)reloadData:(Document *)document; +@end diff --git a/Cocoa/GBPaletteView.m b/Cocoa/GBPaletteView.m @@ -0,0 +1,91 @@ +#import "GBPaletteView.h" + +@interface GBPaletteViewItem : NSObject +@property IBOutlet NSView *view; +@property (strong) IBOutlet NSTextField *label; +@property (strong) IBOutlet NSTextField *color0; +@property (strong) IBOutlet NSTextField *color1; +@property (strong) IBOutlet NSTextField *color2; +@property (strong) IBOutlet NSTextField *color3; +@end + +@implementation GBPaletteViewItem +@end + +@implementation GBPaletteView +{ + NSMutableArray<NSTextField *> *_colors; +} + +- (instancetype)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + _colors = [NSMutableArray array]; + CGFloat height = self.frame.size.height; + for (unsigned i = 0; i < 16; i++) { + GBPaletteViewItem *item = [[GBPaletteViewItem alloc] init]; + [[NSBundle mainBundle] loadNibNamed:@"GBPaletteViewRow" owner:item topLevelObjects:nil]; + [self addSubview:item.view]; + [item.view setFrameOrigin:NSMakePoint(0, height - (i * 24) - 24)]; + item.label.stringValue = [NSString stringWithFormat:@"%@ %d", i < 8? @"Background" : @"Object", i % 8]; + item.view.autoresizingMask = NSViewMaxXMargin | NSViewMinYMargin; + [_colors addObject:item.color0]; + [_colors addObject:item.color1]; + [_colors addObject:item.color2]; + [_colors addObject:item.color3]; + + } + return self; +} + +- (void)reloadData:(Document *)document +{ + GB_gameboy_t *gb = document.gb; + uint8_t *bg = GB_get_direct_access(gb, GB_DIRECT_ACCESS_BGP, NULL, NULL); + uint8_t *obj = GB_get_direct_access(gb, GB_DIRECT_ACCESS_OBP, NULL, NULL); + + for (unsigned i = 0; i < 4 * 8 * 2; i++) { + uint8_t index = i % (4 * 8); + uint8_t *palette = i >= 4 * 8 ? obj : bg; + uint16_t color = (palette[(index << 1) + 1] << 8) | palette[(index << 1)]; + uint32_t nativeColor = GB_convert_rgb15(gb, color, false); + + uint8_t r = color & 0x1F, + g = (color >> 5) & 0x1F, + b = (color >> 10) & 0x1F; + + NSTextField *field = _colors[i]; + field.stringValue = [NSString stringWithFormat:@"$%04X", color]; + field.textColor = r * 3 + g * 4 + b * 2 > 120? [NSColor blackColor] : [NSColor whiteColor]; + field.toolTip = [NSString stringWithFormat:@"Red: %d, Green: %d, Blue: %d", r, g, b]; + field.backgroundColor = [NSColor colorWithRed:(nativeColor & 0xFF) / 255.0 + green:((nativeColor >> 8) & 0xFF) / 255.0 + blue:((nativeColor >> 16) & 0xFF) / 255.0 + alpha:1.0]; + } +} + +- (void)drawRect:(NSRect)dirtyRect +{ + NSRect frame = self.frame; + if (@available(macOS 10.14, *)) { + [[NSColor alternatingContentBackgroundColors].lastObject setFill]; + } + else { + [[NSColor colorWithDeviceWhite:0.96 alpha:1] setFill]; + } + for (unsigned i = 1; i <= 8; i++) { + NSRectFill(NSMakeRect(0, frame.size.height - i * 24 * 2, frame.size.width, 24)); + } + + if (@available(macOS 10.14, *)) { + [[NSColor alternatingContentBackgroundColors].firstObject setFill]; + } + else { + [[NSColor controlBackgroundColor] setFill]; + } + for (unsigned i = 0; i < 8; i++) { + NSRectFill(NSMakeRect(0, frame.size.height - i * 24 * 2 - 24, frame.size.width, 24)); + } +} +@end diff --git a/Cocoa/GBPaletteViewRow.xib b/Cocoa/GBPaletteViewRow.xib @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14868" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> + <dependencies> + <deployment identifier="macosx"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14868"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="GBPaletteViewItem"> + <connections> + <outlet property="color0" destination="ypt-t4-Mf3" id="Bam-dX-hHk"/> + <outlet property="color1" destination="KkX-Z8-Sqi" id="uCl-UT-PWu"/> + <outlet property="color2" destination="jDk-Ej-4yI" id="Xjs-el-m3s"/> + <outlet property="color3" destination="7PI-YE-fTk" id="7J8-aH-LEO"/> + <outlet property="label" destination="NOK-yI-LKh" id="AK3-g5-H7a"/> + <outlet property="view" destination="c22-O7-iKe" id="DPx-8k-YQB"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <customView id="c22-O7-iKe"> + <rect key="frame" x="0.0" y="0.0" width="512" height="24"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <subviews> + <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ypt-t4-Mf3"> + <rect key="frame" x="131" y="0.0" width="96" height="24"/> + <autoresizingMask key="autoresizingMask"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" borderStyle="border" alignment="center" title="$7FFF" drawsBackground="YES" id="sKu-Uy-2LG"> + <font key="font" size="13" name="Menlo-Regular"/> + <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KkX-Z8-Sqi"> + <rect key="frame" x="226" y="0.0" width="96" height="24"/> + <autoresizingMask key="autoresizingMask"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" borderStyle="border" alignment="center" title="$7FFF" drawsBackground="YES" id="9LH-TF-W1L"> + <font key="font" size="13" name="Menlo-Regular"/> + <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jDk-Ej-4yI"> + <rect key="frame" x="321" y="0.0" width="96" height="24"/> + <autoresizingMask key="autoresizingMask"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" borderStyle="border" alignment="center" title="$7FFF" drawsBackground="YES" id="arE-i5-zCC"> + <font key="font" size="13" name="Menlo-Regular"/> + <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7PI-YE-fTk"> + <rect key="frame" x="416" y="0.0" width="96" height="24"/> + <autoresizingMask key="autoresizingMask"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" borderStyle="border" alignment="center" title="$7FFF" drawsBackground="YES" id="ZbU-nE-FsE"> + <font key="font" size="13" name="Menlo-Regular"/> + <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textFieldCell> + </textField> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NOK-yI-LKh"> + <rect key="frame" x="4" y="0.0" width="121" height="20"/> + <autoresizingMask key="autoresizingMask"/> + <textFieldCell key="cell" lineBreakMode="clipping" title="Background 0" id="qM4-cY-SDE"> + <font key="font" usesAppearanceFont="YES"/> + <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + </subviews> + <point key="canvasLocation" x="139" y="31"/> + </customView> + </objects> +</document>
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.