diff --git a/ui/data.js b/ui/data.js index d8d52368..6dfebbe8 100755 --- a/ui/data.js +++ b/ui/data.js @@ -567,6 +567,184 @@ function getGIDBefore(gid, ribbon, search, data){ } +// Get "count" of GIDs starting with a given gid ("from") +// +// NOTE: this will not include the 'from' GID in the resulting list, +// unless inclusive is set to true. +// NOTE: count can be either negative or positive, this will indicate +// load direction... +// NOTE: this can calculate the ribbon number where the image is located. +// NOTE: if an image can be in more than one ribbon, one MUST suply the +// correct ribbon number... +// +// XXX do we need more checking??? +// XXX Race condition: when this is called while DATA is not yet fully +// loaded (old data), the from gid will not be present in +// DATA.ribbons... +function getGIDsAfter(count, gid, ribbon, inclusive, data){ + if(count == 0){ + return [] + } + // default values... + gid = gid == null ? getImageGID() : gid + data = data == null ? DATA : data + ribbon = ribbon == null ? getRibbonIndex() : ribbon + count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count + ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon + + // get a local gid... + gid = data.ribbons[ribbon].indexOf(gid) < 0 ? getGIDBefore(gid, ribbon) : gid + ribbon = data.ribbons[ribbon] + + // ribbon this is empty or non-existant... + // XXX need to check when can we get a ribbon == undefined case... + // ...race? + //if(ribbon == null){ + // // XXX + //} + if(ribbon == null || ribbon.length == 0){ + return [] + } + if(count > 0){ + var c = inclusive == null ? 1 : 0 + var start = ribbon.indexOf(gid) + c + return ribbon.slice(start, start + count) + } else { + var c = inclusive == null ? 0 : 1 + var end = ribbon.indexOf(gid) + return ribbon.slice((Math.abs(count) >= end ? 0 : end + count + c), end + c) + } +} + + +// Get a sub-ribbon of count elements around a given gid +// +// +- ribbon count +// v |<------>| +// ooooooooooooooooXoooooooooooooooo -> ooooXoooo +// ^ +// gid +// +// If gid does not exist in the requested ribbon then getGIDBefore() is +// used to get an appropriate alternative gid. +// +// If gid is less than count/2 to ribbon head/tail, then less than count +// gids will be returned +// +// count +// |<------>| +// oXoooooooooooooooo -> ___oXoooo +// ^ +// gid +// +// +// Setting force_count will make this always return count images, even +// at the start and end of the ribbon. +// +// count +// |<------>| +// oXoooooooooooooooo -> oXooooooo +// ^ +// gid +// +// Otherwise this will return less. +// +// NOTE: skipping gid and ribbon while passing data may not work correctly... +// NOTE: count represents section diameter... +function getGIDsAround(count, gid, ribbon, data, force_count){ + if(count == 0){ + return [] + } + // default values... + data = data == null ? DATA : data + gid = gid == null ? getImageGID() : gid + ribbon = ribbon == null ? getRibbonIndex() : ribbon + // XXX is this out of context here??? + count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count + + var ribbon_data = data.ribbons[ribbon] + // get a gid that's in the current ribbon... + gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, null, data) : gid + + // calculate the bounds... + var i = ribbon_data.indexOf(gid) + + var start = i - Math.floor(count/2) + start = start < 0 ? 0 : start + + var end = i + Math.ceil(count/2) + end = end > ribbon_data.length ? ribbon_data.length : end + + // force count by extending the ribbon at the opposite end... + if(force_count && ribbon_data.length > count){ + var d = count - (end - start) + + start = end >= ribbon_data.length ? start - d : start + start = start < 0 ? 0 : start + + end = start <= 0 ? end + d : end + end = end > ribbon_data.length ? ribbon_data.length : end + } + + // get the actual data... + return ribbon_data.slice(start, end) +} + + +// NOTE: this expects that both arrays cleanly intersect each other only +// once... +// XXX this sometimes returns a null and a value which seems to be +// impossible... +// ...this does not affect anything, but still need to investigate... +function getCommonSubArrayOffsets(L1, L2){ + var res = {} + + // defaults for if one of the lists is empty... + if(L1.length == 0){ + res.left = -(L2.length) + res.right = 0 + return res + } else if(L2.length == 0){ + res.left = L1.length + res.right = 0 + return res + } + + // head... + var a = L2.indexOf(L1[0]) + var b = L1.indexOf(L2[0]) + res.left = a >= 0 ? -a + : b >= 0 ? b + : null + + // tail... + a = L2.indexOf(L1[L1.length-1]) + b = L1.indexOf(L2[L2.length-1]) + res.right = a >= 0 ? -(L2.length - a - 1) + : b >= 0 ? L1.length - b - 1 + : null + + return res +} + + +// NOTE: this expects that bot arrays cleanly intersect each other only +// once... +function getCommonSubArray(L1, L2){ + var res = getCommonSubArrayOffsets(L1, L2) + var left = res.left + var right = res.right + + if(left == null && right == null){ + return [] + } + + //a = L1.slice(Math.max(0, left), L1.length - Math.max(right, 0)) + //b = L2.slice(Math.max(0, -left), L2.length - Math.max(-right, 0)) + return L1.slice(Math.max(0, left), L1.length - Math.max(right, 0)) +} + + // Base URL interface... // // NOTE: changing a base URL will trigger a baseURLChanged event... @@ -1196,61 +1374,10 @@ function shiftRibbonsBy(n, gid, data){ -/********************************************************************** -* Format conversion -*/ - -// Convert legacy Gen1 data format to current Gen3 (v2.0) -function convertDataGen1(data, cmp){ - var res = { - data: { - version: '2.0', - current: null, - ribbons: [], - order: [], - }, - images: {} - } - cmp = cmp == null ? - function(a, b){ - return imageDateCmp(a, b, null, res.images) - } - : cmp - var ribbons = res.data.ribbons - var order = res.data.order - var images = res.images - - // position... - res.data.current = data.position - - // ribbons and images... - $.each(data.ribbons, function(i, input_images){ - var ribbon = [] - ribbons.push(ribbon) - for(var id in input_images){ - var image = input_images[id] - ribbon.push(id) - order.push(id) - images[id] = image - } - ribbon.sort(cmp) - }) - - order.sort(cmp) - - // XXX STUB - res.data.current = order[0] - - return res -} - - - /********************************************************************** * Loaders */ - function updateImageIndicators(gid, image){ gid = gid == null ? getImageGID() : gid image = image == null ? getImage() : $(image) @@ -1354,9 +1481,6 @@ function updateImage(image, gid, size, sync){ // flip... setImageFlipState(image, img_data.flipped == null ? [] : img_data.flipped) - // XXX filter settings... - // XXX - // NOTE: this only has effect on non-square image blocks... correctImageProportionsForRotation(image) @@ -1423,184 +1547,6 @@ function updateImages(size){ */ -// Get "count" of GIDs starting with a given gid ("from") -// -// NOTE: this will not include the 'from' GID in the resulting list, -// unless inclusive is set to true. -// NOTE: count can be either negative or positive, this will indicate -// load direction... -// NOTE: this can calculate the ribbon number where the image is located. -// NOTE: if an image can be in more than one ribbon, one MUST suply the -// correct ribbon number... -// -// XXX do we need more checking??? -// XXX Race condition: when this is called while DATA is not yet fully -// loaded (old data), the from gid will not be present in -// DATA.ribbons... -function getGIDsAfter(count, gid, ribbon, inclusive, data){ - if(count == 0){ - return [] - } - // default values... - gid = gid == null ? getImageGID() : gid - data = data == null ? DATA : data - ribbon = ribbon == null ? getRibbonIndex() : ribbon - count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count - ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon - - // get a local gid... - gid = data.ribbons[ribbon].indexOf(gid) < 0 ? getGIDBefore(gid, ribbon) : gid - ribbon = data.ribbons[ribbon] - - // ribbon this is empty or non-existant... - // XXX need to check when can we get a ribbon == undefined case... - // ...race? - //if(ribbon == null){ - // // XXX - //} - if(ribbon == null || ribbon.length == 0){ - return [] - } - if(count > 0){ - var c = inclusive == null ? 1 : 0 - var start = ribbon.indexOf(gid) + c - return ribbon.slice(start, start + count) - } else { - var c = inclusive == null ? 0 : 1 - var end = ribbon.indexOf(gid) - return ribbon.slice((Math.abs(count) >= end ? 0 : end + count + c), end + c) - } -} - - -// Get a sub-ribbon of count elements around a given gid -// -// +- ribbon count -// v |<------>| -// ooooooooooooooooXoooooooooooooooo -> ooooXoooo -// ^ -// gid -// -// If gid does not exist in the requested ribbon then getGIDBefore() is -// used to get an appropriate alternative gid. -// -// If gid is less than count/2 to ribbon head/tail, then less than count -// gids will be returned -// -// count -// |<------>| -// oXoooooooooooooooo -> ___oXoooo -// ^ -// gid -// -// -// Setting force_count will make this always return count images, even -// at the start and end of the ribbon. -// -// count -// |<------>| -// oXoooooooooooooooo -> oXooooooo -// ^ -// gid -// -// Otherwise this will return less. -// -// NOTE: skipping gid and ribbon while passing data may not work correctly... -// NOTE: count represents section diameter... -function getGIDsAround(count, gid, ribbon, data, force_count){ - if(count == 0){ - return [] - } - // default values... - data = data == null ? DATA : data - gid = gid == null ? getImageGID() : gid - ribbon = ribbon == null ? getRibbonIndex() : ribbon - // XXX is this out of context here??? - count = count == null ? Math.round(LOAD_SCREENS * getScreenWidthInImages()) : count - - var ribbon_data = data.ribbons[ribbon] - // get a gid that's in the current ribbon... - gid = ribbon_data.indexOf(gid) < 0 ? getGIDBefore(gid, ribbon, null, data) : gid - - // calculate the bounds... - var i = ribbon_data.indexOf(gid) - - var start = i - Math.floor(count/2) - start = start < 0 ? 0 : start - - var end = i + Math.ceil(count/2) - end = end > ribbon_data.length ? ribbon_data.length : end - - // force count by extending the ribbon at the opposite end... - if(force_count && ribbon_data.length > count){ - var d = count - (end - start) - - start = end >= ribbon_data.length ? start - d : start - start = start < 0 ? 0 : start - - end = start <= 0 ? end + d : end - end = end > ribbon_data.length ? ribbon_data.length : end - } - - // get the actual data... - return ribbon_data.slice(start, end) -} - - -// NOTE: this expects that both arrays cleanly intersect each other only -// once... -// XXX this sometimes returns a null and a value which seems to be -// impossible... -// ...this does not affect anything, but still need to investigate... -function getCommonSubArrayOffsets(L1, L2){ - var res = {} - - // defaults for if one of the lists is empty... - if(L1.length == 0){ - res.left = -(L2.length) - res.right = 0 - return res - } else if(L2.length == 0){ - res.left = L1.length - res.right = 0 - return res - } - - // head... - var a = L2.indexOf(L1[0]) - var b = L1.indexOf(L2[0]) - res.left = a >= 0 ? -a - : b >= 0 ? b - : null - - // tail... - a = L2.indexOf(L1[L1.length-1]) - b = L1.indexOf(L2[L2.length-1]) - res.right = a >= 0 ? -(L2.length - a - 1) - : b >= 0 ? L1.length - b - 1 - : null - - return res -} - - -// NOTE: this expects that bot arrays cleanly intersect each other only -// once... -function getCommonSubArray(L1, L2){ - var res = getCommonSubArrayOffsets(L1, L2) - var left = res.left - var right = res.right - - if(left == null && right == null){ - return [] - } - - //a = L1.slice(Math.max(0, left), L1.length - Math.max(right, 0)) - //b = L2.slice(Math.max(0, -left), L2.length - Math.max(-right, 0)) - return L1.slice(Math.max(0, left), L1.length - Math.max(right, 0)) -} - - // Load count images around a given image/gid into the given ribbon. // function loadImagesAround(count, gid, ribbon, data, force_count){ @@ -1822,22 +1768,6 @@ function updateRibbonOrder(no_reload_viewer){ } -// Action wrapper of alignDataToRibbon(...) -// -// Align ribbons to the current ribbon. -// -// XXX need to change the default to base ribbon for production... -function alignRibbons(ribbon){ - console.warn('alignRibbons(): not yet ready for production use!') - // XXX remove this line for production.... - ribbon = ribbon == null ? getRibbonIndex() : ribbon - - DATA = alignDataToRibbon(ribbon) - - reloadViewer() -} - - // Focus next/prev image in order... // // This differs form nextImage/prevImage in that these are not @@ -1858,6 +1788,22 @@ var prevImageInOrder = makePrevFromListAction( }) +// Action wrapper of alignDataToRibbon(...) +// +// Align ribbons to the current ribbon. +// +// XXX need to change the default to base ribbon for production... +function alignRibbons(ribbon){ + console.warn('alignRibbons(): not yet ready for production use!') + // XXX remove this line for production.... + ribbon = ribbon == null ? getRibbonIndex() : ribbon + + DATA = alignDataToRibbon(ribbon) + + reloadViewer() +} + + /******************************************************* Extension ***/ diff --git a/ui/formats.js b/ui/formats.js new file mode 100755 index 00000000..652dab4a --- /dev/null +++ b/ui/formats.js @@ -0,0 +1,63 @@ +/********************************************************************** +* +* +* +**********************************************************************/ + +//var DEBUG = DEBUG != null ? DEBUG : true + + +/*********************************************************************/ + +// Convert legacy Gen1 data format to current Gen3 (v2.0) +function convertDataGen1(data, cmp){ + var res = { + data: { + version: '2.0', + current: null, + ribbons: [], + order: [], + }, + images: {} + } + cmp = cmp == null ? + function(a, b){ + return imageDateCmp(a, b, null, res.images) + } + : cmp + var ribbons = res.data.ribbons + var order = res.data.order + var images = res.images + + // position... + res.data.current = data.position + + // ribbons and images... + $.each(data.ribbons, function(i, input_images){ + var ribbon = [] + ribbons.push(ribbon) + for(var id in input_images){ + var image = input_images[id] + ribbon.push(id) + order.push(id) + images[id] = image + } + ribbon.sort(cmp) + }) + + order.sort(cmp) + + // XXX STUB + res.data.current = order[0] + + return res +} + + + + + + + +/********************************************************************** +* vim:set ts=4 sw=4 : */ diff --git a/ui/index.html b/ui/index.html index 326741d7..6e98f076 100755 --- a/ui/index.html +++ b/ui/index.html @@ -30,6 +30,7 @@ +