diff --git a/InForm/extensions/Base64.bas b/InForm/extensions/Base64.bas deleted file mode 100644 index c218dbb..0000000 --- a/InForm/extensions/Base64.bas +++ /dev/null @@ -1,181 +0,0 @@ -'----------------------------------------------------------------------------------------------------------------------- -' Base64 Encoder and Decoder library -' Copyright (c) 2023 Samuel Gomes -'----------------------------------------------------------------------------------------------------------------------- - -$IF BASE64_BAS = UNDEFINED THEN - $LET BASE64_BAS = TRUE - - '------------------------------------------------------------------------------------------------------------------- - ' Test code for debugging the library - '------------------------------------------------------------------------------------------------------------------- - 'DEFLNG A-Z - 'OPTION _EXPLICIT - - 'CONST ITERATIONS = 1000000 - 'CONST LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut " + _ - ' "labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip " + _ - ' "ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat " + _ - ' "nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." - - 'DIM encTxt AS STRING, decTxt AS STRING, i AS LONG, t AS DOUBLE - - 'PRINT ITERATIONS; "iterations,"; LEN(LOREM_IPSUM); "bytes." - - 'PRINT "Base64 encode..." - - 't = TIMER - 'FOR i = 1 TO ITERATIONS - ' encTxt = Base64_Encode(LOREM_IPSUM) - 'NEXT - 'PRINT USING "#####.##### seconds"; TIMER - t - - 'PRINT "Base64 decode..." - - 't = TIMER - 'FOR i = 1 TO ITERATIONS - ' decTxt = Base64_Decode(encTxt) - 'NEXT - 'PRINT USING "#####.##### seconds"; TIMER - t - - 'IF _STRCMP(decTxt, LOREM_IPSUM) = 0 THEN - ' PRINT "Passed" - 'ELSE - ' PRINT "Failed" - 'END IF - - 'END - '------------------------------------------------------------------------------------------------------------------- - - ' Converts a normal string or binary data to a base64 string - FUNCTION Base64_Encode$ (s AS STRING) - CONST BASE64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - - DIM srcSize AS _UNSIGNED LONG: srcSize = LEN(s) - DIM srcSize3rem AS _UNSIGNED LONG: srcSize3rem = srcSize MOD 3 - DIM srcSize3mul AS _UNSIGNED LONG: srcSize3mul = srcSize - srcSize3rem - DIM buffer AS STRING: buffer = SPACE$(((srcSize + 2) \ 3) * 4) ' preallocate complete buffer - DIM j AS _UNSIGNED LONG: j = 1 - - DIM i AS _UNSIGNED LONG: FOR i = 1 TO srcSize3mul STEP 3 - DIM char1 AS _UNSIGNED _BYTE: char1 = ASC(s, i) - DIM char2 AS _UNSIGNED _BYTE: char2 = ASC(s, i + 1) - DIM char3 AS _UNSIGNED _BYTE: char3 = ASC(s, i + 2) - - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHR(char1, 2))) - j = j + 1 - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHL((char1 AND 3), 4) OR _SHR(char2, 4))) - j = j + 1 - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHL((char2 AND 15), 2) OR _SHR(char3, 6))) - j = j + 1 - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (char3 AND 63)) - j = j + 1 - NEXT i - - ' Add padding - IF srcSize3rem > 0 THEN - char1 = ASC(s, i) - - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHR(char1, 2))) - j = j + 1 - - IF srcSize3rem = 1 THEN - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHL(char1 AND 3, 4))) - j = j + 1 - ASC(buffer, j) = 61 ' "=" - j = j + 1 - ASC(buffer, j) = 61 ' "=" - ELSE ' srcSize3rem = 2 - char2 = ASC(s, i + 1) - - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHL((char1 AND 3), 4) OR _SHR(char2, 4))) - j = j + 1 - ASC(buffer, j) = ASC(BASE64_CHARACTERS, 1 + (_SHL(char2 AND 15, 2))) - j = j + 1 - ASC(buffer, j) = 61 ' "=" - END IF - END IF - - Base64_Encode = buffer - END FUNCTION - - - ' Converts a base64 string to a normal string or binary data - FUNCTION Base64_Decode$ (s AS STRING) - DIM srcSize AS _UNSIGNED LONG: srcSize = LEN(s) - DIM buffer AS STRING: buffer = SPACE$((srcSize \ 4) * 3) ' preallocate complete buffer - DIM j AS _UNSIGNED LONG: j = 1 - DIM AS _UNSIGNED _BYTE index, char1, char2, char3, char4 - - DIM i AS _UNSIGNED LONG: FOR i = 1 TO srcSize STEP 4 - index = ASC(s, i): GOSUB find_index: char1 = index - index = ASC(s, i + 1): GOSUB find_index: char2 = index - index = ASC(s, i + 2): GOSUB find_index: char3 = index - index = ASC(s, i + 3): GOSUB find_index: char4 = index - - ASC(buffer, j) = _SHL(char1, 2) OR _SHR(char2, 4) - j = j + 1 - ASC(buffer, j) = _SHL(char2 AND 15, 4) OR _SHR(char3, 2) - j = j + 1 - ASC(buffer, j) = _SHL(char3 AND 3, 6) OR char4 - j = j + 1 - NEXT i - - ' Remove padding - IF RIGHT$(s, 2) = "==" THEN - buffer = LEFT$(buffer, LEN(buffer) - 2) - ELSEIF RIGHT$(s, 1) = "=" THEN - buffer = LEFT$(buffer, LEN(buffer) - 1) - END IF - - Base64_Decode = buffer - EXIT FUNCTION - - find_index: - IF index >= 65 AND index <= 90 THEN - index = index - 65 - ELSEIF index >= 97 AND index <= 122 THEN - index = index - 97 + 26 - ELSEIF index >= 48 AND index <= 57 THEN - index = index - 48 + 52 - ELSEIF index = 43 THEN - index = 62 - ELSEIF index = 47 THEN - index = 63 - END IF - RETURN - END FUNCTION - - - ' Loads a binary file encoded with Bin2Data - ' Usage: - ' 1. Encode the binary file with Bin2Data - ' 2. Include the file or it's contents - ' 3. Load the file like so: - ' Restore label_generated_by_bin2data - ' Dim buffer As String - ' buffer = LoadResource ' buffer will now hold the contents of the file - FUNCTION Base64_LoadResource$ - DIM ogSize AS LONG, resize AS LONG, isComp AS _BYTE - DIM buffer AS STRING, chunk AS STRING, i AS LONG - - READ ogSize, resize, isComp ' read the header - buffer = SPACE$(resize) ' preallocate complete buffer - - ' Read the whole resource data - DO WHILE i < resize - READ chunk - MID$(buffer, i + 1) = chunk - i = i + LEN(chunk) - LOOP - - ' Decode the data - buffer = Base64_Decode(buffer) - - ' Expand the data if needed - IF isComp THEN buffer = _INFLATE$(buffer, ogSize) - - Base64_LoadResource = buffer - END FUNCTION - -$END IF diff --git a/InForm/extensions/GIFPlay.bas b/InForm/extensions/GIFPlay.bas deleted file mode 100644 index 302275e..0000000 --- a/InForm/extensions/GIFPlay.bas +++ /dev/null @@ -1,957 +0,0 @@ -'####################################################################################### -'# Animated GIF decoder v1.0 # -'# By Zom-B # -'# # -'# https://qb64phoenix.com/qb64wiki/index.php/GIF_Images # -'####################################################################################### -' Adapted for use with InForm's PictureBox controls by @FellippeHeitor -' Refactored by a740g to use include guards and conditional compiles - -$IF GIFPLAY_BAS = UNDEFINED THEN - $LET GIFPLAY_BAS = TRUE - - '$INCLUDE:'GIFPlay.bi' - - SUB UpdateGif (ID AS LONG) - SHARED GIFData() AS GIFDATA - - STATIC GifOverlay AS LONG - - DIM i AS LONG, newFrame AS LONG - - i = GetGifIndex(ID) - - IF i = 0 THEN EXIT SUB - - IF GifOverlay = 0 THEN - GifOverlay = LoadOverlayImage& - END IF - - IF GIFData(i).IsPlaying OR GIFData(i).LastFrameServed = 0 THEN - IF GIFData(i).LastFrameUpdate > 0 AND TIMER - GIFData(i).LastFrameUpdate < GIFData(i).LastFrameDelay THEN - 'Wait for the GIF's frame delay - ELSE - GIFData(i).Frame = GIFData(i).Frame + 1 - GIFData(i).LastFrameServed = GIFData(i).Frame - GIFData(i).LastFrameUpdate = TIMER - END IF - END IF - - $IF INFORM_BI = DEFINED THEN - BeginDraw ID - $END IF - - newFrame = GetGifFrame&(i) - IF newFrame THEN _PUTIMAGE , newFrame - IF GIFData(i).IsPlaying = FALSE AND GIFData(i).HideOverlay = FALSE AND GIFData(i).totalFrames > 1 THEN - _PUTIMAGE (_WIDTH / 2 - _WIDTH(GifOverlay) / 2, _HEIGHT / 2 - _HEIGHT(GifOverlay) / 2), GifOverlay - END IF - - $IF INFORM_BI = DEFINED THEN - EndDraw ID - $END IF - END SUB - - - FUNCTION GifIsPlaying%% (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GifIsPlaying = GIFData(i).IsPlaying - END FUNCTION - - - FUNCTION GifWidth% (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GifWidth = GIFData(i).width - END FUNCTION - - - FUNCTION GifHeight% (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GifHeight = GIFData(i).height - END FUNCTION - - - FUNCTION TotalFrames& (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - TotalFrames = GIFData(i).totalFrames - END FUNCTION - - - SUB HideGifOverlay (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GIFData(i).HideOverlay = TRUE - END SUB - - - SUB PlayGif (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GIFData(i).IsPlaying = TRUE - END SUB - - - SUB PauseGif (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GIFData(i).IsPlaying = FALSE - END SUB - - - SUB StopGif (ID AS LONG) - SHARED GIFData() AS GIFDATA - - DIM i AS LONG: i = GetGifIndex(ID) - - GIFData(i).IsPlaying = FALSE - GIFData(i).Frame = 1 - END SUB - - - FUNCTION OpenGif%% (ID AS LONG, filename$) - SHARED GIFData() AS GIFDATA - SHARED GIFFrameData() AS FRAMEDATA - SHARED TotalGIFLoaded AS LONG, TotalGIFFrames AS LONG - - DIM i AS LONG, Index AS LONG - DIM byte~%%, palette$, delay~% - - $IF INFORM_BI = DEFINED THEN - IF Control(ID).Type <> __UI_Type_PictureBox THEN ERROR 5: EXIT FUNCTION - $END IF - - Index = GetGifIndex&(ID) - - IF Index = 0 THEN - TotalGIFLoaded = TotalGIFLoaded + 1 - Index = TotalGIFLoaded - REDIM _PRESERVE GIFData(1 TO TotalGIFLoaded) AS GIFDATA - ELSE - CloseGif ID - END IF - - GIFData(Index).ID = ID - GIFData(Index).file = FREEFILE - IF NOT _FILEEXISTS(filename$) THEN EXIT FUNCTION - OPEN filename$ FOR BINARY AS GIFData(Index).file - - GET GIFData(Index).file, , GIFData(Index).sigver - GET GIFData(Index).file, , GIFData(Index).width - GET GIFData(Index).file, , GIFData(Index).height - GET GIFData(Index).file, , byte~%% - GIFData(Index).bpp = (byte~%% AND 7) + 1 - GIFData(Index).sortFlag = (byte~%% AND 8) > 0 - GIFData(Index).colorRes = (byte~%% \ 16 AND 7) + 1 - GIFData(Index).colorTableFlag = (byte~%% AND 128) > 0 - GIFData(Index).numColors = 2 ^ GIFData(Index).bpp - GET GIFData(Index).file, , GIFData(Index).bgColor - GET GIFData(Index).file, , byte~%% - IF byte~%% = 0 THEN GIFData(Index).aspect = 0 ELSE GIFData(Index).aspect = (byte~%% + 15) / 64 - - IF GIFData(Index).sigver <> "GIF87a" AND GIFData(Index).sigver <> "GIF89a" THEN - 'Invalid version - GOTO LoadError - END IF - - IF NOT GIFData(Index).colorTableFlag THEN - 'No Color Table - GOTO LoadError - END IF - - palette$ = SPACE$(3 * GIFData(Index).numColors) - GET GIFData(Index).file, , palette$ - GIFData(Index).palette = palette$ - DO - GET GIFData(Index).file, , byte~%% - SELECT CASE byte~%% - CASE &H2C ' Image Descriptor - TotalGIFFrames = TotalGIFFrames + 1 - GIFData(Index).totalFrames = GIFData(Index).totalFrames + 1 - - IF GIFData(Index).firstFrame = 0 THEN - GIFData(Index).firstFrame = TotalGIFFrames - END IF - - IF TotalGIFFrames > UBOUND(GIFFrameData) THEN - REDIM _PRESERVE GIFFrameData(0 TO TotalGIFFrames * 2) AS FRAMEDATA - END IF - - GIFFrameData(TotalGIFFrames).ID = ID - GIFFrameData(TotalGIFFrames).thisFrame = GIFData(Index).totalFrames - - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).left - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).top - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).width - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).height - GET GIFData(Index).file, , byte~%% - GIFFrameData(TotalGIFFrames).localColorTableFlag = (byte~%% AND 128) > 0 - GIFFrameData(TotalGIFFrames).interlacedFlag = (byte~%% AND 64) > 0 - GIFFrameData(TotalGIFFrames).sortFlag = (byte~%% AND 32) > 0 - GIFFrameData(TotalGIFFrames).palBPP = (byte~%% AND 7) + 1 - GIFFrameData(TotalGIFFrames).addr = LOC(GIFData(Index).file) + 1 - - IF GIFFrameData(TotalGIFFrames).localColorTableFlag THEN - SEEK GIFData(Index).file, LOC(GIFData(Index).file) + 3 * 2 ^ GIFFrameData(TotalGIFFrames).palBPP + 1 - END IF - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).minimumCodeSize - IF GIFFrameData(TotalGIFFrames).disposalMethod > 2 THEN - 'Unsupported disposalMethod - GOTO LoadError - END IF - SkipGIFBlocks GIFData(Index).file - CASE &H3B ' Trailer - EXIT DO - CASE &H21 ' Extension Introducer - GET GIFData(Index).file, , byte~%% ' Extension Label - SELECT CASE byte~%% - CASE &HFF, &HFE ' Application Extension, Comment Extension - SkipGIFBlocks GIFData(Index).file - CASE &HF9 - IF TotalGIFFrames > UBOUND(GIFFrameData) THEN - REDIM _PRESERVE GIFFrameData(0 TO TotalGIFFrames * 2) AS FRAMEDATA - END IF - GIFFrameData(TotalGIFFrames).ID = ID - - GET GIFData(Index).file, , byte~%% ' Block Size (always 4) - GET GIFData(Index).file, , byte~%% - GIFFrameData(TotalGIFFrames).transparentFlag = (byte~%% AND 1) > 0 - GIFFrameData(TotalGIFFrames).userInput = (byte~%% AND 2) > 0 - GIFFrameData(TotalGIFFrames).disposalMethod = byte~%% \ 4 AND 7 - GET GIFData(Index).file, , delay~% - IF delay~% = 0 THEN GIFFrameData(TotalGIFFrames).delay = 0.1 ELSE GIFFrameData(TotalGIFFrames).delay = delay~% / 100 - GET GIFData(Index).file, , GIFFrameData(TotalGIFFrames).transColor - SkipGIFBlocks GIFData(Index).file - CASE ELSE - 'Unsupported extension Label - GOTO LoadError - END SELECT - CASE ELSE - 'Unsupported chunk - GOTO LoadError - END SELECT - LOOP - - REDIM _PRESERVE GIFFrameData(0 TO TotalGIFFrames) AS FRAMEDATA - - GIFData(Index).IsPlaying = FALSE - OpenGif = TRUE - EXIT FUNCTION - - LoadError: - GIFData(Index).ID = 0 - CLOSE GIFData(Index).file - FOR i = 1 TO TotalGIFFrames - IF GIFFrameData(i).ID = ID THEN - GIFFrameData(i).ID = 0 - END IF - NEXT - END FUNCTION - - - FUNCTION GetGifIndex& (ID AS LONG) - SHARED GIFData() AS GIFDATA - SHARED TotalGIFLoaded AS LONG - - DIM i AS LONG: FOR i = 1 TO TotalGIFLoaded - IF GIFData(i).ID = ID THEN - GetGifIndex = i - EXIT FOR - END IF - NEXT i - END FUNCTION - - - SUB CloseGif (ID AS LONG) - SHARED GIFData() AS GIFDATA - SHARED GIFFrameData() AS FRAMEDATA - - DIM i AS LONG, Index AS LONG - - Index = GetGifIndex(ID) - - IF Index = 0 THEN EXIT SUB - - FOR i = 0 TO UBOUND(GIFFrameData) - IF GIFFrameData(i).ID = ID THEN - GIFFrameData(i).ID = 0 - IF GIFFrameData(i).addr < -1 THEN - _FREEIMAGE GIFFrameData(i).addr - END IF - END IF - NEXT - - CLOSE GIFData(Index).file - GIFData(Index).ID = 0 - GIFData(Index).firstFrame = 0 - END SUB - - - SUB SkipGIFBlocks (file AS INTEGER) - DIM byte~%% - DO - GET file, , byte~%% ' Block Size - SEEK file, LOC(file) + byte~%% + 1 - LOOP WHILE byte~%% - END SUB - - - FUNCTION GetGifFrame& (Index AS LONG) - SHARED GIFData() AS GIFDATA - SHARED GIFFrameData() AS FRAMEDATA - - DIM i AS LONG - DIM frame AS LONG, previousFrame AS LONG - DIM w AS INTEGER, h AS INTEGER - DIM img&, actualFrame& - DIM prevDest AS LONG - - IF GIFData(Index).Frame > GIFData(Index).totalFrames THEN - GIFData(Index).Frame = 1 - END IF - - FOR i = 1 TO UBOUND(GIFFrameData) - IF GIFFrameData(i).ID = GIFData(Index).ID AND GIFFrameData(i).thisFrame = GIFData(Index).Frame THEN - frame = i - EXIT FOR - ELSEIF GIFFrameData(i).ID = GIFData(Index).ID AND GIFFrameData(i).thisFrame < GIFData(Index).Frame THEN - previousFrame = i - END IF - NEXT - - GIFData(Index).LastFrameDelay = GIFFrameData(frame).delay - (GIFFrameData(frame).delay / 10) - - IF GIFFrameData(frame).addr > 0 THEN - prevDest = _DEST - w = GIFFrameData(frame).width - h = GIFFrameData(frame).height - img& = _NEWIMAGE(w, h, 256) - actualFrame& = _NEWIMAGE(GIFData(Index).width, GIFData(Index).height, 256) - - _DEST img& - DecodeFrame GIFData(Index), GIFFrameData(frame) - - _DEST actualFrame& - IF GIFFrameData(frame).localColorTableFlag THEN - _COPYPALETTE img& - ELSE - FOR i = 0 TO GIFData(Index).numColors - 1 - _PALETTECOLOR i, _RGB32(ASC(GIFData(Index).palette, i * 3 + 1), ASC(GIFData(Index).palette, i * 3 + 2), ASC(GIFData(Index).palette, i * 3 + 3)) - NEXT - END IF - - IF GIFData(Index).Frame > 1 THEN - SELECT CASE GIFFrameData(previousFrame).disposalMethod - CASE 0, 1 - _PUTIMAGE , GIFFrameData(previousFrame).addr - CASE 2 - CLS , GIFData(Index).bgColor - _CLEARCOLOR GIFData(Index).bgColor - END SELECT - ELSE - CLS , GIFData(Index).bgColor - END IF - - IF GIFFrameData(frame).transparentFlag THEN - _CLEARCOLOR GIFFrameData(frame).transColor, img& - END IF - _PUTIMAGE (GIFFrameData(frame).left, GIFFrameData(frame).top), img& - _FREEIMAGE img& - - GIFFrameData(frame).addr = actualFrame& - GIFData(Index).LoadedFrames = GIFData(Index).LoadedFrames + 1 - GIFData(Index).GifLoadComplete = (GIFData(Index).LoadedFrames = GIFData(Index).totalFrames) - _DEST prevDest - END IF - - GetGifFrame& = GIFFrameData(frame).addr - END FUNCTION - - - SUB DecodeFrame (gifdata AS GIFDATA, GifFrameData AS FRAMEDATA) - DIM byte AS _UNSIGNED _BYTE - DIM prefix(4095), suffix(4095), colorStack(4095) - DIM startCodeSize AS INTEGER, clearCode AS INTEGER - DIM endCode AS INTEGER, minCode AS INTEGER, startMaxCode AS INTEGER - DIM nvc AS INTEGER, codeSize AS INTEGER - DIM maxCode AS INTEGER, bitPointer AS INTEGER, blockSize AS INTEGER - DIM blockPointer AS INTEGER, x AS INTEGER, y AS INTEGER - DIM palette$, i AS LONG, c&, stackPointer AS INTEGER - DIM currentCode AS INTEGER, code AS INTEGER, lastColor AS INTEGER - DIM oldCode AS INTEGER, WorkCode&, LastChar AS INTEGER - DIM interlacedPass AS INTEGER, interlacedStep AS INTEGER - DIM file AS INTEGER, a$, loopStart! - - startCodeSize = gifdata.bpp + 1 - clearCode = 2 ^ gifdata.bpp - endCode = clearCode + 1 - minCode = endCode + 1 - startMaxCode = clearCode * 2 - 1 - nvc = minCode - codeSize = startCodeSize - maxCode = startMaxCode - - IF GifFrameData.interlacedFlag THEN interlacedPass = 0: interlacedStep = 8 - bitPointer = 0 - blockSize = 0 - blockPointer = 0 - x = 0 - y = 0 - - file = gifdata.file - SEEK file, GifFrameData.addr - - IF GifFrameData.localColorTableFlag THEN - palette$ = SPACE$(3 * 2 ^ GifFrameData.palBPP) - GET file, , palette$ - - FOR i = 0 TO gifdata.numColors - 1 - c& = _RGB32(ASC(palette$, i * 3 + 1), ASC(palette$, i * 3 + 2), ASC(palette$, i * 3 + 3)) - _PALETTECOLOR i, c& - NEXT - END IF - - GET file, , byte ' minimumCodeSize - - loopStart! = TIMER - DO - IF TIMER - loopStart! > 2 THEN EXIT DO - GOSUB GetCode - stackPointer = 0 - IF code = clearCode THEN 'Reset & Draw next color direct - nvc = minCode ' \ - codeSize = startCodeSize ' Preset default codes - maxCode = startMaxCode ' / - - GOSUB GetCode - currentCode = code - - lastColor = code - colorStack(stackPointer) = lastColor - stackPointer = 1 - ELSEIF code <> endCode THEN 'Draw direct color or colors from suffix - currentCode = code - IF currentCode = nvc THEN 'Take last color too - currentCode = oldCode - colorStack(stackPointer) = lastColor - stackPointer = stackPointer + 1 - END IF - - WHILE currentCode >= minCode 'Extract colors from suffix - colorStack(stackPointer) = suffix(currentCode) - stackPointer = stackPointer + 1 - currentCode = prefix(currentCode) 'Next color from suffix is described in - WEND ' the prefix, else prefix is the last col. - - lastColor = currentCode ' Last color is equal to the - colorStack(stackPointer) = lastColor ' last known code (direct, or from - stackPointer = stackPointer + 1 ' Prefix) - suffix(nvc) = lastColor 'Automatically, update suffix - prefix(nvc) = oldCode 'Code from the session before (for extracting from suffix) - nvc = nvc + 1 - - IF nvc > maxCode AND codeSize < 12 THEN - codeSize = codeSize + 1 - maxCode = maxCode * 2 + 1 - END IF - END IF - - FOR i = stackPointer - 1 TO 0 STEP -1 - PSET (x, y), colorStack(i) - x = x + 1 - IF x = GifFrameData.width THEN - x = 0 - IF GifFrameData.interlacedFlag THEN - y = y + interlacedStep - IF y >= GifFrameData.height THEN - SELECT CASE interlacedPass - CASE 0: interlacedPass = 1: y = 4 - CASE 1: interlacedPass = 2: y = 2 - CASE 2: interlacedPass = 3: y = 1 - END SELECT - interlacedStep = 2 * y - END IF - ELSE - y = y + 1 - END IF - END IF - NEXT - - oldCode = code - LOOP UNTIL code = endCode - GET file, , byte - EXIT SUB - - GetCode: - IF bitPointer = 0 THEN GOSUB ReadByteFromBlock: bitPointer = 8 - WorkCode& = LastChar \ (2 ^ (8 - bitPointer)) - WHILE codeSize > bitPointer - GOSUB ReadByteFromBlock - - WorkCode& = WorkCode& OR LastChar * (2 ^ bitPointer) - bitPointer = bitPointer + 8 - WEND - bitPointer = bitPointer - codeSize - code = WorkCode& AND maxCode - RETURN - - ReadByteFromBlock: - IF blockPointer = blockSize THEN - GET file, , byte: blockSize = byte - a$ = SPACE$(blockSize): GET file, , a$ - blockPointer = 0 - END IF - blockPointer = blockPointer + 1 - LastChar = ASC(MID$(a$, blockPointer, 1)) - RETURN - END SUB - - - FUNCTION gifOverlayImage$ - DIM A$ - A$ = MKI$(64) + MKI$(64) - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000J000005000`M0000M20004<000`e0000V30008?000Pl0000" - A$ = A$ + "V3000L=000@`0000M2000L70000D0000J000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000003000PQ0000<30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?0000c0000620000300000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "00030000^1000X<000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000:3000h60000300000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000l0000@N0000Q30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000Q3000T7000`30000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000010000\5000`g0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "O3000\5000@0000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000R0000X;000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000j2000420" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000A1000D>000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000@i0000A100000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000000000@00000520008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000@Q0000100000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000P10000M20008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b3000d9000P1000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000000000000000000000P1" - A$ = A$ + "0000^20008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000^2000H00000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000@00000L20008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0000W00001000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000120008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b300088000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000000000000000@10008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000A10000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000P0000@>000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b3000@>00008000000000000000000000000000000000000000000000000" - A$ = A$ + "000010000T;000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000i2000400" - A$ = A$ + "000000000000000000000000000000000000000000000\5000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?0000G00000000000000000000" - A$ = A$ + "000000000000000000000l0000Pg0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000N3000l0000000000000000000000000000000000" - A$ = A$ + "00@N0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000@N000000000000000000000000000000`20000Q30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000Q3000`000000" - A$ = A$ + "00000000000000000000^10008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000PK000000000000000000001000" - A$ = A$ + "0l<000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000@30004000000000000000L3000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "000m0000f3000P?000Pn0000j3000X?000Pn0000h3000@?000`l0000b300" - A$ = A$ + "08?000Pl0000b30008?000@m0000h3000X?0000n0000f30008?000`l0000" - A$ = A$ + "g3000T?000Pn0000j3000X?000Pn0000j3000X?000Pn0000j3000X?000Pn" - A$ = A$ + "0000j3000P?000`l0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00`=000000000000000R0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b3000D?0000n0000j3000X?000Pn0000" - A$ = A$ + "j3000X?000Pn0000j3000X?000Pn0000i3000H?000Pl0000b30008?000@m" - A$ = A$ + "0000j3000X?000Pn0000j3000X?000Pm0000g3000X?000Pn0000j3000X?0" - A$ = A$ + "00Pn0000j3000X?000Pn0000j3000X?000Pn0000j3000X?000Pn0000i300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl00009200000000000000" - A$ = A$ + "<30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b3000H?000Pn0000jOb9WX?WLb9oNk]gnooooooooooooooooooooooZ" - A$ = A$ + "[^JoniWOl3000X?000Pn0000h30008?000Pl0000g3000X?^hRKoooooo;]d" - A$ = A$ + "Bk?000Pn0000h3000T?000PnZ[^jnooooooooooooooooooooooooooooooo" - A$ = A$ + "oooooooooooooooooooooooooooo\a6Kk3000X?000@m0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b3000d<000000000K00008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b3000H?000Pn0000j_jZ" - A$ = A$ + "[foooooooooooooooooooooooooooooooooooooooooooooooo_dB;]oWLb9" - A$ = A$ + "j3000X?000Pm0000b3000L?000PnhR;^mooooo_dB;]o0000j3000P?000@n" - A$ = A$ + "0000j[^jZkoooooooooooooooooooooooooooooooooooooooooooooooooo" - A$ = A$ + "oooooooooc6K\]?000Pn0000e30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000L000005000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b3000@?000Pn0000j;]dBkoooooooooooGLa5g_Oni7o" - A$ = A$ + "0000j3000X?000PnIUEFk_jZ[foooooooooook]gNk?000Pn0000j3000@?0" - A$ = A$ + "00`m0000jS;^hfooooooB;]dn3000X?0000n0000i3000X_jZ[^oooooogHS" - A$ = A$ + "=b?000Pn0000j3000X?000Pn0000j3000X?000Pn0000j3000X?000Pn0000" - A$ = A$ + "i30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300085000@O" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "000n0000jc9WLboooooooooooc6K\]?000Pn0000j3000X?000Pn0000j300" - A$ = A$ + "0X?000PnIUEFkoooooooooooLb9Wl3000X?000Pm0000g3000X?^hRKooooo" - A$ = A$ + "o;]dBk?000Pn0000h3000T?000PnZ[^jnoooooOS=f8o0000j3000X?000Pn" - A$ = A$ + "0000j3000X?000Pn0000j3000X?000Pn0000h3000000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b3000X?000Pnooooooooooo@3=dn0000j3000300000000000000920008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?0000m0000h3000X?000Pn0000" - A$ = A$ + "j3000X?000Pn0000j3000X?000Pn0000j3000X?0000n0000e30008?000Pl" - A$ = A$ + "0000e3000X?000Pn0000j3000X?000Pn0000f3000L?000Pn0000j3000X?0" - A$ = A$ + "00Pn0000j300000000000000000@00000@30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?0000d0000100000000000000000000h6000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000^10000000000" - A$ = A$ + "00000000000000030000R30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000R3000`000000000000000000000000000000" - A$ = A$ + "0T7000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b3000T700000000000000000000000000000000000`30000N30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b3000h=000@4000000000000" - A$ = A$ + "00000000000000000000000000000`5000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?0000G000000000000000000000000000000000000" - A$ = A$ + "0000000000@00000j20008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000P^" - A$ = A$ + "000010000000000000000000000000000000000000000000000000000420" - A$ = A$ + "000i0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?0000i0000Q0000000000000000000" - A$ = A$ + "00000000000000000000000000000000000000000000A10008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000A1000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000`P0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl000042000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "00000000000010000`9000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000L2000400000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000000000000000000000P1" - A$ = A$ + "0000^20008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000^2000H00000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000H0000@W0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000M2000H00000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000010000D8000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl000052000400000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000A1000D>000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000@i0000A1000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000P80000j20008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000P^0000Q0000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000400" - A$ = A$ + "000G0000O30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b3000l=0000G" - A$ = A$ + "000010000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000000000000000000000000000000000000000000000000l0000@N0000" - A$ = A$ + "Q30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000Q3000X7000`3000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "00000000000000000000000000000000000000000`0000PK0000;30008?0" - A$ = A$ + "00Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b300" - A$ = A$ + "08?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000`b0000" - A$ = A$ + "^1000`000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000<0000920000=000Pl0000" - A$ = A$ + "b30008?000Pl0000b30008?000Pl0000b30008?000Pl0000b30008?000Pl" - A$ = A$ + "0000b30008?000Pl0000@3000T80000<0000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000J000005000@N0000N20008<0" - A$ = A$ + "000f0000Y30008?000@k0000R30008=000P`0000N2000T70000D0000J000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "000000000000000000000000000000000000000000000000000000000000" - A$ = A$ + "0000%%00" - gifOverlayImage$ = A$ - END FUNCTION - - - FUNCTION LoadOverlayImage& - $IF INFORM_BI = UNDEFINED THEN - DECLARE CUSTOMTYPE LIBRARY - SUB __UI_MemCopy ALIAS memcpy (BYVAL dest AS _OFFSET, BYVAL source AS _OFFSET, BYVAL bytes AS LONG) - END DECLARE - $END IF - - DIM MemoryBlock AS _MEM, TempImage AS LONG - DIM NewWidth AS INTEGER, NewHeight AS INTEGER, A$, BASFILE$ - - A$ = gifOverlayImage$ - IF LEN(A$) = 0 THEN EXIT FUNCTION - - NewWidth = CVI(LEFT$(A$, 2)) - NewHeight = CVI(MID$(A$, 3, 2)) - A$ = MID$(A$, 5) - - BASFILE$ = gifUnpack$(A$) - - TempImage = _NEWIMAGE(NewWidth, NewHeight, 32) - MemoryBlock = _MEMIMAGE(TempImage) - - __UI_MemCopy MemoryBlock.OFFSET, _OFFSET(BASFILE$), LEN(BASFILE$) - _MEMFREE MemoryBlock - - LoadOverlayImage& = TempImage - END FUNCTION - - - FUNCTION gifUnpack$ (PackedData$) - 'Adapted from Dav's BIN2BAS - 'http://www.qbasicnews.com/dav/qb64.php - DIM A$, i&, B$, C%, F$, C$, t%, B&, X$, btemp$ - - A$ = PackedData$ - - FOR i& = 1 TO LEN(A$) STEP 4 - B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$) - F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT - B$ = C$ - END IF - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT - X$ = "" - FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255) - B& = B& \ 256 - NEXT - btemp$ = btemp$ + X$ - NEXT - - gifUnpack$ = btemp$ - END FUNCTION - -$END IF diff --git a/InForm/extensions/MessageBox.bas b/InForm/extensions/MessageBox.bas deleted file mode 100644 index e03c841..0000000 --- a/InForm/extensions/MessageBox.bas +++ /dev/null @@ -1,129 +0,0 @@ -' MessageBox compatibility functions -' These basically emulate the legacy InForm MessageBox routines -' All it does is calls the new QB64-PE _MESSAGEBOX$ function - -'$INCLUDE:'MessageBox.bi' - -$IF MESSAGEBOX_BAS = UNDEFINED THEN - $LET MESSAGEBOX_BAS = TRUE - - FUNCTION MessageBox& (message AS STRING, caption AS STRING, setup AS LONG) - DIM dialogType AS STRING - - IF setup AND MsgBox_YesNo THEN - dialogType = "yesno" - ELSEIF setup AND MsgBox_YesNoCancel THEN - dialogType = "yesnocancel" - ELSEIF setup AND MsgBox_OkCancel THEN - dialogType = "okcancel" - ELSEIF setup AND MsgBox_OkOnly THEN - dialogType = "ok" - END IF - - DIM iconType AS STRING - - IF setup AND MsgBox_Critical THEN - iconType = "error" - ELSEIF setup AND MsgBox_Question THEN - iconType = "question" - ELSEIF setup AND MsgBox_Exclamation THEN - iconType = "warning" - ELSEIF setup AND MsgBox_Information THEN - iconType = "info" - END IF - - DIM defaultButton AS LONG - - IF setup AND MsgBox_DefaultButton3 THEN - SELECT CASE dialogType - CASE "yesnocancel" - defaultButton = 0 - CASE "yesno" - defaultButton = 0 - CASE "okcancel" - defaultButton = 0 - CASE "ok" - defaultButton = 1 - END SELECT - ELSEIF setup AND MsgBox_DefaultButton2 THEN - SELECT CASE dialogType - CASE "yesnocancel" - defaultButton = 2 - CASE "yesno" - defaultButton = 0 - CASE "okcancel" - defaultButton = 0 - CASE "ok" - defaultButton = 1 - END SELECT - ELSEIF setup AND MsgBox_DefaultButton1 THEN - SELECT CASE dialogType - CASE "yesnocancel" - defaultButton = 1 - CASE "yesno" - defaultButton = 1 - CASE "okcancel" - defaultButton = 1 - CASE "ok" - defaultButton = 1 - END SELECT - END IF - - DIM __caption AS STRING - - IF caption = "" THEN - IF __UI_CurrentTitle <> "" THEN - __caption = __UI_CurrentTitle - ELSEIF _TITLE$ <> "" THEN - __caption = _TITLE$ - ELSE - __caption = COMMAND$(0) - END IF - ELSE - __caption = caption - END IF - - _DELAY 0.2 ' delay a bit so that the interface can redraw before the messagebox kicks in - DIM returnValue AS LONG: returnValue = _MESSAGEBOX(__caption, message, dialogType, iconType, defaultButton) - - SELECT CASE returnValue - CASE 0 - SELECT CASE dialogType - CASE "yesnocancel" - MessageBox = MsgBox_Cancel - CASE "yesno" - MessageBox = MsgBox_No - CASE "okcancel" - MessageBox = MsgBox_Cancel - CASE "ok" - MessageBox = MsgBox_Ok - END SELECT - CASE 1 - SELECT CASE dialogType - CASE "yesnocancel" - MessageBox = MsgBox_Yes - CASE "yesno" - MessageBox = MsgBox_Yes - CASE "okcancel" - MessageBox = MsgBox_Ok - CASE "ok" - MessageBox = MsgBox_Ok - END SELECT - CASE 2 - SELECT CASE dialogType - CASE "yesnocancel" - MessageBox = MsgBox_No - CASE "yesno" - MessageBox = MsgBox_No - CASE "okcancel" - MessageBox = MsgBox_Cancel - CASE "ok" - MessageBox = MsgBox_Ok - END SELECT - END SELECT - END FUNCTION - - SUB MessageBox (message AS STRING, caption AS STRING, setup AS LONG) - DIM returnValue AS LONG: returnValue = MessageBox(message, caption, setup) - END SUB -$END IF diff --git a/InForm/extensions/MessageBox.bi b/InForm/extensions/MessageBox.bi deleted file mode 100644 index f51dafe..0000000 --- a/InForm/extensions/MessageBox.bi +++ /dev/null @@ -1,40 +0,0 @@ -' MessageBox compatibility functions -' These basically emulate the legacy InForm MessageBox routines -' All it does is calls the new QB64-PE _MESSAGEBOX$ function - -$IF MESSAGEBOX_BI = UNDEFINED THEN - $LET MESSAGEBOX_BI = TRUE - - 'Messagebox constants - CONST MsgBox_OkOnly = 1 - CONST MsgBox_OkCancel = 2 - CONST MsgBox_AbortRetryIgnore = 4 - CONST MsgBox_YesNoCancel = 8 - CONST MsgBox_YesNo = 16 - CONST MsgBox_RetryCancel = 32 - CONST MsgBox_CancelTryagainContinue = 64 - - CONST MsgBox_Critical = 128 - CONST MsgBox_Question = 256 - CONST MsgBox_Exclamation = 512 - CONST MsgBox_Information = 1024 - - CONST MsgBox_DefaultButton1 = 2048 - CONST MsgBox_DefaultButton2 = 4096 - CONST MsgBox_DefaultButton3 = 8192 - CONST MsgBox_Defaultbutton4 = 16384 - - CONST MsgBox_AppModal = 32768 - CONST MsgBox_SystemModal = 65536 - CONST MsgBox_SetForeground = 131072 - - CONST MsgBox_Ok = 1 - CONST MsgBox_Yes = 2 - CONST MsgBox_No = 3 - CONST MsgBox_Cancel = 4 - CONST MsgBox_Abort = 5 - CONST MsgBox_Retry = 6 - CONST MsgBox_Ignore = 7 - CONST MsgBox_Tryagain = 8 - CONST MsgBox_Continue = 9 -$END IF diff --git a/InForm/extensions/gifplay.bi b/InForm/extensions/gifplay.bi deleted file mode 100644 index 4c2bd1b..0000000 --- a/InForm/extensions/gifplay.bi +++ /dev/null @@ -1,68 +0,0 @@ -'####################################################################################### -'# Animated GIF decoder v1.0 # -'# By Zom-B # -'# # -'# http://www.qb64.org/wiki/GIF_Images # -'####################################################################################### -'Adapted for use with InForm's PictureBox controls by @FellippeHeitor - -$IF GIFPLAY_BI = UNDEFINED THEN - $LET GIFPLAY_BI = TRUE - - $IF INFORM_BI = UNDEFINED THEN - OPTION _EXPLICIT - - CONST FALSE = 0, TRUE = NOT FALSE - $END IF - - TYPE GIFDATA - ID AS LONG - file AS INTEGER - sigver AS STRING * 6 - width AS _UNSIGNED INTEGER - height AS _UNSIGNED INTEGER - bpp AS _UNSIGNED _BYTE - sortFlag AS _BYTE ' Unused - colorRes AS _UNSIGNED _BYTE - colorTableFlag AS _BYTE - bgColor AS _UNSIGNED _BYTE - aspect AS SINGLE ' Unused - numColors AS _UNSIGNED INTEGER - palette AS STRING * 768 - firstFrame AS LONG - totalFrames AS LONG - IsPlaying AS _BYTE - Frame AS LONG - LoadedFrames AS LONG - GifLoadComplete AS _BYTE - LastFrameServed AS LONG - LastFrameUpdate AS SINGLE - LastFrameDelay AS SINGLE - HideOverlay AS _BYTE - END TYPE - - TYPE FRAMEDATA - ID AS LONG - thisFrame AS LONG - addr AS LONG - left AS _UNSIGNED INTEGER - top AS _UNSIGNED INTEGER - width AS _UNSIGNED INTEGER - height AS _UNSIGNED INTEGER - localColorTableFlag AS _BYTE - interlacedFlag AS _BYTE - sortFlag AS _BYTE ' Unused - palBPP AS _UNSIGNED _BYTE - minimumCodeSize AS _UNSIGNED _BYTE - transparentFlag AS _BYTE 'GIF89a-specific (animation) values - userInput AS _BYTE ' Unused - disposalMethod AS _UNSIGNED _BYTE - delay AS SINGLE - transColor AS _UNSIGNED _BYTE - END TYPE - - REDIM GIFData(0) AS GIFDATA - REDIM GIFFrameData(0) AS FRAMEDATA - DIM TotalGIFLoaded AS LONG, TotalGIFFrames AS LONG - -$END IF diff --git a/examples/GIFPlaySample/gifplaySample.bas b/examples/GIFPlaySample/gifplaySample.bas deleted file mode 100644 index 9b85672..0000000 --- a/examples/GIFPlaySample/gifplaySample.bas +++ /dev/null @@ -1,99 +0,0 @@ -': This program uses -': InForm - GUI library for QB64 - Beta version 9 -': Fellippe Heitor, 2016-2019 - fellippe@qb64.org - @fellippeheitor -': https://github.com/FellippeHeitor/InForm -'----------------------------------------------------------- - -': Controls' IDs: ------------------------------------------------------------------ -DIM SHARED gifplaySample AS LONG -DIM SHARED PictureBox1 AS LONG -DIM SHARED LoadBT AS LONG -DIM SHARED PlayBT AS LONG - -': External modules: --------------------------------------------------------------- -'$INCLUDE:'../../InForm/InForm.bi' -'$INCLUDE:'../../InForm/extensions/GIFPlay.bi' -'$INCLUDE:'GIFPlaySample.frm' - -': Event procedures: --------------------------------------------------------------- -SUB __UI_BeforeInit - -END SUB - -SUB __UI_OnLoad - Control(PlayBT).Disabled = True -END SUB - -SUB __UI_BeforeUpdateDisplay - UpdateGif PictureBox1 -END SUB - -SUB __UI_BeforeUnload -END SUB - -SUB __UI_Click (id AS LONG) - SELECT CASE id - CASE gifplaySample - - CASE LoadBT - 'file 'globe.gif' comes from: - 'https://en.wikipedia.org/wiki/GIF#/media/File:Rotating_earth_(large).gif - IF OpenGif(PictureBox1, "globe.gif") THEN - Control(PlayBT).Disabled = False - IF TotalFrames(PictureBox1) > 1 THEN - Caption(PlayBT) = "Play" - ELSE - Caption(PlayBT) = "Static gif" - Control(PlayBT).Disabled = True - END IF - Caption(LoadBT) = "globe.gif loaded" - Control(LoadBT).Disabled = True - ELSE - _DELAY 0.2: _MESSAGEBOX "GIFPlay Sample", "File 'globe.gif' could not be found.", "error" - END IF - CASE PlayBT - IF GifIsPlaying(PictureBox1) THEN - PauseGif PictureBox1 - Caption(PlayBT) = "Play" - ELSE - PlayGif PictureBox1 - Caption(PlayBT) = "Pause" - END IF - CASE PictureBox1 - HideGifOverlay PictureBox1 - END SELECT -END SUB - -SUB __UI_MouseEnter (id AS LONG) -END SUB - -SUB __UI_MouseLeave (id AS LONG) -END SUB - -SUB __UI_FocusIn (id AS LONG) -END SUB - -SUB __UI_FocusOut (id AS LONG) -END SUB - -SUB __UI_MouseDown (id AS LONG) -END SUB - -SUB __UI_MouseUp (id AS LONG) -END SUB - -SUB __UI_KeyPress (id AS LONG) -END SUB - -SUB __UI_TextChanged (id AS LONG) -END SUB - -SUB __UI_ValueChanged (id AS LONG) -END SUB - -SUB __UI_FormResized -END SUB - -'$INCLUDE:'../../InForm/InForm.ui' -'$INCLUDE:'../../InForm/xp.uitheme' -'$INCLUDE:'../../InForm/extensions/GIFPlay.bas' diff --git a/examples/GIFPlaySample/gifplaySample.frm b/examples/GIFPlaySample/gifplaySample.frm deleted file mode 100644 index 277b43a..0000000 --- a/examples/GIFPlaySample/gifplaySample.frm +++ /dev/null @@ -1,44 +0,0 @@ -': This form was generated by -': InForm - GUI library for QB64 - v1.5 -': Fellippe Heitor, 2016-2023 - fellippe@qb64.org - @fellippeheitor -': https://github.com/FellippeHeitor/InForm -'----------------------------------------------------------- - -SUB __UI_LoadForm - - DIM __UI_NewID AS LONG, __UI_RegisterResult AS LONG - - __UI_NewID = __UI_NewControl(__UI_Type_Form, "gifplaySample", 300, 281, 0, 0, 0) - __UI_RegisterResult = 0 - SetCaption __UI_NewID, "GIFPlay Sample" - Control(__UI_NewID).Font = SetFont("arial.ttf", 12) - Control(__UI_NewID).HasBorder = False - - __UI_NewID = __UI_NewControl(__UI_Type_PictureBox, "PictureBox1", 230, 230, 36, 12, 0) - __UI_RegisterResult = 0 - Control(__UI_NewID).Stretch = True - Control(__UI_NewID).HasBorder = True - Control(__UI_NewID).Align = __UI_Center - Control(__UI_NewID).VAlign = __UI_Middle - Control(__UI_NewID).BorderSize = 1 - - __UI_NewID = __UI_NewControl(__UI_Type_Button, "LoadBT", 123, 23, 36, 247, 0) - __UI_RegisterResult = 0 - SetCaption __UI_NewID, "Load globe.gif" - Control(__UI_NewID).HasBorder = False - Control(__UI_NewID).CanHaveFocus = True - - __UI_NewID = __UI_NewControl(__UI_Type_Button, "PlayBT", 80, 23, 186, 247, 0) - __UI_RegisterResult = 0 - SetCaption __UI_NewID, "Play" - Control(__UI_NewID).HasBorder = False - Control(__UI_NewID).CanHaveFocus = True - -END SUB - -SUB __UI_AssignIDs - gifplaySample = __UI_GetID("gifplaySample") - PictureBox1 = __UI_GetID("PictureBox1") - LoadBT = __UI_GetID("LoadBT") - PlayBT = __UI_GetID("PlayBT") -END SUB diff --git a/examples/GIFPlaySample/globe.gif b/examples/GIFPlaySample/globe.gif deleted file mode 100644 index 2c1f8e6..0000000 Binary files a/examples/GIFPlaySample/globe.gif and /dev/null differ