Skip to content

Commit b335693

Browse files
Merge pull request livecode#5688 from runrevmark/ffi-objc
[[ FFI ]] Obj-C
2 parents 2677e79 + 44eded1 commit b335693

29 files changed

Lines changed: 1889 additions & 29 deletions

docs/notes/bugfix-19945.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Mac native layer snapshots are offset by 1 pixel

engine/src/font.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,11 @@ int32_t MCFontGetSize(MCFontRef self)
236236
return self->size;
237237
}
238238

239+
void *MCFontGetHandle(MCFontRef self)
240+
{
241+
return self->fontstruct->fid;
242+
}
243+
239244
bool MCFontHasPrinterMetrics(MCFontRef self)
240245
{
241246
// MW-2013-12-19: [[ Bug 11559 ]] If the font has a nil font, do nothing.

engine/src/font.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ void MCFontRelease(MCFontRef font);
5252
MCNameRef MCFontGetName(MCFontRef font);
5353
MCFontStyle MCFontGetStyle(MCFontRef font);
5454
int32_t MCFontGetSize(MCFontRef font);
55+
void *MCFontGetHandle(MCFontRef font);
5556

5657
bool MCFontHasPrinterMetrics(MCFontRef font);
5758

engine/src/module-canvas.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4798,6 +4798,12 @@ void MCCanvasFontSetSize(uinteger_t p_size, MCCanvasFontRef &x_font)
47984798
MCCanvasFontSetProps(x_font, t_name, t_style, p_size);
47994799
}
48004800

4801+
MC_DLLEXPORT_DEF
4802+
void MCCanvasFontGetHandle(MCCanvasFontRef p_font, void*& r_handle)
4803+
{
4804+
r_handle = MCFontGetHandle(MCCanvasFontGetMCFont(p_font));
4805+
}
4806+
48014807
// Operations
48024808

48034809
MCCanvasRectangleRef MCCanvasFontMeasureTextTypographicBoundsWithTransform(MCStringRef p_text, MCCanvasFontRef p_font, const MCGAffineTransform &p_transform)

engine/src/module-canvas.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ extern "C" MC_DLLEXPORT void MCCanvasFontGetItalic(MCCanvasFontRef p_font, bool
500500
extern "C" MC_DLLEXPORT void MCCanvasFontSetItalic(bool p_italic, MCCanvasFontRef &x_font);
501501
extern "C" MC_DLLEXPORT void MCCanvasFontGetSize(MCCanvasFontRef p_font, uinteger_t &r_size);
502502
extern "C" MC_DLLEXPORT void MCCanvasFontSetSize(uinteger_t p_size, MCCanvasFontRef &x_font);
503+
extern "C" MC_DLLEXPORT void MCCanvasFontGetHandle(MCCanvasFontRef p_font, void*& r_handle);
503504

504505
// Operations
505506
extern "C" MC_DLLEXPORT void MCCanvasFontMeasureTextTypographicBounds(MCStringRef p_text, MCCanvasFontRef p_font, MCCanvasRectangleRef& r_rect);

engine/src/native-layer-mac.mm

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,17 @@
102102

103103
bool MCNativeLayerMac::doPaint(MCGContextRef p_context)
104104
{
105+
NSRect t_bounds = [m_view bounds];
106+
105107
// Get an image rep suitable for storing the cached bitmap
106108
if (m_cached == nil)
107109
{
108-
m_cached = [[m_view bitmapImageRepForCachingDisplayInRect:[m_view bounds]] retain];
110+
m_cached = [[m_view bitmapImageRepForCachingDisplayInRect:t_bounds] retain];
109111
}
110112

111113
// Draw the widget
112114
bzero([m_cached bitmapData], [m_cached bytesPerRow] * [m_cached pixelsHigh]);
113-
[m_view cacheDisplayInRect:[m_view bounds] toBitmapImageRep:m_cached];
115+
[m_view cacheDisplayInRect:t_bounds toBitmapImageRep:m_cached];
114116

115117
// Turn the NSBitmapImageRep into something we can actually draw
116118
MCGRaster t_raster;
@@ -124,9 +126,9 @@
124126
if (!MCGImageCreateWithRasterNoCopy(t_raster, t_gimage))
125127
return false;
126128

127-
// Draw the image
128-
// FG-2014-10-10: a y offset of 1 is needed to keep things lined up, for some reason...
129-
MCGRectangle rect = {{0, 1}, {MCGFloat(t_raster.width), MCGFloat(t_raster.height)}};
129+
// Draw the image - we use the bounds width/height as the cached bitmap
130+
// might be retina sized (NSBitmapImageRep has not concept of resolution)
131+
MCGRectangle rect = {{0, 0}, {MCGFloat(t_bounds.size.width), MCGFloat(t_bounds.size.height)}};
130132
MCGContextDrawImage(p_context, t_gimage, rect, kMCGImageFilterNone);
131133
MCGImageRelease(t_gimage);
132134

engine/src/native-layer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ void MCNativeLayer::OnDetach()
8282

8383
bool MCNativeLayer::OnPaint(MCGContextRef p_context)
8484
{
85+
/* We must make sure that any geometry changes are in sync if we are
86+
* rendering to context, but are not visible */
87+
if (m_can_render_to_context && m_defer_geometry_changes)
88+
{
89+
doSetViewportGeometry(m_deferred_viewport_rect);
90+
doSetGeometry(m_deferred_rect);
91+
m_viewport_rect = m_deferred_viewport_rect;
92+
m_rect = m_deferred_rect;
93+
m_defer_geometry_changes = false;
94+
}
8595
return doPaint(p_context);
8696
}
8797

engine/src/widget.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,18 @@ Boolean MCWidget::maskrect(const MCRectangle& p_rect)
970970
return drect.width != 0 && drect.height != 0;
971971
}
972972

973+
void MCWidget::SetName(MCExecContext& ctxt, MCStringRef p_name)
974+
{
975+
MCNewAutoNameRef t_old_name = getname();
976+
977+
MCControl::SetName(ctxt, p_name);
978+
979+
if (!MCNameIsEqualTo(*t_old_name, getname(), kMCStringOptionCompareExact))
980+
{
981+
recompute();
982+
}
983+
}
984+
973985
void MCWidget::SetDisabled(MCExecContext& ctxt, uint32_t p_part_id, bool p_flag)
974986
{
975987
bool t_is_disabled;

engine/src/widget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ class MCWidget: public MCControl, public MCMixinObjectHandle<MCWidget>
191191
virtual void OnOpen();
192192
virtual void OnClose();
193193

194+
virtual void SetName(MCExecContext& ctxt, MCStringRef p_name);
194195
virtual void SetDisabled(MCExecContext& ctxt, uint32_t part, bool flag);
195196

196197
void GetKind(MCExecContext& ctxt, MCNameRef& r_kind);

extensions/extensions.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
'libraries/json/json.lcb',
2828

2929
'widgets/androidbutton/androidbutton.lcb',
30+
'widgets/macbutton/macbutton.lcb',
3031
'widgets/browser/browser.lcb',
3132
#’widgets/chart/chart.lcb',
3233
#'widgets/checkbox/checkbox.lcb',

0 commit comments

Comments
 (0)