Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit da31bc8

Browse files
committed
[[ Bug 14997 ]] Factor out creating rep with file from creating rep with file / url reference. Ensure canvas images are loaded from file only.
1 parent 2d289fc commit da31bc8

File tree

7 files changed

+59
-37
lines changed

7 files changed

+59
-37
lines changed

docs/lcb/notes/14997.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# LiveCode Builder Host Library
2+
3+
# [14997] image with file accepts url prefix

engine/src/cmdse.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1912,7 +1912,7 @@ void MCMM::exec_ctxt(MCExecContext &ctxt)
19121912
MCImageRep *t_rep;
19131913
t_rep = nil;
19141914

1915-
if (MCImageGetFileRepForStackContext(ep.getcstring(), MCdefaultstackptr, t_rep))
1915+
if (MCImageGetRepForReferenceWithStackContext(ep.getcstring(), MCdefaultstackptr, t_rep))
19161916
{
19171917
MCImagePrepareRepForDisplayAtDensity(t_rep, MCdefaultstackptr->getdevicescale());
19181918

engine/src/ifile.cpp

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ void MCImage::reopen(bool p_newfile, bool p_lock_size)
414414

415415
////////////////////////////////////////////////////////////////////////////////
416416

417-
bool MCImageGetFileRepForStackContext(MCStringRef p_filename, MCStack *p_stack, MCImageRep *&r_rep)
417+
bool MCImageGetRepForReferenceWithStackContext(MCStringRef p_reference, MCStack *p_stack, MCImageRep *&r_rep)
418418
{
419419
bool t_success = true;
420420

@@ -423,44 +423,55 @@ bool MCImageGetFileRepForStackContext(MCStringRef p_filename, MCStack *p_stack,
423423

424424
MCAutoStringRef t_prefixless;
425425
// skip over any file: / binfile: url prefix
426-
if (MCStringBeginsWith(p_filename, MCSTR("file:"), kMCStringOptionCompareCaseless))
426+
if (MCStringBeginsWith(p_reference, MCSTR("file:"), kMCStringOptionCompareCaseless))
427427
{
428-
MCStringCopySubstring(p_filename, MCRangeMake(5, UINDEX_MAX), &t_prefixless);
429-
p_filename = *t_prefixless;
428+
MCStringCopySubstring(p_reference, MCRangeMake(5, UINDEX_MAX), &t_prefixless);
429+
p_reference = *t_prefixless;
430430
}
431-
else if (MCStringBeginsWith(p_filename, MCSTR("binfile:"), kMCStringOptionCompareCaseless))
431+
else if (MCStringBeginsWith(p_reference, MCSTR("binfile:"), kMCStringOptionCompareCaseless))
432432
{
433-
MCStringCopySubstring(p_filename, MCRangeMake(8, UINDEX_MAX), &t_prefixless);
434-
p_filename = *t_prefixless;
433+
MCStringCopySubstring(p_reference, MCRangeMake(8, UINDEX_MAX), &t_prefixless);
434+
p_reference = *t_prefixless;
435435
}
436436

437-
if (MCPathIsRemoteURL(p_filename))
438-
t_success = MCImageRepGetReferenced(p_filename, t_rep);
437+
if (MCPathIsRemoteURL(p_reference))
438+
t_success = MCImageRepGetReferenced(p_reference, t_rep);
439+
else
440+
t_success = MCImageGetRepForFileWithStackContext(p_reference, p_stack, t_rep);
441+
442+
if (t_success)
443+
r_rep = t_rep;
444+
445+
return t_success;
446+
}
447+
448+
bool MCImageGetRepForFileWithStackContext(MCStringRef p_filename, MCStack *p_stack, MCImageRep *&r_rep)
449+
{
450+
bool t_success;
451+
t_success = true;
452+
453+
MCImageRep *t_rep;
454+
t_rep = nil;
455+
456+
// with local filenames, first check if absolute path
457+
if (MCPathIsAbsolute(p_filename))
458+
t_success = MCImageRepGetDensityMapped(p_filename, t_rep);
439459
else
440460
{
441-
// with local filenames, first check if absolute path
442-
if (MCPathIsAbsolute(p_filename))
443-
t_success = MCImageRepGetDensityMapped(p_filename, t_rep);
444-
else
461+
// else try to resolve from stack file location
462+
MCAutoStringRef t_path;
463+
t_success = p_stack->resolve_relative_path(p_filename, &t_path);
464+
if (t_success)
465+
t_success = MCImageRepGetDensityMapped(*t_path, t_rep);
466+
467+
// else try to resolve from current folder
468+
if (t_success && t_rep == nil)
445469
{
446-
// else try to resolve from stack file location
447-
MCAutoStringRef t_path;
448-
t_success = p_stack->resolve_relative_path(p_filename, &t_path);
470+
MCAutoStringRef t_resolved;
471+
t_success = MCS_resolvepath(p_filename, &t_resolved);
449472
if (t_success)
450-
t_success = MCImageRepGetDensityMapped(*t_path, t_rep);
451-
452-
// else try to resolve from current folder
453-
if (t_success && t_rep == nil)
454-
{
455-
MCAutoStringRef t_resolved;
456-
t_success = MCS_resolvepath(p_filename, &t_resolved);
457-
if (t_success)
458-
t_success = MCImageRepGetDensityMapped(*t_resolved, t_rep);
459-
}
473+
t_success = MCImageRepGetDensityMapped(*t_resolved, t_rep);
460474
}
461-
// AL-2014-01-17: [[ Bug 11684 ]] If image file isn't found, return false
462-
if (t_success)
463-
t_success = t_rep != nil;
464475
}
465476

466477
if (t_success)
@@ -469,7 +480,7 @@ bool MCImageGetFileRepForStackContext(MCStringRef p_filename, MCStack *p_stack,
469480
return t_success;
470481
}
471482

472-
bool MCImageGetFileRepForResource(MCStringRef p_resource_file, MCImageRep *&r_rep)
483+
bool MCImageGetRepForResource(MCStringRef p_resource_file, MCImageRep *&r_rep)
473484
{
474485
MCAutoStringRef t_path;
475486
if (!MCResourceResolvePath(p_resource_file, &t_path))

engine/src/image.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2452,7 +2452,7 @@ bool MCImage::setfilename(MCStringRef p_filename)
24522452

24532453
if (t_success)
24542454
{
2455-
t_success = MCImageGetFileRepForStackContext(p_filename, getstack(), t_rep);
2455+
t_success = MCImageGetRepForReferenceWithStackContext(p_filename, getstack(), t_rep);
24562456

24572457
// MM-2013-11-27: [[ Bug 11522 ]] If we can't get the image rep, make sure we still store the filename.
24582458
if (t_success)

engine/src/image.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,14 @@ bool MCImageBitmapToPICT(MCImageBitmap *p_bitmap, MCMacSysPictHandle &r_pict);
138138
#include "image_rep.h"
139139

140140
// IM-2013-10-30: [[ FullscreenMode ]] Factor out image rep creation & preparation
141-
bool MCImageGetFileRepForStackContext(MCStringRef p_filename, MCStack *p_stack, MCImageRep *&r_rep);
142-
void MCImagePrepareRepForDisplayAtDensity(MCImageRep *p_rep, MCGFloat p_density);
141+
// Retrieve an image rep for the given file path.
142+
bool MCImageGetRepForFileWithStackContext(MCStringRef p_path, MCStack *p_stack, MCImageRep *&r_rep);
143+
// Retrieve an image rep for the given reference, which may be a file path or a url.
144+
bool MCImageGetRepForReferenceWithStackContext(MCStringRef p_reference, MCStack *p_stack, MCImageRep *&r_rep);
145+
// Retrieve an image rep for the named resource.
146+
bool MCImageGetRepForResource(MCStringRef p_resource_file, MCImageRep *&r_rep);
143147

144-
bool MCImageGetFileRepForResource(MCStringRef p_resource_file, MCImageRep *&r_rep);
148+
void MCImagePrepareRepForDisplayAtDensity(MCImageRep *p_rep, MCGFloat p_density);
145149

146150
class MCMutableImageRep : public MCImageRep
147151
{

engine/src/image_rep_densitymapped.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,10 @@ bool MCImageGetScaledFiles(MCStringRef p_base, MCStringRef p_extension, MCImageS
499499
}
500500
}
501501

502+
// Fail if we don't find any matching files.
503+
if (t_success)
504+
t_success = t_count > 0;
505+
502506
if (t_success)
503507
{
504508
r_list = t_list;

engine/src/module-canvas.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,7 +1760,7 @@ void MCCanvasImageMakeWithPath(MCStringRef p_path, MCCanvasImageRef &r_image)
17601760
MCImageRep *t_image_rep;
17611761
t_image_rep = nil;
17621762

1763-
if (!MCImageGetFileRepForStackContext(p_path, MCwidgetobject->getstack(), t_image_rep))
1763+
if (!MCImageGetRepForFileWithStackContext(p_path, MCwidgetobject->getstack(), t_image_rep))
17641764
{
17651765
MCCanvasThrowError(kMCCanvasImageRepReferencedErrorTypeInfo);
17661766
return;
@@ -1775,7 +1775,7 @@ void MCCanvasImageMakeWithResourceFile(MCStringRef p_resource, MCCanvasImageRef
17751775
MCImageRep *t_image_rep;
17761776
t_image_rep = nil;
17771777

1778-
if (!MCImageGetFileRepForResource(p_resource, t_image_rep))
1778+
if (!MCImageGetRepForResource(p_resource, t_image_rep))
17791779
{
17801780
MCCanvasThrowError(kMCCanvasImageRepReferencedErrorTypeInfo);
17811781
return;

0 commit comments

Comments
 (0)