From 08d19d7512b030fa3eb1961c4baa454b9570dd53 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Fri, 20 May 2016 14:05:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=98=85=E8=A7=88=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 30_day/Makefile | 8 +- 30_day/gview/!cons_9x.bat | 1 + 30_day/gview/!cons_nt.bat | 1 + 30_day/gview/Makefile | 90 +++++ 30_day/gview/bmp.nasm | 646 ++++++++++++++++++++++++++++++ 30_day/gview/bmp.obj | Bin 0 -> 4292 bytes 30_day/gview/gview.c | 121 ++++++ 30_day/gview/jpeg.c | 733 +++++++++++++++++++++++++++++++++++ 30_day/gview/make.bat | 1 + 30_day/pictdata/fujisan.jpg | Bin 0 -> 15297 bytes 30_day/pictdata/fujisan_.jpg | Bin 0 -> 15978 bytes 30_day/pictdata/night.bmp | Bin 0 -> 666 bytes 30_day/pictdata/night_.bmp | Bin 0 -> 8310 bytes 13 files changed, 1600 insertions(+), 1 deletion(-) create mode 100644 30_day/gview/!cons_9x.bat create mode 100644 30_day/gview/!cons_nt.bat create mode 100644 30_day/gview/Makefile create mode 100644 30_day/gview/bmp.nasm create mode 100644 30_day/gview/bmp.obj create mode 100644 30_day/gview/gview.c create mode 100644 30_day/gview/jpeg.c create mode 100644 30_day/gview/make.bat create mode 100644 30_day/pictdata/fujisan.jpg create mode 100644 30_day/pictdata/fujisan_.jpg create mode 100644 30_day/pictdata/night.bmp create mode 100644 30_day/pictdata/night_.bmp diff --git a/30_day/Makefile b/30_day/Makefile index 0853d9d..d54fa0c 100644 --- a/30_day/Makefile +++ b/30_day/Makefile @@ -23,7 +23,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \ type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \ notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \ - calc/calc.hrb tview/tview.hrb mmlplay/mmlplay.hrb + calc/calc.hrb tview/tview.hrb mmlplay/mmlplay.hrb gview/gview.hrb $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ copy from:haribote/haribote.sys to:@: \ @@ -62,6 +62,9 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ copy from:mmldata/fujisan.mml to:@: \ copy from:mmldata/daigo.mml to:@: \ copy from:mmldata/daiku.mml to:@: \ + copy from:gview/gview.hrb to:@: \ + copy from:pictdata/fujisan.jpg to:@: \ + copy from:pictdata/night.bmp to:@: \ copy from:nihongo/nihongo.fnt to:@: \ imgout:haribote.img @@ -108,6 +111,7 @@ full : $(MAKE) -C calc $(MAKE) -C tview $(MAKE) -C mmlplay + $(MAKE) -C gview $(MAKE) haribote.img run_full : @@ -162,6 +166,7 @@ clean_full : $(MAKE) -C calc clean $(MAKE) -C tview clean $(MAKE) -C mmlplay clean + $(MAKE) -C gview clean src_only_full : $(MAKE) -C haribote src_only @@ -195,6 +200,7 @@ src_only_full : $(MAKE) -C calc src_only $(MAKE) -C tview src_only $(MAKE) -C mmlplay src_only + $(MAKE) -C gview src_only -$(DEL) haribote.img refresh : diff --git a/30_day/gview/!cons_9x.bat b/30_day/gview/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/30_day/gview/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/30_day/gview/!cons_nt.bat b/30_day/gview/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/30_day/gview/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/30_day/gview/Makefile b/30_day/gview/Makefile new file mode 100644 index 0000000..917f0a7 --- /dev/null +++ b/30_day/gview/Makefile @@ -0,0 +1,90 @@ +APP = gview +STACK = 4480k +MALLOC = 0k + +TOOLPATH = ../../z_tools/ +INCPATH = ../../z_tools/haribote/ +APILIBPATH = ../apilib/ +HARIBOTEPATH = ../haribote/ + +MAKE = $(TOOLPATH)make.exe -r +NASK = $(TOOLPATH)nask.exe +CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -I../ -Os -Wall -quiet +GAS2NASK = $(TOOLPATH)gas2nask.exe -a +OBJ2BIM = $(TOOLPATH)obj2bim.exe +MAKEFONT = $(TOOLPATH)makefont.exe +BIN2OBJ = $(TOOLPATH)bin2obj.exe +BIM2HRB = $(TOOLPATH)bim2hrb.exe +BIM2BIN = $(TOOLPATH)bim2bin.exe +RULEFILE = ../haribote.rul +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +GOLIB = $(TOOLPATH)golib00.exe +COPY = copy +DEL = del + +#默认动作 + +default : + $(MAKE) $(APP).hrb + +#文件生成规则 + +$(APP).bim : $(APP).obj bmp.obj jpeg.obj $(APILIBPATH)apilib.lib Makefile + $(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \ + $(APP).obj jpeg.obj bmp.obj $(APILIBPATH)apilib.lib + +haribote.img : ../haribote/ipl20.bin ../haribote/haribote.sys $(APP).hrb \ + Makefile + $(EDIMG) imgin:../../z_tools/fdimg0at.tek \ + wbinimg src:../haribote/ipl20.bin len:512 from:0 to:0 \ + copy from:../haribote/haribote.sys to:@: \ + copy from:$(APP).hrb to:@: \ + copy from:../nihongo/nihongo.fnt to:@: \ + imgout:haribote.img + +# 其他指令 + +%.gas : %.c ../apilib.h Makefile + $(CC1) -o $*.gas $*.c + +%.nas : %.gas Makefile + $(GAS2NASK) $*.gas $*.nas + +%.obj : %.nas Makefile + $(NASK) $*.nas $*.obj $*.lst + +%.org : %.bim Makefile + $(BIM2HRB) $*.bim $*.org $(MALLOC) + +%.hrb : %.org Makefile + $(BIM2BIN) -osacmp in:$*.org out:$*.hrb + +# 运行程序 + +run : + $(MAKE) haribote.img + $(COPY) haribote.img ..\..\z_tools\qemu\fdimage0.bin + $(MAKE) -C ../../z_tools/qemu + +full : + $(MAKE) -C $(APILIBPATH) + $(MAKE) $(APP).hrb + +run_full : + $(MAKE) -C $(APILIBPATH) + $(MAKE) -C ../haribote + $(MAKE) run + +clean : + -$(DEL) *.lst + -$(DEL) gview.obj + -$(DEL) jpeg.obj + -$(DEL) *.map + -$(DEL) *.bim + -$(DEL) *.org + -$(DEL) haribote.img + +src_only : + $(MAKE) clean + -$(DEL) $(APP).hrb diff --git a/30_day/gview/bmp.nasm b/30_day/gview/bmp.nasm new file mode 100644 index 0000000..e6c0243 --- /dev/null +++ b/30_day/gview/bmp.nasm @@ -0,0 +1,646 @@ +; BMP decode routine by I.Tak. 2003 + +section .text align=1 +[bits 32] +;BMP File Structure (I can't understand MS.) + + struc BMP + ;FILE HEADER +.fType: resw 1 ;BM +.fSize: resd 1 ;whole file size + resd 1 ;reserved +.fOffBits: resd 1 ;offset from file top to image + ;INFO HEADER +.iSize: resd 1 ;INFO HEADER size +.iWidth: resd 1 ;Image Width in pixels +.iHeight: resd 1 ;Image Height in pixels +.iPlanes: resw 1 ;must be 1 +.iBitCount: resw 1 ;BitPerPixel 1, 4, 8, 24 (and 15,16 for new OS/2 ?) +.iCompression: resd 1 ;Compress Type. 0 for none, then SizeImage=0 +.iSizeImage: resd 1 ;Image Size(compressed) +.iXPPM: resd 1 ;X Pixel Per Meter +.iYPPM: resd 1 +.iClrUsed: resd 1 ;Number of used ColorQuad (0 for whole Quad) +.iClrImportant: resd 1 ;Number of Important ColorQuad. + endstruc + + struc BMPOS2 + ;FILE HEADER +.fType: resw 1 ;BM +.fSize: resd 1 ;whole file size + resd 1 ;reserved +.fOffBits: resd 1 ;offset from file top to image + ;CORE HEADER +.iSize: resd 1 ;CORE HEADER size +.iWidth: resw 1 ;Image Width in pixels +.iHeight: resw 1 ;Image Height in pixels +.iPlanes: resw 1 ;must be 1 +.iBitCount: resw 1 ;BitPerPixel 1, 4, 8, 24 (and 15,16 for new OS/2 ?) + endstruc + +; B/W bmp can also have palettes. The first for 0, second for 1. + + struc CQuad +.b: resb 1 +.g: resb 1 +.r: resb 1 + resb 1 ;reserved + endstruc + + +%if 0 +int info_BMP(struct DLL_STRPICENV *env, int *info, int size, UCHAR *fp); +/* 1 (0?), Ԥ0 */ +int decode0_BMP(struct DLL_STRPICENV *env, int size, UCHAR *fp, + int b_type, UCHAR *buf, int skip); +/* 顼ɤ֤Ȥꤢ0ˤƤ */ +env64KBΥꥢǤ롣Ƭ8dw֤ѤˤʤäƤ롣 +ȯ餷, 󥹥ѿŪˤϻȤʤ褦JPEG_init +base_imgΤdecodeΤȤǤȻפ +%endif + +[absolute 0] ;naskʤ[section .bss] org 0 win32ᤫ +bmpinfo: +.regs: resd 4 +.reteip: resd 1 +.env: resd 1 +.info: resd 1 +.size: resd 1 +.module: resd 1 +[absolute 0] +info: +.type: resd 1 ;1 for BMP, 2 for JPEG + resd 1 ;0 +.width: resd 1 +.height: resd 1 +[section .text] +[global _info_BMP] +_info_BMP: + push ebx + push ebp + push esi + push edi + mov esi, [esp+bmpinfo.module] + mov eax, [esp+bmpinfo.size] + call bmpHeader + test edi, edi + jz .ret + mov esi, [esp+bmpinfo.info] + mov [esi+info.width], eax + mov [esi+info.height], ecx + mov [esi+info.type], edi ;=1 + dec edi + mov [esi+info.type+4], edi ;=0 + inc edi +.ret: mov eax, edi + pop edi + pop esi + pop ebp + pop ebx + ret + +;in: esi=module, eax=size +;ret:eax=width, ecx=hegiht, edx=paletteSize, ebx=palette +; ebp=bpp, esi=endOfImage, edi=successFlag +bmpHeader: + lea edx, [esi+eax] ;moduleEnd + xor edi, edi + push edx + xor edx, edx + + cmp eax, byte BMP.iSize+4 + jbe ..@ret ;ѤƤޤ + cmp word[esi],'BM' + je .notMAC + sub esi, byte -128 + add eax, byte -128 + pop ebx + push eax + cmp eax, byte BMP.iSize+4 +..@ret: jbe .ret + cmp word[esi], 'BM' + jne .ret +.notMAC: + ;;MS,OS/2 եޥåȳǧ + mov ecx, [esi +BMP.iSize] + cmp ecx, byte 12 ;OS/2 format. + jne .MS + cmp eax, byte BMPOS2_size + jbe .ret ;coreإåʤ + lea ebx, [esi+ecx+14] ;palette + movzx eax, word[esi+BMPOS2.iWidth] ;width + movzx ecx, word[esi+BMPOS2.iHeight] ;height + movzx ebp, word[esi+BMPOS2.iBitCount] ;bpp + mov dl, 3 ;paletteSize + jmp short .endif +.MS: cmp eax, byte BMP_size + jbe .ret ;infoإåʤ + lea ebx, [esi+ecx+14] + sub ecx,byte 40 + jne .ret ;unknownFormat + cmp ecx, [esi+BMP.iCompression] + jne .ret ;Compressed. + mov eax, [esi+BMP.iWidth] ;width + mov ecx, [esi+BMP.iHeight] ;height + movzx ebp, word[esi +BMP.iBitCount] ;bpp + mov dl, 4 ;paletteSize +.endif: + add esi, [esi +BMP.fOffBits] + + ;sizeheightäƤǤ + ;ɤ٤ϥ顼 + push edx + push eax + mul ebp ;eax=width*bpp + add eax, byte 7 + shr eax, 3 ;lineSizeWithoutPudding + mov edx, eax + add eax, byte 3 ;size<1GBꤷedx̵ + and al, -4 ;lineSizeWithPudding + sub edx, eax ;-puddingSize + push edx + mul ecx + pop edx + add esi, eax + add esi, edx ;ǽԤκǸˤpuddingʤȸ٤ + cmp esi, [esp+8] ;endOfModule + pop eax + ja .ret2 + sub esi, edx ;esi=endOfImage + inc edi ;succeeded! +.ret2: pop edx +.ret: add esp, byte 4 + ret + +;*************************************************************** +; ͥǺäƤ뤬, ®ͥǺäΤΤꤤ⡣ +; ʼι®⡼ɤΤߺäƤ + +[absolute 0] +decode: +.regs: resd 4 +.reteip: resd 1 +.env: resd 1 +.size: resd 1 +.module: resd 1 +.outputType: resd 1 +.dest: resd 1 +.skip: resd 1 +[section .text] +[global _decode0_BMP] +_decode0_BMP: + push ebx + push ebp + push esi + push edi + mov esi, [esp+decode.module] + mov eax, [esp+decode.size] + call bmpHeader + ;ret:eax=width, ecx=hegiht, edx=paletteSize, ebx=palette + ; ebp=bpp, esi=endOfImage, edi=successFlag + test edi,edi + jz .error + mov edi, [esp+decode.dest] + push dword[esp+decode.outputType] + push dword[esp+4+decode.skip] + push ecx ;height + push eax + push edx + mul ebp + add eax, byte 31 + shr eax, 3 + and al, -4 + push eax + mov edx, ebp + mov ebp, esp + call bmp2beta ;ecx!=0 for error + add esp, byte bb.size + mov eax, ecx + test ecx, ecx + jz .ret +.error: push byte 1 + pop eax +.ret: pop edi + pop esi + pop ebp + pop ebx + ret + +[absolute -4*2] +bb: +.col0: resd 1 ;bpp1ǻȤ +.reteip: resd 1 +.sw: resd 1 ;byte +.paletteSize: resd 1 ;byte +.w: resd 1 ;pixel +.h: resd 1 +.s: resd 1 +.t: resd 1 +.size: equ $-$$ +[section .text] +;eax=?, ecx=height, edx=bpp, ebx=palette +;ebp=bb, esi=endOfImage, edi=dest +bmp2beta: + mov al, [ebp+bb.t] + and al, 0x7f + cmp al, 2 + je near buf16 + cmp al, 4 + je buf32 + mov ecx, esp ;!=0 + ret +;=============================================================== +; Buffer mode 4 +;=============================================================== +buf32: + dec edx + je near .bpp1 + sub edx, byte 4-1 + je .bpp4 + sub edx, byte 8-4 + je .bpp8 + sub edx, byte 24-8 + je .bpp24 + mov ecx, esp ;!=0 + ret +;--------------------------------------------------- +; 24bpp BMP to 4byte bufer +;--------------------------------------------------- +.bpp24: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + ;bb.w=width(pixel), bb.s=skipByte, bb.h=height + ;bb.t=outputType, bb.sw=sourceWidthByte + + .do24.1: + sub esi, [ebp+bb.sw] ;esi=startOfLine + push ecx + push esi + mov ecx, [ebp+bb.w] + .do24.2: + mov al, [esi] + mov [edi+3], dl + mov [edi], al + mov al, [esi+1] + mov [edi+1], al + mov al, [esi+2] + mov [edi+2], al + add esi, byte 3 + add edi, byte 4 + dec ecx + jnz .do24.2 + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do24.1 + ret + +;--------------------------------------------------- +; 8bpp BMP to 4byte buffer +;--------------------------------------------------- +.bpp8: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov dl, 255 + mov eax, [ebp+bb.paletteSize] + sub ebx, eax + shl eax, 8 + add ebx, eax ;ebx += paletteSize*255 + .do8.1: + mov eax, [ebx] + sub ebx, [ebp+bb.paletteSize] + and eax, 0x00ffffff + dec edx + push eax + jns .do8.1 + + .do8.2: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do8.3: + xor eax, eax + add edi, byte 4 + mov al, [esi] + inc esi + ;AGI stole + mov eax, [esp+eax*4+8] + dec ecx + mov [edi-4], eax + jnz .do8.3 + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do8.2 + add esp, 256*4 ;palette + ret + +;--------------------------------------------------- +; 4bpp BMP to 4byte buffer +;--------------------------------------------------- +.bpp4: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov dl, 16 + mov eax, [ebp+bb.paletteSize] + sub ebx, eax + shl eax, 4 + add ebx, eax ;ebx+=eax*15 + .do4.1 + mov eax, [ebx] + sub ebx, [ebp+bb.paletteSize] + and eax, 0x00ffffff + dec edx + push eax + jnz .do4.1 + + .do4.2: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do4.3: + xor edx, edx + mov al, [esi] + mov dl, al + inc esi + shr dl, 4 + and eax, byte 15 + add edi, byte 4 + dec ecx + mov edx, [esp+edx*4+8] + mov eax, [esp+eax*4+8] + mov [edi-4], edx + jz .wend + mov [edi], eax + add edi, byte 4 + dec ecx + jnz .do4.3 +.wend: pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do4.2 + add esp, 16*4 ;palette + ret + +;--------------------------------------------------- +; 1bpp BMP to 4byte buffer +;--------------------------------------------------- +.bpp1: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov eax, [ebx] + add ebx, [ebp+bb.paletteSize] + and eax, 0x00ffffff + mov ebx, [ebx] + and ebx, 0x00ffffff + xor ebx, eax + ;push ebx + push eax + + .do1.1: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do1.2: + mov dl, [esi] + inc esi + push esi + mov esi, 8 + .do1.3: + add edi, byte 4 + add dl, dl + sbb eax, eax + and eax, ebx + xor eax, [ebp+bb.col0] + dec ecx + mov [edi-4], eax + jz .wend1bpp + dec esi + jnz .do1.3 + pop esi + jmp short .do1.2 +.wend1bpp:pop ecx + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do1.1 + pop eax + ret + +;=============================================== +; Buffer mode 2byte +;=============================================== +buf16: + dec edx + je near .bpp1 + sub edx, byte 4-1 + je near .bpp4 + sub edx, byte 8-4 + je .bpp8 + sub edx, byte 24-8 + je .bpp24 + mov ecx, esp + ret +;--------------------------------------------------- +; 24bpp BMP to 2byte bufer +;--------------------------------------------------- +.bpp24: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + .do24.1: + sub esi, [ebp+bb.sw] ;esi=startOfLine + push ecx + push esi + mov ecx, [ebp+bb.w] + .do24.2: + mov al, [esi+2] + shl eax, 16 + mov ax, [esi] + add esi, byte 3 + ; eax=24bitColor, edx=work, ecx=counter, ebx=work + ;礵μ̣פä롼äƤ褷( + ;Ȼ롼äƤ褷 + shr ah, 2 ;???????? RRRRRrrr 00GGGGGG BBBBBbbb + inc edi + shr eax, 3 ;000????? ???RRRRR rrr00GGG GGGBBBBB + shl ax, 5 ;000????? ???RRRRR GGGGGGBB BBB00000 + inc edi + shr eax, 5 ;00000000 ???????? RRRRRGGG GGGBBBBB + dec ecx + mov [edi-2], ax + jnz .do24.2 + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do24.1 + ret + +;--------------------------------------------------- +; 8bpp BMP to 2byte buffer +;--------------------------------------------------- +.bpp8: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov dl, 255 + mov eax, [ebp+bb.paletteSize] + sub ebx, eax + shl eax, 8 + add ebx, eax ;ebx += paletteSize*255 + .do8.1: + mov eax, [ebx] + sub ebx, [ebp+bb.paletteSize] + call .paletteConv + dec edx + push eax + jns .do8.1 + + .do8.2: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do8.3: + xor eax, eax + add edi, byte 2 + mov al, [esi] + inc esi + ;AGI stole + mov eax, [esp+eax*4+8] + dec ecx + mov [edi-2], ax + jnz .do8.3 + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do8.2 + add esp, 256*4 ;palette + ret + +;--------------------------------------------------- +; 4bpp BMP to 2byte buffer +;--------------------------------------------------- +.bpp4: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov dl, 16 + mov eax, [ebp+bb.paletteSize] + sub ebx, eax + shl eax, 4 + add ebx, eax ;ebx+=eax*15 + .do4.1: + mov eax, [ebx] + sub ebx, [ebp+bb.paletteSize] + call .paletteConv + dec edx + push eax + jnz .do4.1 + + .do4.2: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do4.3: + xor edx, edx + mov al, [esi] + mov dl, al + inc esi + shr dl, 4 + and eax, byte 15 + add edi, byte 2 + dec ecx + mov edx, [esp+edx*4+8] + mov eax, [esp+eax*4+8] + mov [edi-2], dx + jz .wend + mov [edi], ax + add edi, byte 2 + dec ecx + jnz .do4.3 +.wend: pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do4.2 + add esp, 16*4 ;palette + ret + +;--------------------------------------------------- +; 1bpp BMP to 2byte buffer +;--------------------------------------------------- +.bpp1: + ;ecx=height, edx=0, ebx=palette + ;esi=endOfImage, edi=destinationBuffer + + ;palleteѴ + mov eax, [ebx] + add ebx, [ebp+bb.paletteSize] + call .paletteConv + push eax + mov eax, [ebx] + call .paletteConv + pop ebx + xchg eax, ebx + xor ebx, eax + push eax + + .do1.1: + sub esi, [ebp+bb.sw] ;esi=firstLineStart + push ecx + push esi + mov ecx, [ebp+bb.w] + .do1.2: + mov dl, [esi] + inc esi + push esi + mov esi, 8 + .do1.3: + add dl, dl + inc edi + sbb eax, eax + inc edi + and eax, ebx + xor eax, [ebp+bb.col0] + dec ecx + mov [edi-2], ax + jz .wend1bpp + dec esi + jnz .do1.3 + pop esi + jmp short .do1.2 +.wend1bpp: + pop ecx + pop esi + pop ecx + add edi, [ebp+bb.s] + dec ecx + jnz .do1.1 + pop eax + ret + +.paletteConv: + shr ah, 2 + shr eax, 3 + shl ax, 5 + shr eax, 5 + ret diff --git a/30_day/gview/bmp.obj b/30_day/gview/bmp.obj new file mode 100644 index 0000000000000000000000000000000000000000..335ca9d41246f2d6b566a74014e9c88dd0be881f GIT binary patch literal 4292 zcmZ{me{54#6vtnGFb3k@BtQnD4pS6FpL8QI1VJ~}GId)SKQ?}j*1nG7*4FkF{DBI# zL%RASivReBCML!N|IuKC#6;531yLh0i$SA8ApCGlMPs7OWHP_!zT0=-6?jS4b3XTb z&pqed+xzyI!=cRj;MwKXZbdN^^U)0bsgh0Pyh~A*;+r(3r&_7px_a%p_PpV#&ad#y z9ID1h@0gms1>b;GIbV6MWm0ZgYwmfsKR433W%I`3D^tq6V{P8S%*bSQ?=%P_dzRHV ztJ#?_GnaQ~3cEK3*x1X~SnnQ+*HV%BXOh}`8|g-7sC&C%yt1jHLOtx8tR8Neq8^S_ z9d!LNFEg@G-P_6sGneM5z4dUGwA`-tE{2i!P0qJWgLvjaw`<45w!oDOnZo$~Ay@8b zrr`37&OO?8F~`XzhNrwkeF=ptb5Hs=WCq+tUhPa&TQyWOHa14p&ZnrmJf1PM z0iSzU1==X)9f;`}4djM%7lx)nk{PJV9q;`@%~HVajt_wV0>{7G6%)l6>pBb*SMDx}`+Salen+3rxzF#+9CKwp zcQ>WaZ&~kpuCgipZSmk(zR^9m*ng(nQOvvMZFbK_`pP4Lr~fR4@fI+pugsTUku7h^ z`A5^2`Q+1k1{7?2@n9tn;g&Jj?4O z4}B~%@DS2*@pSUH?m0(kd5eKkR(;ca>yFS&%u@!Z7iN85+c-k$so65nmh{hCe)(}d z5BFsUb?$dkQ|IUiWroqY<;=KF=X}ooGnJ8i8TwWD)#=BUMf%T-!}qwRNX~yXeVPY8 zac%#GzC+Oe_s?1CADjIfpMB~^4IJ9fV%)HSPOE{DT>DiuI|1?twa|$z<-rH677jIH zIFNS@J&5m(`>)qTWzavp;5U0nDc+!o=ml>DI#JXj(QX|f>A5=*EyAEf`A0yVLAi!6qv%rM@{}NlZd+>537g0@R6*AXV@tN@O-X(h1G| z@Fq*-0eE!h2#pWk42iVCqsvHWw!*tzB2U7*QzEu5DQ1^xA zZV=JKhE?fc7~}Mq8b-9xHKa?yL`jqUUlp|w&}lH^;M7H9k+>}mnad~$9+A(ZAe9o? z03z2F0gHHbV=ZkF7|LtV&?8oV3xw_~LEZzIB$1E!Ec&8-Q}>#Iqk?i{P47 z5P2Wu0gHq}#1v%&uNZT!P)K_`-aX$&X#6l{joLM-orLj-4Ev$6oy?HNBx2tYc^l0T z`wo&KB02_w9kq9iG`Ik49mAQg3F$^~xu_x?siiBS-69m@8|1S~B0pV2E`ekv&EFsg zB;vr~`$Qr)gA^q)9po#C%m(>YBJ)8;B(fBw4C?{%6TT9pLLzHG>Lk($vO*%;LDoxT z2S`vNFM@2B$g3c9V$9V;>4=wZ+1D*XJ$xIQLlQY~4LJmIMA8&NsI#K36Ci&{mSh4ydkar}~0P?;>T0uUP z$VQN_B(fdkq(yeY!#hlita&=2o7QSN&5X51BK1)t#hj>xqwUeKvCV`l^=Q{N!?Xk4 z!I;j)nAQ+a$M{G?yeE;=Q>kb?CSo=91iQ?2q8))ivpKNdvKqRRYg2mI#BiE=67i%F zG(+MAD>7zIDLdxa@+RL(ojF$a%o7DLSJc2
-iO|P(5qiOQDo0inOQi^a4J({pw zJ+{NL+54!ZW4A`h>4}Ha_=k-Inn7E^tevdW%-m*nx|5tv`X9`)u)0Ajtki>HJt-_L z7B`w7Zm@yo)iy_ug`*Lhk0>>=%U>#Hb><6()}rFLN40U2Rl{vw4EN$`Bat@P`Qjw3 zrwnV}6A0I74$Lo44oYT+!D1lS}2jIS)iD9I9{_r z^V%JhSyI(myw0Yn(@K(XyiThXauL%Wa)C|0z>@DogT+jdfY-K=*EZ8D&Ge!Kn(bXE zih(VPDLE`tQ^ks5oEO9GlEf;;l(S-(gcrkYA?L+_mx?iGvSOH;7sG8alNZBh+KS ' '; p++) { } /*一直读到空格为止*/ + for (; *p == ' '; p++) { } /*跳过空格*/ + + /*文件载入*/ + i = api_fopen(p); if (i == 0) { error("file not found.\n"); } + fsize = api_fsize(i, 0); + if (fsize > 512 * 1024) { + error("file too large.\n"); + } + api_fread(filebuf, fsize, i); + api_fclose(i); + + /*检查文件类型*/ + if (info_BMP(&env, info, fsize, filebuf) == 0) { + /*不是BMP */ + if (info_JPEG(&env, info, fsize, filebuf) == 0) { + /*也不是JPEG */ + api_putstr0("file type unknown.\n"); + api_end(); + } + } + /*上面其中一个info函数调用成功的话,info中包含以下信息 */ + /*info[0]:文件类型(1:BMP、2:JPEG)*/ + /*info[1]:颜色数信息*/ + /*info[2]:xsize */ + /* info[3] : ysize */ + + if (info[2] > 1024 || info[3] > 768) { + error("picture too large.\n"); + } + + /*窗口准备*/ + xsize = info[2] + 16; + if (xsize < 136) { + xsize = 136; + } + win = api_openwin(winbuf, xsize, info[3] + 37, -1, "gview"); + + /*将文件内容转换为图像数据*/ + if (info[0] == 1) { + i = decode0_BMP (&env, fsize, filebuf, 4, (char *) picbuf, 0); + } else { + i = decode0_JPEG(&env, fsize, filebuf, 4, (char *) picbuf, 0); + } + /*b_type = 4表示struct RGB格式*/ + /*skip设为0即可*/ + if (i != 0) { + error("decode error.\n"); + } + + /*显示*/ + for (i = 0; i < info[3]; i++) { + p = winbuf + (i + 29) * xsize + (xsize - info[2]) / 2; + q = picbuf + i * info[2]; + for (j = 0; j < info[2]; j++) { + p[j] = rgb2pal(q[j].r, q[j].g, q[j].b, j, i); + } + } + api_refreshwin(win, (xsize - info[2]) / 2, 29, (xsize - info[2]) / 2 + info[2], 29 + info[3]); + + /*等待结束*/ + for (;;) { + i = api_getkey(1); + if (i == 'Q' || i == 'q') { + api_end(); + } + } +} + +unsigned char rgb2pal(int r, int g, int b, int x, int y) +{ + static int table[4] = { 3, 1, 0, 2 }; + int i; + x &= 1; /*判断是偶数还是奇数*/ + y &= 1; + i = table[x + y * 2]; /*用于生成中间色的常量*/ + r = (r * 21) / 256; /*结果为0~20*/ + g = (g * 21) / 256; + b = (b * 21) / 256; + r = (r + i) / 4; /*结果为0~5*/ + g = (g + i) / 4; + b = (b + i) / 4; + return 16 + r + g * 6 + b * 36; +} + +void error(char *s) +{ + api_putstr0(s); + api_end(); +} diff --git a/30_day/gview/jpeg.c b/30_day/gview/jpeg.c new file mode 100644 index 0000000..1b37085 --- /dev/null +++ b/30_day/gview/jpeg.c @@ -0,0 +1,733 @@ +/* + * JPEG decoding engine for DCT-baseline + * + * copyrights 2003 by nikq | nikq::club. + * + * + */ + + +typedef unsigned char UCHAR; + +struct DLL_STRPICENV { int work[16384]; }; + +typedef struct +{ + int elem; + unsigned short code[256]; + unsigned char size[256]; + unsigned char value[256]; +}HUFF; + +typedef struct +{ + // SOF + int width; + int height; + // MCU + int mcu_width; + int mcu_height; + + int max_h,max_v; + int compo_count; + int compo_id[3]; + int compo_sample[3]; + int compo_h[3]; + int compo_v[3]; + int compo_qt[3]; + + // SOS + int scan_count; + int scan_id[3]; + int scan_ac[3]; + int scan_dc[3]; + int scan_h[3]; + int scan_v[3]; + int scan_qt[3]; + + // DRI + int interval; + + int mcu_buf[32*32*4]; + int *mcu_yuv[4]; + int mcu_preDC[3]; + + // DQT + int dqt[3][64]; + int n_dqt; + + // DHT + HUFF huff[2][3]; + + + // FILE i/o + unsigned char *fp, *fp1; + unsigned long bit_buff; + int bit_remain; + int width_buf; + + int base_img[64][64]; + + /* for dll + + JPEG *jpeg = (JPEG *)malloc(sizeof(JPEG) + 256); + */ + int dummy[64]; + +}JPEG; + +/* for 16bit */ +#ifndef PIXEL16 +#define PIXEL16(r, g, b) ((r) << 11 | (g) << 5 | (b)) + /* 0 <= r <= 31, 0 <= g <= 63, 0 <= b <= 31 */ +#endif + +int info_JPEG(struct DLL_STRPICENV *env, int *info, int size, UCHAR *fp); +int decode0_JPEG(struct DLL_STRPICENV *env, int size, UCHAR *fp, int b_type, UCHAR *buf, int skip); + +void jpeg_idct_init(int base_img[64][64]); +int jpeg_init(JPEG *jpeg); +// int jpeg_header(JPEG *jpge); +void jpeg_decode(JPEG *jpeg, unsigned char *rgb,int b_type); + +/* ----------------- start main section ----------------- */ + +int info_JPEG(struct DLL_STRPICENV *env,int *info, int size, UCHAR *fp0) +{ + JPEG *jpeg = (JPEG *) (((int *) env) + 128); + jpeg->fp = fp0; + jpeg->fp1 = fp0 + size; + +// if (512 + sizeof (JPEG) > 64 * 1024) +// return 0; + + if (jpeg_init(jpeg)) + return 0; +// jpeg_header(jpeg); + + if (jpeg->width == 0) + return 0; + + info[0] = 0x0002; + info[1] = 0x0000; + info[2] = jpeg->width; + info[3] = jpeg->height; + + /* OK */ + return 1; +} + +int decode0_JPEG(struct DLL_STRPICENV *env,int size, UCHAR *fp0, int b_type, UCHAR *buf, int skip) +{ + JPEG *jpeg = (JPEG *) (((int *) env) + 128); + jpeg->fp = fp0; + jpeg->fp1 = fp0 + size; + + jpeg_idct_init(jpeg->base_img); + jpeg_init(jpeg); +// jpeg_header(jpeg); + +// if (jpeg->width == 0) +// return 8; + /* decode*/ + + jpeg->width_buf = skip / (b_type & 0x7f) + jpeg->width; + jpeg_decode(jpeg, buf, b_type); + + /* OK */ + return 0; +} + +// -------------------------- I/O ---------------------------- + +unsigned short get_bits(JPEG *jpeg, int bit) +{ + unsigned char c, c2; + unsigned short ret; + unsigned long buff; + int remain; + + buff = jpeg->bit_buff; + remain = jpeg->bit_remain; + + while (remain <= 16) { + if (jpeg->fp >= jpeg->fp1) { + ret = 0; + goto fin; + } + c = *jpeg->fp++; + if (c == 0xff) { + if (jpeg->fp >= jpeg->fp1) { + ret = 0; + goto fin; + } + jpeg->fp++; /* 00 skip */ + } + buff = (buff << 8) | c; + remain += 8; + } + ret = (buff >> (remain - bit)) & ((1 << bit) - 1); + remain -= bit; + + jpeg->bit_remain = remain; + jpeg->bit_buff = buff; +fin: + return ret; +} + +// ------------------------ JPEG ----------------- + +// start of frame +int jpeg_sof(JPEG *jpeg) +{ + unsigned char c; + int i, h, v, n; + + if (jpeg->fp + 8 > jpeg->fp1) + goto err; + /* fp[2] ‚Í bpp */ + jpeg->height = jpeg->fp[3] << 8 | jpeg->fp[4]; + jpeg->width = jpeg->fp[5] << 8 | jpeg->fp[6]; + n = jpeg->compo_count = jpeg->fp[7]; // Num of compo, nf + jpeg->fp += 8; + if (jpeg->fp + n * 3 > jpeg->fp1) + goto err; + + for (i = 0; i < n; i++) { + jpeg->compo_id[i] = jpeg->fp[0]; + + jpeg->compo_sample[i] = c = jpeg->fp[1]; + h = jpeg->compo_h[i] = (c >> 4) & 0x0f; + v = jpeg->compo_v[i] = c & 0x0f; + + if (jpeg->max_h < h) + jpeg->max_h = h; + if (jpeg->max_v < v) + jpeg->max_v = v; + + jpeg->compo_qt[i] = jpeg->fp[2]; + jpeg->fp += 3; + } + return 0; +err: + jpeg->fp = jpeg->fp1; + return 1; +} + +// define quantize table +int jpeg_dqt(JPEG *jpeg) +{ + unsigned char c; + int i, j, v, size; + + if (jpeg->fp + 2 > jpeg->fp1) + goto err; + size = (jpeg->fp[0] << 8 | jpeg->fp[1]) - 2; + jpeg->fp += 2; + if (jpeg->fp + size > jpeg->fp1) + goto err; + + while (size > 0) { + c = *jpeg->fp++; + size--; + j = c & 7; + if (j > jpeg->n_dqt) + jpeg->n_dqt = j; + + if (c & 0xf8) { + // 16 bit DQT + for (i = 0; i < 64; i++) { + jpeg->dqt[j][i] = jpeg->fp[0]; + jpeg->fp += 2; + } + size += -64 * 2; + } else { + // 8 bit DQT + for (i = 0; i < 64; i++) + jpeg->dqt[j][i] = *jpeg->fp++; + size -= 64; + } + } + return 0; +err: + jpeg->fp = jpeg->fp1; + return 1; +} + +// define huffman table +int jpeg_dht(JPEG *jpeg) +{ + unsigned tc, th; + unsigned code = 0; + unsigned char val; + int i, j, k, num, Li[17]; + int len, max_val; + HUFF *table; + + if (jpeg->fp + 2 > jpeg->fp1) + goto err; + len = (jpeg->fp[0] << 8 | jpeg->fp[1]) - 2; + jpeg->fp += 2; + + while (len > 0) { + if (jpeg->fp + 17 > jpeg->fp1) + goto err; + val = jpeg->fp[0]; + + tc = (val >> 4) & 0x0f; + th = val & 0x0f; + table = &(jpeg->huff[tc][th]); + + num = 0; + k = 0; + for (i = 1; i <= 16; i++) { + Li[i] = jpeg->fp[i]; + num += Li[i]; + for (j = 0; j < Li[i]; j++) + table->size[k++] = i; + } + table->elem = num; + jpeg->fp += 17; + + k=0; + code=0; + i = table->size[0]; + while (k < num) { + while (table->size[k] == i) + table->code[k++] = code++; + if (k >= num) + break; + do { + code <<= 1; + i++; + } while (table->size[k] != i); + } + + if (jpeg->fp + num > jpeg->fp1) + goto err; + for (k = 0; k < num; k++) + table->value[k] = jpeg->fp[k]; + jpeg->fp += num; + + len -= 18 + num; + } + return 0; +err: + jpeg->fp = jpeg->fp1; + return 1; +} + +int jpeg_init(JPEG *jpeg) +{ + unsigned char c; + int r = 0, i; + jpeg->width = 0; + jpeg->mcu_preDC[0] = 0; + jpeg->mcu_preDC[1] = 0; + jpeg->mcu_preDC[2] = 0; + jpeg->n_dqt = 0; + jpeg->max_h = 0; + jpeg->max_v = 0; + jpeg->bit_remain = 0; + jpeg->bit_buff = 0; + + jpeg->interval = 0; +// return; +//} +// +//int jpeg_header(JPEG *jpeg) +//{ +// unsigned char c; +// int r = 0, i; + + for (;;) { + if (jpeg->fp + 2 > jpeg->fp1) + goto err; + if (jpeg->fp[0] != 0xff) + goto err0; + c = jpeg->fp[1]; + jpeg->fp += 2; + if (c == 0xd8) + continue; /* SOI */ + if (c == 0xd9) + goto err; /* EOI */ + + if (c == 0xc0) + jpeg_sof(jpeg); + else if (c == 0xc4) + jpeg_dht(jpeg); + else if (c == 0xdb) + jpeg_dqt(jpeg); + else if (c == 0xdd) { + if (jpeg->fp + 4 > jpeg->fp1) + goto err; + jpeg->interval = jpeg->fp[2] << 8 | jpeg->fp[3]; + jpeg->fp += 4; + } else if (c == 0xda) { + if (jpeg->fp + 3 > jpeg->fp1) + goto err; + jpeg->scan_count = jpeg->fp[2]; + jpeg->fp += 3; + if (jpeg->fp + jpeg->scan_count * 2 > jpeg->fp1) + goto err; + for (i = 0; i < jpeg->scan_count; i++) { + jpeg->scan_id[i] = jpeg->fp[0]; + jpeg->scan_dc[i] = jpeg->fp[1] >> 4; // DC Huffman Table + jpeg->scan_ac[i] = jpeg->fp[1] & 0x0F; // AC Huffman Table + jpeg->fp += 2; + } + jpeg->fp += 3; /* 3bytes skip */ + goto fin; + } else { + if (jpeg->fp + 2 > jpeg->fp1) + goto err; + jpeg->fp += jpeg->fp[0] << 8 | jpeg->fp[1]; + } + } +err: + jpeg->fp = jpeg->fp1; +err0: + r++; +fin: + return r; +} + +// MCU decode + +void jpeg_decode_init(JPEG *jpeg) +{ + int i, j; + + for (i = 0; i < jpeg->scan_count; i++) { + // i:scan + for (j = 0; j < jpeg->compo_count; j++) { + // j:frame + if (jpeg->scan_id[i] == jpeg->compo_id[j]) { + jpeg->scan_h[i] = jpeg->compo_h[j]; + jpeg->scan_v[i] = jpeg->compo_v[j]; + jpeg->scan_qt[i] = jpeg->compo_qt[j]; + break; + } + } + // if (j >= jpeg->compo_count) + // return 1; + } + jpeg->mcu_width = jpeg->max_h * 8; + jpeg->mcu_height = jpeg->max_v * 8; + + for (i = 0; i < 32 * 32 * 4; i++) + jpeg->mcu_buf[i] = 0x80; + + for (i = 0; i < jpeg->scan_count; i++) + jpeg->mcu_yuv[i] = jpeg->mcu_buf + (i << 10); + return; +} + +int jpeg_huff_decode(JPEG *jpeg,int tc,int th) +{ + HUFF *h = &(jpeg->huff[tc][th]); + int code,size,k,v; + code = 0; + size = 0; + k = 0; + while( size < 16 ){ + size++; + v = get_bits(jpeg,1); + if(v < 0){ + return v; + } + code = (code << 1) | v; + + while(h->size[k] == size){ + if(h->code[k] == code){ + return h->value[k]; + } + k++; + } + } + + return -1; +} + +void jpeg_idct_init(int base_img[64][64]) +{ + int u, v, m, n; + int tmpm[8], tmpn[8]; + int cost[32]; + cost[ 0] = 32768; cost[ 1] = 32138; cost[ 2] = 30274; cost[ 3] = 27246; cost[ 4] = 23170; cost[ 5] = 18205; cost[ 6] = 12540; cost[ 7] = 6393; + cost[ 8] = 0; cost[ 9] = -6393; cost[10] = -12540; cost[11] = -18205; cost[12] = -23170; cost[13] = -27246; cost[14] = -30274; cost[15] = -32138; + for (u = 0; u < 16; u++) + cost[u + 16] = - cost[u]; + + for (u = 0; u < 8; u++) { + { + int i=u, d=u*2; + if (d == 0) + i = 4; + for (m = 0; m < 8; m++){ + tmpm[m] = cost[i]; + i=(i+d)&31; + } + } + for (v = 0; v < 8; v++) { + { + int i=v,d=v*2; + if (d == 0) + i=4; + for (n = 0; n < 8; n++){ + tmpn[n] = cost[i]; + i=(i+d)&31; + } + } + + for (m = 0; m < 8; m++) { + for (n = 0; n < 8; n++) { + base_img[u * 8 + v][m * 8 + n] = (tmpm[m] * tmpn[n])>>15; + } + } + } + } + return; +} + +void jpeg_idct(int *block, int *dest, int base_img[64][64]) +{ + int i, j ,k; + + for (i = 0; i < 64; i++) + dest[i] = 0; + + for (i = 0; i < 64; i++) { + k = block[i]; + if(k) { + for (j = 0; j < 64; j++) { + dest[j] += k * base_img[i][j]; + } + } + } + + for (i = 0; i < 64; i++) + dest[i] >>= 17; + return; +} + + +int jpeg_get_value(JPEG *jpeg,int size) +{ + int val = 0; + if (size) { + val = get_bits(jpeg,size); + if (val < 0) + val = 0x10000 | (0 - val); + else if (!(val & (1<<(size-1)))) + val -= (1 << size) - 1; + } + return val; +} + +int jpeg_decode_huff(JPEG *jpeg,int scan,int *block, UCHAR *zigzag_table) +{ + int size, len, val, run, index; + int *pQt = (int *)(jpeg->dqt[jpeg->scan_qt[scan]]); + + // DC + size = jpeg_huff_decode(jpeg,0,jpeg->scan_dc[scan]); + if(size < 0) + return 0; + val = jpeg_get_value(jpeg,size); + jpeg->mcu_preDC[scan] += val; + block[0] = jpeg->mcu_preDC[scan] * pQt[0]; + + //AC + index = 1; + while(index<64) + { + size = jpeg_huff_decode(jpeg,1,jpeg->scan_ac[scan]); + if(size < 0) + break; + // EOB + if(size == 0) + break; + + // RLE + run = (size>>4)&0xF; + size = size & 0x0F; + + val = jpeg_get_value(jpeg,size); + if(val>=0x10000) { + return val; + } + + // ZRL + while (run-- > 0) + block[ zigzag_table[index++] ] = 0; + + block[ zigzag_table[index] ] = val * pQt[index]; + index++; + } + while(index<64) + block[zigzag_table[index++]]=0; + return 0; +} + +void jpeg_mcu_bitblt(int *src, int *dest, int width, + int x0, int y0, int x1, int y1) +{ + int w, h; + int x, y, x2, y2; + w = x1 - x0; + h = y1 - y0; + dest += y0 * width + x0; + width -= w; + + for (y = 0; y < h; y++) { + y2 = (y * 8 / h) * 8; + for (x = 0; x < w; x++) + *dest++ = src[y2 + (x * 8 / w)]; + dest += width; + } +} + +int jpeg_decode_mcu(JPEG *jpeg, UCHAR *zigzag_table) +{ + int scan, val; + int unit, i, h, v; + int *p, hh, vv; + int block[64], dest[64]; + + // mcu_width x mcu_height + for (scan = 0; scan < jpeg->scan_count; scan++) { + hh = jpeg->scan_h[scan]; + vv = jpeg->scan_v[scan]; + for (v = 0; v < vv; v++) { + for (h = 0; h < hh; h++) { + // ƒuƒƒbƒN(8x8)‚̃fƒR[ƒh + val = jpeg_decode_huff(jpeg, scan, block, zigzag_table); + // if(val>=0x10000){ + // printf("marker found:%02x\n",val); + // } + + jpeg_idct(block, dest, jpeg->base_img); + + p = jpeg->mcu_buf + (scan << 10); + + jpeg_mcu_bitblt(dest, p, jpeg->mcu_width, + jpeg->mcu_width * h / hh, jpeg->mcu_height * v / vv, + jpeg->mcu_width * (h + 1) / hh, jpeg->mcu_height * (v + 1) / vv); + } + } + } +} + +// YCrCb=>RGB + +int jpeg_decode_yuv(JPEG *jpeg, int h, int v, unsigned char *rgb, int b_type) +{ + int x0, y0, x, y, x1, y1; + int *py; + int Y12, V; + int mw, mh, w; + int i; + + mw = jpeg->mcu_width; + mh = jpeg->mcu_height; + + x0 = h * jpeg->max_h * 8; + y0 = v * jpeg->max_v * 8; + + x1 = jpeg->width - x0; + if (x1 > mw) + x1 = mw; + y1 = jpeg->height - y0; + if (y1 > mh) + y1 = mh; + + py = jpeg->mcu_buf; + rgb += (y0 * jpeg->width_buf + x0) * (b_type & 0x7f); + w = (jpeg->width_buf - x1) * (b_type & 0x7f); + + for (y = 0; y < y1; y++) { + for (x = 0; x < x1; x++) { + int b, g, r; + Y12 = py[0] << 12; + // U = py[1024]; /* pu */ + V = py[2048]; /* pv */ + + /* blue */ + b = 128 + ((Y12 - V * 4 + py[1024] /* pu */ * 0x1C59) >> 12); + if (b & 0xffffff00) + b = (~b) >> 24; + + /* green */ + g = 128 + ((Y12 - V * 0x0B6C) >> 12); + if (g & 0xffffff00) + g = (~g) >> 24; + + /* red */ + r = 128 + ((Y12 + V * 0x166E) >> 12); + if (r & 0xffffff00) + r = (~r) >> 24; + if (b_type == 0x0004) { + rgb[0] = b; + rgb[1] = g; + rgb[2] = r; + py++; + rgb += 4; + } else if (b_type == 0x0002) { + r &= 0xff; + g &= 0xff; + b &= 0xff; + *(short *) rgb = PIXEL16(r >> 3, g >> 2, b >> 3); + rgb += 2; + } + } + py += mw - x1; + rgb += w; + } + return; +} + +#define INIT_ZTABLE(i, b0, b1, b2, b3) *(int *) &zigzag_table[i] = b0 | b1 << 8 | b2 << 16 | b3 << 24 + +void jpeg_decode(JPEG *jpeg, UCHAR *rgb, int b_type) +{ + int h_unit, v_unit; + int mcu_count, h, v; + int val; + unsigned char m; + + UCHAR zigzag_table[64]; + + INIT_ZTABLE( 0, 0, 1, 8, 16); INIT_ZTABLE( 4, 9, 2, 3, 10); + INIT_ZTABLE( 8, 17, 24, 32, 25); INIT_ZTABLE(12, 18, 11, 4, 5); + INIT_ZTABLE(16, 12, 19, 26, 33); INIT_ZTABLE(20, 40, 48, 41, 34); + INIT_ZTABLE(24, 27, 20, 13, 6); INIT_ZTABLE(28, 7, 14, 21, 28); + INIT_ZTABLE(32, 35, 42, 49, 56); INIT_ZTABLE(36, 57, 50, 43, 36); + INIT_ZTABLE(40, 29, 22, 15, 23); INIT_ZTABLE(44, 30, 37, 44, 51); + INIT_ZTABLE(48, 58, 59, 52, 45); INIT_ZTABLE(52, 38, 31, 39, 46); + INIT_ZTABLE(56, 53, 60, 61, 54); INIT_ZTABLE(60, 47, 55, 62, 63); + + jpeg_decode_init(jpeg); + + h_unit = (jpeg->width + jpeg->mcu_width - 1) / jpeg->mcu_width; + v_unit = (jpeg->height + jpeg->mcu_height - 1) / jpeg->mcu_height; + + mcu_count = 0; + for (v = 0; v < v_unit; v++) { + for (h = 0; h < h_unit; h++) { + mcu_count++; + jpeg_decode_mcu(jpeg, zigzag_table); + jpeg_decode_yuv(jpeg, h, v, rgb, b_type & 0x7fff); + if (jpeg->interval > 0 && mcu_count >= jpeg->interval) { + jpeg->bit_remain -= (jpeg->bit_remain & 7); + jpeg->bit_remain -= 8; + jpeg->mcu_preDC[0] = 0; + jpeg->mcu_preDC[1] = 0; + jpeg->mcu_preDC[2] = 0; + mcu_count = 0; + } + } + } + return; +} + diff --git a/30_day/gview/make.bat b/30_day/gview/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/30_day/gview/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/30_day/pictdata/fujisan.jpg b/30_day/pictdata/fujisan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2aa328825ff945a89a1a8b8e9128313ea7de0b6 GIT binary patch literal 15297 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 Tgz|2dIU63DE4D8!LvRc&<=LTv literal 0 HcmV?d00001 diff --git a/30_day/pictdata/fujisan_.jpg b/30_day/pictdata/fujisan_.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e041b105087d4861fa2d4055ecef13068623cce GIT binary patch literal 15978 zcma*OWk6JG)HXbnlpsdCRG)PJ#ARSU7h;$7gT{G0sT~ZR#-JMEG zx9|?0^PcBkhk{re9nsL04D$jGQ3-v4|2d-|vG|CJa-goH%IL?pz-B;>@z z#N>B^nEan95C8uxaN7cSh=;*}k&A`#6oB~<1M4Bi?K}V*Ky%v;paB3du`n<&0RJ7B z7yxW6oO`(F&d2DEyW_t;0NOPyY#ekKgam+rje&_CiGziQkBxba`4u>*|Bg#2T)<30ZunXND1#+0j3lzqx_8s3j>8(HRM&OTiEUV&bT?;!va69Wqq z8yg4fZXNW2UW$zOKHKS^nhZBW;H(w=;nI=%JVou^s{> z06D{z;WWxkUI)CkwBZ0n8rk8>3`MGkmA2Sqkf9`gKSH#@mf=p9^~Xn8Dl$p_)%{qa zGkI+R_rf!I!vU0k^*i~G{+|ratW^BB_ul{NMeG0C!vX);|3{+7|1&H2ZZ$<_TV}xR zP!SUv#nsP2GTGseG*Z~uM(8F6uPu%25H=bejTDCE41ajW9XuLIoNRO>3iHk`iSxez z6W+P-7xsVf{s$8FKO=FnEN#i8q^zjXK1x!{28{3mbpOhK^#3Kv@BKyjuO~5N@_^gn zZuBq9rh8qqTT$Pk`HRE(VVh?riYCFh+R0HXg_-u0p_cz#%~hGtmc{{kIlL31*;|)>z zHxWYbz$2{Q{k3JapwZpox|_mrN9ljW{zLCy`M5IRrR5j2i;6^9PdWYuA*+RxnI(n; za62}g9iDA<_8{pWm`VI$cr$>1C7RzE>A%_VuM?a!3cQvsTDJh=a=AWN`ovU%4;ZW7 z86RRK_Fkma7}M$0?)JQ4iWsi^9nqhmOqzZ0oV(JJxFuhF-&|tt<=~D@nFN#HaOJkn z)F8Dj?p(&=uef)+^*xQ_F=A@Xmn;)I^!IybW7a9CWk0JR;#C-~PNQ=Q|8emj4$!dg zDEiNbf84%f=U*l`?h@y&aTlonJM15J?)(l$-m#a3P5{NbG~iVvW(mc#VzPSLaywo* zg5Hx~PMU0`uJzEtE&!IZT* z(L9Wg-^Y6YLS`zvrE$4-ZT@{k=}6q+K=62Vo4E_~c@Mt9^&Bw30Dd7!ck?1GWM9~( z!oj5P8N8n|&OriR>L>cr>veA{GKQ7C96ty~T8zc*cMAxs3{hK&Vr5rk$_iH0&@eJX zJoazk4>!Ar-Mi-!=n{!R&zg~_H)1d`^ufUkF(Cbc^2;NT&Y9@wbxBQzFVUa1SYf+# zXF`%dVoZ@yukMJkM-Sy#7G^WFu;KLOW@e|JgE1rGPYuS#3VI_*Gpk;9x&`EF#|lB8 zHFi*?4U`}2D-kH{afYGwF_OG zG43juuZ}4jFwBb~PlK*d6ZOL%nPf+IrjNd08$qzy%F$Wb@=vAWd3qNjOde)* zbkM~M4?l|o=Dk8FJMuiqMQVkaaM6;8xb($?)-{Blg|b|3c?;o+n3si8DksHW@!Q`E zFzNtRZOFUW-VrP}Pv`?**jCx#1OD?kd!MUB})qbxK_AWfH}IGJx-`Y4-qs<8X&cnz;s$RFzk zE34_cl^4^oAAhyD*ZV^XD>x~PeW^XyhJm7^F0n4SZx^wiSL#RV#xrKEvH`d@Q~YDP zz(NminFwI%v=m)HN(y322L>y>nf9y-|x z*h&ds4Q1Ws`rW3V`~?~A5^p^Uru7%Zj*tzL%;L3W2$MJRleWTkFbb!Ur`68lHIk=| z*JU=5XD&}FIN?lht~#D$SDwlpq36CW@mFP;Jnn1u>5Jn%>X z8j>~I)!*ZSU1vhi?MdV8&#kW!!t=G251JpY0>wWUxnQ`lIbeI4^S@aQ?PWE%B3Us- zId887+$i1z=Uue7#~nOP)Dhn-PM7yV9I_gBSQy{WeeF+~Ax&7eg8%1*Ctm@K!a7nx zS$kcsGE3Yl-;Vbicn`9xcOp^R+*5C_QLvS7Q`pVQ`CS26MHb0SqMnQM zC-$%>-m0)L@5up2&c3})NHIv7%o2zBk>2y5O_hX@kYCWTn(|TtuDAV$-4?$B)~RcJ zNtPeKM=imkbK(oitKU7^W&UtZ?$w>RmSC~q0#p96%Eq@L8=NV_YYO9al*}--T=ToH zlEmW2mMH^x%qT;N5kjs=i9^ovrPt&mS_Q^@d?x)&!7NjrIoibUc4$+c+27kn6f2P2 zgyX&(NdyP+GjetgQgUg*vX>7#Xyb92qdWZNn4@5dU;_dI3rkYS!}2N|S^Ubcr1D7W zv9`W$IA&#T@Pc{6HHn0KCqYp%4QUz+W)*`6*8cn(32tjGhxR?wAD7*-@kHUDdtrqU z2IC>(;=kjqY*WoxB00(5L5Obwd_gDB;w~%9ue;=W9P75%9XfeCi$)*VN!c|*{Xf2! zhBje)EA|x@K{8o7XeF1oZULqrpo!V~Ib+zMWLRZU8`VMAKva6gi%^syhI@HWCs%^A zzufncC!Q!00xvwk4Ow{JZ}myk)i+n54b-2rNY6oHn7aqbH1lfnGMI^NU}PX6rgB`I zW1^R|D!g0rFt+_ehS(<)!^y6LkKY3V8s|y-aXOeL#~x?dLcet_f<+_Q<72tx1-(Zb zxTQ&9NJiF=T|CM^$XM<6zV)*!U!S<7{U$E{2HfdJ=^P%2 znEKJ~;D*Uq0!TA3mgH%!S+Pz(HCe^YQfR_YimIdti+~|&KP&QY0T+Y3-@Io6a&q`K zqdY)BC_a6YlIUps+2Bh%^#b=d&z{6z9A7Itq4w&8q<)P3o%8zEaCg*wo zj4HWMzn8`=+elLtE`suDfI=T=D2|ubcN1KC1A)p3yvN_tt8yhdbTty*_)EJg<5D3m zJVI72HY^(I0#yxucTL9(TJz}mlsxzo5e9oKkk%li3IsP4MG3makNRW^1=^iv2_?^}A7lgRwAMY4==I-7 z`oO2_6`MDjt>v1^C`hTRf?+4a+B>?jo^LpzOe^j(1IyiL%5J{4Q7kFjQ7?q4x7YX) z`(p4Y)hJnO6tEyN%Iov_qI{t<4hdH>j{ed_E*W*(B@B2NrL9lQ%;S8=Q*5P+s#oGT zrVXGJF~xxB2p==8v^Pf|n#HKDC`%4aM2L<)&5XKuhICY>pu{!YDUVb3wu+4F%QAHI zyL&-W_fzZabbY7f)HVlLBJ1??`8MC>aaazHZDz!g1Lc*KQly|lVvVeYPnus9r!~JO zvqhM2gB)#4q`y3EO8OJ$E$GYl7)W_M|7Jp*CA$o03obz{`wY5?xy*zf>kc)dfDrvp zsf(!u=E_wfId4%0k;;WIlFHcvirOL$b(qJul-M1~p{+*+qd6x?HfSe=P16W*gV&)} z+&%%X+TKXt{39p!Lri%TQO5i(-7B^_n_ByJcr!)pPzw9U(PkQmK#-fJ*EA!55kS>> zsAI|V_91qpwsxdfQnYi~m-aWG+B<)pb!H+Q8tDu%eIFBSD<_(8SmCdF1dqW4NqzBH z)y3d94$(4S+jCqf>D}5MsJ?-Q5pcJwN4HmIC)El?_YrWWO5@_b;4`RtKlPeU5aaRl zPqdGi+!r(_Y(OIn>_+(t909;oxr6m2HAh<|N%H6oXf?xij>Q`ntEznWM+&HHEK>g&p`iI< zG77@<@p<@@+-jC899S}smT)}n8t$_f-3^D`{esI4a3pK`X)2?rg*ZMfkxXilFkL}l z$T#_)WjM@%Y~malB{pZWEDrd81lU#XM^xeLCilH};bn@w;<1P~iHTzYjjo-(0WQ&Gjf{~k5|k&XK@ApD-{ydAfjKLEDcV0 z($fsWiz|y(%yf8)>H7T6FVYHRrwDQg z<{q!^k_kO>zVtoymYN*xzg?xYou|YP3?w7(S{^%OH_PV%ky=yMEk%2&|Gt{N^esuRT=gtl| zC-n6?W@@0iwhT}Brgtxkw|5ynBsL=ztE>sWJ2J}1u;bHp5lluHc=Y7ETH9`xUE0?A z;9M`-Ig7MH_VD?ps>b|C;Uwf~-UAf5^ouE1#ftiETQ&e7F{g2zoq_R=QHki0q5!)_ zeb-83Ppyl-(w8dMs-%9%ql!P9;*JZCnQj5wU@hAj-JRSQ`urjp*va@RU6F}&R>}~r zF5Z|u0?2{<`prd>wawFxvC1VRyr9vIu~l3m$GH3CbmcnuQP?`o<_=zwjUIM@NdqO4 zxpw_#Z0D4~xg94tPSI7f96?H%v%ZCmSc0$rK<_gx{vEL*&%F-R$ab85e8G4@Ro?TC zVA@dr+-n)VKU`i>C-fDe%J1rnp1&_qQ0bQoPhbZ1V#4qaB}Uc9V6a;Ns|IeEuAoBG zJhwxITE;jiRVG(n*Q>~h6eIVhJ9xM_oTx_Q+Qib?4T^G}=A|jU%aG_ptS*xj?F#F87 zi$m|V5UbtJ@%t*n=B;Nlp9{t#XO{rCBTdW>V3gV~2|+QJ54pqL>seDgpP=UJbTl&K zhJ9vPk6KAhqc_=1y_J75bsLxoKb;xvP^4ejGVlH=v`P@pR;_P<LSo) zdaw>sm$iyMd2YM?!d)4gsNIgmo~8wTVi2_l2s~`;Uv#~m*z>|)#L=u&{* z<^gBYy#7au?UXk`W0QxReS~3>J^{^F&d{&P%iO8Fz@bVz#?K$WmO}- zKSs^ZhfP8`|GsrTtc|2_Oo^G*bqbZdbJ&Z&lan@U2CexmfE|#*@JN&-jvcJkJ5aSQ z^lh|8ZMwm20o?6*U^iL*3EATna_RG?K9=Mn7q7#h>CNmJbwY0)|F$9!v8a=$Va%tc zUEWIw&?Etz!ja-$&Er`Pl*xM&ld{2@n)hVnLA_2rB?V13WS+4hU`+>AN4xTVjp|t2 zN_f8ZPV71q1r>`(d(n`Qs{{+giPas62_z5dqhC2PK`7RV?Hthg8pINaHA=YA$>=NZ z{B|1qMN|(@`zopXy@8GLhEC&;&JVfwH7^m=dLdi-*!3i3wXDp!eaQ2{w|2afBmC^{ zbkDePxe1$##~v;t~SqOO!&5x^W9zB2Qt9AwG& zQcZfZqClmRG;ju1Dn-|m2wJ;x;^h1GO^d!s$1DjN1=dALX#^SfWgq@FC%B2Qay-^` zEXW^ahO@(~n4*PJ;?od21|R53YKW*t6Hw;wbUS}u2De(rTieRw=l4#tgmo#I>AoFM z;!hQ8nkQ3JmSTKOZUZ)~B(rDhclz42oLBe+_?Up5fsGB!C-5{rj@T~VaGPa*P}VtM zUiXoirJdIMm*$P-;;-IvohjPe?CCPjvlq8ptB`_6L5=dnFBTK|M=yQH2WTQ4H@jYj z3~#nsZq`tB3%eE%t0@?y3g{+d=6_>zVTY>a<)y%zxdihevIK_Anfc?^#{rv#6l@cC zU?~C^KJEAkNr|m!^;2iN-_#+b6a^#1S<(K{#)9w|Q9l%SZlst~Qn)UkCqiAG@{Q~( zW*~PpGr}7_;Ft`}I+`qq&X+3~R08a_q2AZ;r$m)v0c-5(=i`t0d=s@(CEn}ECT#J2 za$PAD?q*-RnM<1I$+^rQ$rqTl)cun8z!?6nr;1&0b#M$$&S$blj;@f~f-C-ntX!F9 zS5%BPWllVHq=QrWo;IIQc|(6jan$4H0t9i~kzfw3p5|3wi%kXkip9!=rHTg}d-x>g&rb#LYCqgKM8PB86etXK`|h6&VF2z(~s_&5Zj z@OeWqm3*bjEK>MJ$-{MUDozinxQG{s`a6Nj7Uf-G-{}I)3tk zkeTf7V%HNN*px?qrW#J)Y!?*FR=Qbj)h-BeDVHLJ-9WuPl?5y@%hjbN`9}F>8gXnp z!V9z0ohUs`HmN=wC-3JzF`Uwxp=AAsz4E*BO*76jl`fo3ouyMj7)<@6%7Zrtu%Etr z=^Nfv`i;oe`wi+%MwP#HhvJoow!HcJDvt}oIr%mzj{fzV2S2z$YKAY2{(+%(5(>TIi|N7tH2|-FM9U2lx zGuDLYH?hIF&1$H9#~N{ySs-0 z;+xbrS;K&;XEY`Ct`wARE=8WjwpfXzRg`V_Pilqh`gy{M+CFZ`q}vE>L3Wb#L8by$#8VY^|T0i`;nwzj+j9X_i+&8?*mta{%{Y?f` zyoF-Rq+-)5$5(utoTzzWnpUDXCt_P~Bd;R!3-)oCoq#yAFDgm843=Oq(aUZveO*eH6a&1kyH$xYYDeYz^OFv_6gnddhtALU=?#kDqOnyrd*bkv$?tnEbeR zAqQ{a=p-+B3H;7EZM+nU>7^L^8u$&>lj6W zExvnk)icNt!Qk;NXWh8XJYDr$fGP!lhs7Wi-u=_?#HswlUPw>n3|OXet3@6=lMy&5 zsF%LiHPax*-qf!INZNUn5>n0N+3Y};EhCoOaHc?kQdX5JLrt}^cd*Z)(r4c652$@A z@>$fRLtd(G&HBUj9DY6_wwlmRmHt(sR6nlMF~>&gaG=bhjY?0lPj51ttDN!VOR#cw z<*Luu=0kv)8OU>)f#BX`3DLo~yWpd=l7#rxz`=1Z10IKkFeXrFp~Z@IJU=HGP)bF1 zn8tPs$S1zy9z*SIN^@1WqtNTl6Hu(%^5E&%+sqwZTUjK&T232Mvq84|zA`_%>AHyJ zuoW*qk?;wA8H9?Bg4INJPWeFX7NDe_t7Vte0BS6rUbchj^oK&`Au6` ztaS`ZIDo8gZ~w)M$gvvPI6d=s{yINk5KR$}^8NU{J>d@{F`vrM#TOSkJu|=Is3c@5 zY{pBF4T{zAuYL1PKwtkfY{lw_HRMYVejsS2j`GZUW9qy{2XmE+_CPsvu?9Iv({O2G zAo_8n3h!uLWUIUZ#S2cWvQujiJk1eORaDT1k@PS>@w@LJ?Hl{Jf7g26NexO7_b7#0 z4Q`UHbUi#U>PEb+Xf@>a1jMEB%Czdq4#J~ITC@g~zW|H2wZnXeElj(6s=i{8H?+y8 zUuj*Ww^Cim;KaN;kWA_*UDu@3TRgA%@s+M;k_&raShrIH_jK0aO)^VWUY)G6!D97I zo{#;UJ`s|wi0n*jl)Hy(GpBy0^_$?hE$#eSqz&NA2^q;lnpyyY&aAMyzqzol=MmS z3fb(XCNEr^*VNR^RWz1KSxK*mtP)DFDk|7=u%5z%PR4^I_ z$$8id1>SlGW6!CN8z9tf!m_P%>~z^R^vJXNHB4WhjCwqU2q=;~yakZaFaLq(81CxV zu~XOtzSY;ILV{GFLm9G~Iq_N=c*@7F;PW*3>G7>A-4dmSH*u3L>>c>6a+hmxmeQ2w z324smXO-8FqKg-}uAf;XqNL_E19IAu1;k{qHr{gnvSS=IX)5<1lU%1iI_lrsBcDQW zs1yllDt%s27Jrk-+I!eTT|^fNLmK36;ou0%69BMt^CIKqkCg4^L2!MECv{hm=s)Ht zXg0Fa5qcIqf*~eVJM6lluF#rZVnc4;nw(u~B#_^lFO`{*5?fOlWFtZjI$lpQv#w&V zWXses$_k{fOnZ^AplPKK%^HOjcT;MT!^q=2;#F=geBRnk)K$ou*gQU3D=%an@X9r+=^E2BM4R)hRC8MreF)a$M4WF;@- zUk2n>vsbPWC>&=5PT|p9v003JzKv*)dai4MfBlvmXLS*T7?=ElQ%T5k8GY}Q)Grfm zkm_1UDrB5BLAjB zV8eyNwaN{gk&z5yQ=H&&!STdBVr6G_psyI8bST)Bn`AiNVKb#*bJUHEhQ`L+*l(?U z-Funp*nE6+3wY}Zyn1UmcRRMR7C--|)7BuXI1(}x$KJh7TG%ugAzDGcCGVgwkNf>y zVzU9v`*4JYy!m6R#QEUMd3_~oi5`B%?jndv5r};*kTk;=X0EB5CBLMc^ZoFnVr`1L zno9_`pEAZ}fOR!IloaaZ?e7ulQ$gtAkx>21e>{SK=^#wIM2Gj(yM=WITY69%Pc|rELM-;;tE8qN=7aVwZ)b8Hf@d3M?_uJ$e>SY)+$5EmGUC`m5tqMs zk9oHQBJs&QHOkcq9o{~x*y1sG(lPMi#fAy0_a9w7N?^ep<~_4dpk)Q27fV ze%cPj(bn3y0^J*IPTxmo4PE0efH7GB!ANKSp&0!i`&OEV`z)WIjAyIr6pWdFs_YPR zB44YMs&_P*9zC@%C=aFhqSD*);&EnqsX~cwSZ|WguiSIW?I7TJTr6^YQ$>8$xW3d; zGwJ(=Jvq2H$#`3&Ly!fUN zXsJB2KA@;_kGN_=b?OopX2vRr`OdsQ_;G|Mze8>4Wni5Ge*;&})4YqV2P)E`?Y0DznDa!op` zz#1#*UCoRWb>*jviHuB%aS8QiyUXIuQzZ`kt2&0^$-i8nrUb>CmY>oxAS;>mXSAqO zvsu1-9i~bKN6o7ko;X&OmmhG9c^AS8Bt<)}dtl;LI&M?RYT9z_v`^rx{Wa4`7v4YG zl+=1{a%*k@*)&^9poc4azY~VJXGweF2^`eeS-;pKZQ|h!EUl?tnAb4z;UnL|TL9{) ze^Nic2n-`9X$E~U@*$%kM+D)6&HzUf8;Is?(E>$rq5Y+TxLNc|D~_BlO12shT<$@V z(}#)bd9%vRaAQL0k2rIrIYJK-dO7o^Vz8deAI~!!bnW~J)_1|N2I~&UL&?h}?aXLN zBr1dikXE_rgvV8v%CFw$Z+A-Mn>6f|QGv#jV!YPYsyJ+;V2yFCYe^a|aSTY1n~JI^ z{RXu8O;=tN)%*RZJb@#nf`Vj3-raSc_2Qopi8w}$H2Er195wMan|5P;PCxF6#f zSPa2+D2uUM9{74~+0h&7`~G%(?p(_1Lhm59jw>tt8S(6mYCxpVkg(s5q3@$e9)6nZ*KWWu)f@(*UN2J& zaRQI{4-J@J;-obCb&?O~5>#bdnI>d#-u}o;_|#W!w9~%7AizvIuyDSokeA6Qyi^$e zh2ew9EuhUZlrLY!1pz!WahFt8q0PYKc8XA0IG^Nxnlp)0#nr(N#i4-eksvkQV$Q}#dwKu7HcK(w1_O1i15OoZGzsxsWatp?h9^q_KK zu1keO-?nTq#8u@&^V3n5$_SBpa$cx7Qm5*RQaf2+vg+lZU?jM@nXFMa#rjP#P)@DN z8l>T>k?*3T5y%_~5RF1jTJv6>l+@@t6y|b#J$IT6i4BP}y_vV=o()+}hQDgJI3-1a^-poY(dJK4ZXqx6b`ZJ}7 zT{x61uRJ4K6^Bik2NvU~On~`^iy0(%s9JnYbNzf;FoVd-^vSO zO^aIzQ#)l%-KBH`Ij;*tVc*260gfVZg1w1yJ-I(qZ&pk8*me?BQiaJ1VTvHVsEkKH z8c0`rua3ClmGbjtpo!goPgaCVwhX|iQVN@=JR(qfrC1ntU z&?=BqP}QNz@b4*l$qeQ$&0K?XOLKCn0Xh4;oOl8=8-w$Y z`t4^Zg=520l1Ajq**9CK|fQCF4_N^xy{1y8UtHVZ_oWcH2512|6D z{Ltpd?ZnX&M|lW9;Boq!KpqHos$T#I1R|s&UJPnelg-FWoxAtYd%0T0 z!iRK}(KW-3!N3gLq=#3iF{t&rm7xs#CIlHz6Ic0s(P{AoBL|?>6av& z6p4CY@oR+4Bu1*#Zb<-dbk~o1y5_#?~rc2;x`@{F%jSj$v z@SXeDO041$LK6pC!mcrK=Cb7%CRb$5WH`cRKpA77{R2Pkz6fC7N4pDm${8)8z!%N= zVJR% zy+Rp&BK`YXZCitcBmq-soLsa!dJknh^*ud*JVB@1*f#?;oB843*I zL)ibi9+?IKn@2$z6MO=k)4)W-2EHwI*&Y`MGLH81ki#2f$cbl&1DhJT9bjL4k8JeU zEx^Xv`$5B&J#a{0wu-EjUfyR>I5&dd#NB`BUcQi!@+y5`JWY8J?#tRUo2wl3oo7ae zKc-p>>o9jh@~%>Ra^)$wU;l{~L|bi4F+_fjp1Zs<-$&=CY);m-R8%oaAH)?&p8nWr zD8$1v9wnw(p)gaKq*q=Up!2G_tJCc!M7#Q4edQSkC?rZ zCj&R>#5y{z@kE=VTPzA2<3J1_5uP)ugnShh`~zZTM6St1OPnB+Rcc}su@dy<4JV{^zxT1$sf6KDo?H4^{Yb+(~7A3cAH<?GABa9|v`>e*p=)Lv&& z`0s4`Zp4jbMk$G)yw4#B(`Pyy%YALgcQ;e})pEfQ9%RLp=KTpNrj~-c!yN8(wj$)d z^qalG-=D_WnfGrjo?-p~%0=G9tkD1&V>SW%Gmli``XbTyH5?@qfQYnKZhS&bA@0b? zt^hbuXcSxH?C@mh>>% z(V9Zjdk}ecjFu(iWGsM}z>IlZE_sj(pi?GH@)-TSF-F0JJ-t_;eT%~s*7bq;<8UWn#cz44BSMV@mkUQI>_YFx6kXx_Bv*bMtSvN9|<^QTi3J7e^kwpIEM0MC|oGx zhuGzt`PV!+Z{&@jO5>vcKIzU-xVc)}!H@uNqsT5BD%>n3$q>BXe3$@%#)h0p>?i8U z>td3Xiuj9)>!^pfsrQUcA%@^^9MWe(?h>1y9G^isa4Fb(KLpgAy_!Y9{MhuNHW=b8 zu<}wo7gDmGuF(;j&Ygwd(Cfm!X-9c3$TVVGTXxpVR7Jy1Y6c&uM`6pKw<7vu#rWxA zZ1V$cc6M{7?_pMX??^qG*Ruh?PW$5RRLmUx+}~fDd7cFSK*}V4jBk*Jg}4xw+D6=D z&IYU%0hyx&6Jlb86=um@0`v8r5!2iPbjaalT|xML(D<0tuUE)|LOqQ3=rS@Q)xK#f z2q3y{1vlU=?|Hd8%|R$DP7Tuqq8r4%?*SOWf1g47r1~J{RYLE^%EJC3MCEp9UyC7U z7R*cvf8oE})g#x2!EO;>G+G6!CBZ0UW_Bm>@)>ykEe@Os#l)}f;F)#YlRL`=fn{xA zW%Ax}-}gzi_2`WB8Eyg0qc9w+f@(r-$bJ2w7FK#4j$g@`c6rP^5Ewpzm)tk2TY!lw zq9&U_A5sv%?aWi zf^^r#Nh(e1(I};!k`Ose@xHnjlEdNHJT5`;@$2v_!0xZzu%Z~x?iNq7gJ;uLOR@W$ zn;VIRQC7u$Bjr*AD?m69PeN6Pl->@@b_2gGL;#!A(DkfMV@cvrz|ShdXxc_GgiZM= zUe{vfGn4mJJNE`bCj>EKQWodC{9q`gFdlaVD)}lUBwhz2`0QLZ9(#Sc)!=7h^H=_s zcgmryAkezK+_e!+GN~++!_q<|9tVzXEpAY!#uf?wX>9Y)WopWDea7^zKP4NVKRU=T z00=95J~W0*nF_queh^~jqOG}9Y9#3H{ytvzJ7c>Y?(*{%9A?(H^~R+5B1aBiG8L4w zq%8bb;SHoZ28~A8fbvdY%6EJvqW1I1AoPCgi-BW`WnW<2Ti1?KPs6TRZ{(6P_Ja+y z$4m6Ts6Qs?k(x_jT4o39mJ>isu-kec(4n9AMMpjz;H=J(wK7(({(k<%b@q{wz=_o$ z1f;OPpFFOsj+k)w@4v24Vh8LrT@gNMbPdvopNb(RvX+ZP^{cAl&bcNrFz4m^ffh&1 zx}C|5_0JF{Sb6Es&K>*5J!4?xZbpV*+~x71j`&mOR~cX>4tYEdii^tll8mglnNWhc zC-7YifvHD*Yl2f>t!47SCAfHx%g(%vt@^c!816Co{-EGpV5_t^3mZaz@9juWw6s0;%Xpaim$1>$(NZIJvf#zk^QY9W3u*z9Ney-Q>CjJo<{zMDQ=0)_c2({LobG zQK%mL9v1F=Z`q8XFPE7OTNmF*uC!$Su(eqU6P_Bk5-9LEi36o${yC$+Nb`}_5T6Ev9k%E#b&zBbp` z_^HA>rVsD%uK_7GU)pQhJsWq<03pu8)=!3t&FE-fHb4G8UVzk3A_N-zSgwiut!P*f zk(@@4LHGh2$Nn0fE&T+gLfAWQ0ag``5yqRV*e6oV5$L=7?8GX!=_C8){iI9<*mLnF z`jq^bkJt~wM!rcYTo>#|=PnVATJHmsEwJX9v8|(nPXOqPNi6Sg^ksi|{}e2I$#xip z#pBSSoxb3o60<~af$81OOJP3iQAYphG!wSK8A_L3voxCU(aE@ouK*F3_WHA2$E*7~ z^dRv$D;3yIc`2p<2Hk3J!dBN$^?rS>EaB!WSE`DugTtd``19Q#Q-WUl$sNs}L?Rs8 zNS2hCJ{so(W3khDq^?pT=}0{MeLVtCJCZR7PY{dc{ZuV!1nm#<Ttd5QcG))HGT=l>hr==kVTP~MbCbbKUf^m9T!m4 ze_Km=~ODJFtMr-?&z(;l=AOGCeVpY9A+yr`Lur6h{Uq6`_! z^2~UDcHZZ?q>YH6rC&0yY+i^?NZ(pc=^vD%Td347d4wYL~hl)LF7H=la_V)gXBrErRq*n{O7ZaNXOuwI4yCzRG~A{lnY ztc$#=tpqyr2KZ;e(6rpLUwYg@{3L~2&T;AeH6;y?skMGM8v>yUW@Q+E=$tO&!+T^Q z&eeMo>&t(9qPu6!6X|MHn(xi7KEw&B!mt$b!vi3>U(~#rnhgECxZ?JL!efB5-E=r2 z!JskuKK$any%!4dhWA{XatfJRh!z=_0 zS$eL5HGL3={w`ABUh3|HxwM_5U&r7rfoz@4n*#GU*a@N8%t#Z&bSUynt2y#d86)7C zh{Vxvg2`W_XBMqHTjn%H%rSD$z$MdapN*wJ+g9(p(&D#@m$-+QY9>&0!I ztMQ8$787~KZjX5_5TvEB7r!#SCMdG9I3MLw?dla&k{Hy_1mr^M6(|M-dc33)f2yt& zPHtl(-gc;Ov~Lcwa)Vvp6uR%b)4aU}ba!!m-SiTEGbOO6D7*cmpd|L$5Zj@7Rt!Z) zjT!$Uo|x_rpLiiUGv+-!&R8zu1V1-);LocGx*`RVgv-s=&c&y_e8#fBx6I>HYEGLM zvzxpW=u2IfL0UTREbSro2GKA3tlx~RPnIomy-WUi>Q!Fvm75>hv@>{}*4Jk*c7JIQ z_^x8P>|Ef+Nm3@5QO|t#Ad!_W>70M>`tfOy>}z4KXY>!&u3n)3;j2%xtWN1XcDdZc z#}bPt0a_Q8E5GDM+EFs{gvI;lT!QtAg!jDun?Qfl8;@i*O>IY1%w7(XTR{l{eqP?g zG})<#GNm*=7c!nHd) e=-BN_VgV>&Qn=rjOq2FzFOn@*MxZLU)Bgvnqxrc2 literal 0 HcmV?d00001 diff --git a/30_day/pictdata/night.bmp b/30_day/pictdata/night.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2e0f1cf43c0b6936739b291db8873dd159165508 GIT binary patch literal 666 zcmV;L0%iS)|Ns910000_Q$bTpLrqYC?G?T`03><*6@^MDAAXuDtFQ*4Gt2PtPbK!l zRI1=nHt*~|j|hs6Vf32boY&;>3k(BK-+O_cj2AP;hgNO^MBqd;RU-xqYc^j*&CWj; zowj-lni8+2-n-f3KXzJe#*4<$##|O*FS%|@;KrYu1>_SvM)Y!OMT5#yyaD^2Cj0C! zA*b1&A791EANIG<0(AZYGLKLZ_Eczr^%C<^iX{-NDN&!^-E(zc85e8#_u!VUGGmV6 z5kYngjJXh|V~3ZbF$z93wHZuRA|Ix>O`*;6hdT?hSW8a8-dXvma@Men(avlQn)%-U zA9MUn56nop2ia-)B(jZ|pY*l zh%wxPvjv0m_vgc~bh?v#_bh}2Nw^@Mw;t;2MuqQha=DRFp%QN0Yk_Lyl~}a~%N860 z?I#I&2kBhj1gD??H_=%MIYgP?6CScM*UtbFUKE4*Bn@X&eE9;fsv{U*^mR3R|mLXGN%gGjj1%ah~*Ae5ZwW1$CyVtK2CkutsONG4x*5 zL4RcfRMmeiBxiNqrH<&_;JvH}On3Pj&pSV!u)}?++VQ1N^zMMRb-XgoRAP`H425feEDM?|WI5-^KG$)!v+%9j2nra$o32CD-aun+;CUoPic(Q(8I6Gx z#$BSw_ffxH>2KekzAkJ}c>aaY-}&>$@&%sQKWSO$Q`_^h;BR?;mIhC__&hJKudhhF z^WXCRP98q^M1CcKk9B6|w@ls5|q=lx-m5(HC2)Fr`8xy(JEK87Ftj{P;8#DhPu&XURz&KL3xyvWk9;_1|F2`JAP(`F7P$Ef? zp97Rr%Ah0EVfWXix>XX1fRM3ID;9?j;ocQs5z}~RXBCv6nc>1v zQ+P)uP-No>x&jfMdBn~pd4I!J1)yK~{UiGszXoWtZg2jC6GaZXR^ zo~{$sfr0HCE8Z?Y`TB`8aSRlMbq9q=BbVwjE1emXOW~00}*}dz9RoFPn@%~AI zpPK=6q?M`knoo%H4mEencL}XG<)Pcyr@TSVL0o#C)|k`L1bkP0}T_K1G+Q3lh6&kBkQIg<#hwQ18Ac2i)WsH z3GdOF?++B+!_2!>=WWyZ8U=j#bs?Q@g>NJNC6LlNc~1R^58oHy-69p&H-Pnbjs(ii z0`mBU=Rm{0p z=J)WN4X7R2t~wUpvsz-kXt%1>m@;-EK32w2UVfaKiW2{k`8GvAcGeAyF7XcxPyc&7 kg46KlNzF&VKQjFAr^&=DKJYaOt39;#eg6>_{e6S~0d7O!!~g&Q literal 0 HcmV?d00001