source: rtems/c/src/lib/libbsp/arm/nds/tools/ndstool/source/logo.cpp @ 311dfa6

4.104.114.95
Last change on this file since 311dfa6 was 311dfa6, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/08 at 18:37:33

2008-04-16 Matthieu Bucchianeri <mbucchia@…>

  • ChangeLog?, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*
2costs per 4 pixels: (# = black)
3
41 bit:
5----
6
74 bits:
8#---
9##--
10--##
11####
12   
135 bits:
14---#
15#-##
16-###
17-#--
18--#-
19   
206 bits:
21#-#-
22-##-
23###-
24#--#
25-#-#
26##-#
27*/
28
29#include <stdio.h>
30
31void LogoPackBits(unsigned char *srcp, unsigned char *destp)
32{
33        unsigned int destbit = 0;
34        unsigned int destvalue = 0;
35        unsigned int d = 0;
36        for (unsigned int s=0; s<1664; s++)
37        {
38                if (srcp[s]) destvalue |= 1<<destbit;
39                if (++destbit == 8)
40                {
41                        destp[d++] = destvalue;
42                        destbit = 0;
43                        destvalue = 0;
44                }
45        }
46}
47
48struct LogoPattern
49{
50        unsigned int value;
51        unsigned int bits;
52} logoPatterns[16] =
53{
54        {0x01, 1},      {0x06, 4},      {0x0A, 5},      {0x04, 4},
55        {0x02, 5},      {0x1E, 6},      {0x16, 6},      {0x06, 6},
56        {0x06, 5},      {0x1F, 6},      {0x17, 6},      {0x07, 6},
57        {0x02, 4},      {0x0E, 5},      {0x07, 5},      {0x00, 4},
58};
59
60int LogoCompress(unsigned char *src, unsigned char *dst)
61{
62        unsigned int data_out = 0;
63        unsigned int outbit = 31;
64        unsigned int outbitcnt = 0;
65       
66        for (int i=0; i<212; i++)
67        {
68                unsigned int data = *src++;
69                for (int j=0; j<8; j+=4)
70                {
71                        LogoPattern &lh = logoPatterns[data >> j & 0xF];
72                        outbitcnt += lh.bits;
73                        for (int b=lh.bits-1; b>=0; b--)
74                        {
75                                data_out |= (lh.value >> b & 1) << outbit;
76                                if (outbit == 0)
77                                {
78                                        if (outbitcnt <= 156*8)
79                                        {
80                                                *dst++ = data_out >> 0;
81                                                *dst++ = data_out >> 8;
82                                                *dst++ = data_out >> 16;
83                                                *dst++ = data_out >> 24;
84                                        }
85                                        outbit = 31;
86                                        data_out = 0;
87                                }
88                                else
89                                {
90                                        outbit--;
91                                }
92                        }
93                }
94        }
95
96        if (outbit != 31)
97        {
98                if (outbitcnt <= 156*8)
99                {
100                        *dst++ = data_out >> 0;
101                        *dst++ = data_out >> 8;
102                        *dst++ = data_out >> 16;
103                        *dst++ = data_out >> 24;
104                }
105        }
106
107        return 156*8 - outbitcnt;
108};
109
110void LogoDiff(unsigned char *srcp, unsigned char *dstp)
111{
112        unsigned int *intp_dst = (unsigned int *)dstp;
113        *intp_dst++ = 0xD0 << 8 | 0x80 | 2;     // header
114
115        unsigned short *shortp_dst = (unsigned short *)intp_dst;
116        unsigned short *shortp_src = (unsigned short *)srcp;
117        unsigned short prev = 0;
118    for (unsigned int i=0; i<0xD0; i+=2)
119    {
120        *shortp_dst++ = *shortp_src - prev;
121        prev = *shortp_src++;
122    }
123}
124
125int LogoConvert(unsigned char *srcp, unsigned char *dstp, unsigned char white)
126{
127        // convert to tiles
128        unsigned char tiles[1664];
129        for (int ty=0; ty<2; ty++)
130        {
131                for (int y=0; y<8; y++)
132                {
133                        for (int tx=0; tx<13; tx++)
134                        {
135                                for (int x=0; x<8; x++)
136                                {
137                                        tiles[(ty*13 + tx)*64 + y*8 + x] = (*srcp++ == white) ? 0 : 1;
138                                }
139                        }
140                }
141        }
142
143        // bitpack
144        unsigned char bitpacked[1664/8];
145        LogoPackBits(tiles, bitpacked);
146
147        // diff
148        unsigned char diffed[4 + 1664/8];
149        LogoDiff(bitpacked, diffed);
150
151        // compress
152        int r = LogoCompress(diffed, dstp);
153        if (r < 0)
154        {
155                fprintf(stderr, "Compressed logo is %u bit(s) too big. Please simplify.\n", -r);
156                return -1;
157        }
158       
159        return 0;
160}
Note: See TracBrowser for help on using the repository browser.