Update to bsnes v034r03 release.

New WIP, with _major_ changes to internal header detection.

This should get everything working, if we're lucky. It does get
Batman: RotJ working for the first time, as well as all the fan
translations.

I'm releasing it publicly, as I need all the help I can get with this
one. Windows binary with ZIP+JMA support included along with source
for the penguins.

    byuu.org/temp/bsnes_v034_wip03.zip


Do note that I left the console enabled in the binary. It's not a
release-grade version, anyway. But the main reason was to print the
scoring information. If any games fail, I'd like that information
posted. Might be good to note really close passes, as well, so we can
keep an eye on them for future changes. Right now, I'm only aware of
SFA2 that gets really really close.

Basically, it prints the address it tests for a header at, the score
it ended up getting, and the reset vector's first opcode. If the
values are equal, it defaults to LoROM, then HiROM, then ExHiROM. If
the reset vector is invalid, or the ROM is too small to contain a
header at a certain offset, you won't see any output for that line!
That means a lot of times, you'll only see one line output, and
sometimes you'll see two or three. No worries, just assume missing
means total fail. It only prints output for "possible" header
locations.

If you do test, you don't have to play in-game or anything. The second
you see any visible output whatsoever, that's good enough.

Many thanks to everyone who tests in advance :D

----------

Hunter and tukuyomi, thank you for the kind words and localizations :)

I really hate that table on the download page, and I need to go
through and get names out of all of the locales, but I'd like to get
an "Author:" field in that table on the download page. Sorry it's not
there just yet.

----------

Fes, thanks for the feedback.

> Apparently it has a limit of 65535 bytes for string literals.


I don't have a workaround for that. For whatever reason, ISO didn't
add an "incbin"-style command, and I need a platform-agnostic way of
encoding binary data.

Not for v035, but maybe a while after that, I'll use a more advanced
compressor to get the controller below 64kb of string data. Maybe I
can rig my order-0 arithmetic coder onto the end of LZSS for a quick
and dirty size cut. The reason I don't use 0xnn, 0xnn, is because that
takes 5 bytes of source to encode one byte of input, whereas base-64
strings only take ~1.25 bytes. I didn't want those files to slow down
compilation much.

> # Next, in dictionary.hpp, the first for loop uses 'i' as its
> counter, then declares 'i' again inside the loop body for additional
> work.


Oops, sorry. Didn't get a warning on GCC, so I overlooked it. This is
now fixed.

> # Cartridge::get_base_filename and Cartridge::apply_patch both claim
> to return a value, but don't seem to do so.


First should return the filename, it's just a convenience thing to
allow chaining commands. The second should return result of patching.
I've fixed both now, thanks.

> # spc_dsp.h, nal/file.hpp, and ups.hpp all attempted to include
> stdint.h, which isn't part of vc++. Are those files perhaps meant to
> include nall/stdint.h instead of the standard one?


Microsoft really pisses me off by intentionally ignoring stdint.h.
nall/stdint.hpp was meant as a workaround, so that I didn't have to
special case Visual C++. The idea was to not require you to get one of
those third-party add-ons.

So yes, two of those were a mistake on my part, I used stdint.h on
them before I created my own stdint wrapper. I've corrected both.

As for spc_dsp.h, that shouldn't be compiled. That is for blargg's
reference, unmodified S-DSP emulator. The ones modified to work in
bsnes do not require it. And in fact, only src/dsp/sdsp will compile
at the moment due to memory map changes.

> # pEditbox::get_text seems to declare a dynamically sized stack
> array, which CL balked at.


Hahah, yeah, that would be C99 syntax. Very nice, that.

Looks like I was allocating length*2 wchars, too. I don't know why I
was doing that ... I don't think Microsoft's system even supports the
extended Unicode symbols that need more than 16-bits, and even if so,
they aren't likely to appear in the emulator.

Dropped that back to length+1, and made it use new[]/delete[],
instead. That's one horribly inefficient routine by the way, but
whatever, it works for now.

The rest I can't do much about, sorry. Hopefully it'll make it easier
for you to compile in the future. Sorry for letting the port slip, I
just don't have the patience to load VS2k5 again. Software takes like
three hours to install >_< and creates slower code than GCC4 anyway.
If they'd fix their damn PGO support, I'd be all over it again,
though.
This commit is contained in:
byuu 2008-08-13 21:09:15 +00:00
parent 435a194ccd
commit 567d415290
122 changed files with 874 additions and 994 deletions

BIN
bsnes.exe Normal file

Binary file not shown.

View File

@ -1,4 +1,4 @@
#define BSNES_VERSION "0.034"
#define BSNES_VERSION "0.034.03"
#define BSNES_TITLE "bsnes v" BSNES_VERSION
#define BUSCORE sBus

View File

@ -65,7 +65,6 @@ void Cartridge::load_begin(CartridgeType cart_type) {
info.header_index = 0xffc0;
info.mapper = LoROM;
info.name[0] = 0;
info.region = NTSC;
info.rom_size = 0;

View File

@ -18,8 +18,7 @@ public:
VERSION = 0x1b,
ICKSUM = 0x1c,
CKSUM = 0x1e,
RESL = 0x3c,
RESH = 0x3d,
RESETV = 0x3c,
};
enum Region {
@ -70,7 +69,6 @@ public:
uint32 crc32;
char filename[PATH_MAX * 4];
char name[128];
bool patched;
Region region;
@ -121,6 +119,7 @@ public:
void load_end();
bool unload();
unsigned score_header(unsigned);
void find_header();
void read_header();
void read_extended_header();

View File

@ -46,7 +46,9 @@ char* Cartridge::get_base_filename(char *filename) {
}
break;
}
}
}
return filename;
}
char* Cartridge::get_path_filename(char *filename, const char *path, const char *source, const char *extension) {
@ -154,16 +156,16 @@ bool Cartridge::apply_patch(const uint8_t *pdata, const unsigned psize, uint8_t
if(result == ups::input_crc32_invalid) apply = true;
if(result == ups::output_crc32_invalid) apply = true;
}
//if patch application was successful, replace old data, size with new data, size
if(apply == true) {
delete[] data;
data = new uint8_t[size = outsize];
memcpy(data, outdata, outsize);
} else {
dprintf("* Warning: patch application failed!");
}
if(outdata) delete[] outdata;
if(outdata) delete[] outdata;
return apply;
}
bool Cartridge::save_file(const char *fn, uint8 *data, uint size) {

View File

@ -120,70 +120,99 @@ void Cartridge::read_header() {
//0, 1, 13 = NTSC; 2 - 12 = PAL
info.region = (region <= 1 || region >= 13) ? NTSC : PAL;
}
memcpy(&info.name, &rom[info.header_index + CART_NAME], 21);
info.name[21] = 0;
trim(info.name);
unsigned Cartridge::score_header(unsigned addr) {
if(cart.rom_size < addr + 64) return 0; //image too small to contain header at this location?
uint8 *rom = cart.rom;
int score = 0;
//convert undisplayable characters (half-width katakana, etc) to '?' characters
for(int i = 0; i < 21; i++) {
if(info.name[i] & 0x80) info.name[i] = '?';
}
uint16 resetvector = rom[addr + RESETV] | (rom[addr + RESETV + 1] << 8);
uint16 checksum = rom[addr + CKSUM] | (rom[addr + CKSUM + 1] << 8);
uint16 ichecksum = rom[addr + ICKSUM] | (rom[addr + ICKSUM + 1] << 8);
//always display something
if(!info.name[0]) strcpy(info.name, "(untitled)");
uint8 resetop = rom[(addr & ~0x7fff) | (resetvector & 0x7fff)]; //first opcode executed upon reset
uint8 mapper = rom[addr + MAPPER] & ~0x10; //mask off irrelevent FastROM-capable bit
//$00:[000-7fff] contains uninitialized RAM and MMIO.
//reset vector must point to ROM at $00:[8000-ffff] to be considered valid.
if(resetvector < 0x8000) return 0;
//some images duplicate the header in multiple locations, and others have completely
//invalid header information that cannot be relied upon.
//below code will analyze the first opcode executed at the specified reset vector to
//determine the probability that this is the correct header.
//most likely opcodes
if(resetop == 0x78 //sei
|| resetop == 0x18 //clc (clc; xce)
|| resetop == 0x38 //sec (sec; xce)
|| resetop == 0x9c //stz $nnnn (stz $4200)
|| resetop == 0x4c //jmp $nnnn
|| resetop == 0x5c //jml $nnnnnn
) score += 8;
//plausible opcodes
if(resetop == 0xc2 //rep #$nn
|| resetop == 0xe2 //sep #$nn
|| resetop == 0xad //lda $nnnn
|| resetop == 0xae //ldx $nnnn
|| resetop == 0xac //ldy $nnnn
|| resetop == 0xaf //lda $nnnnnn
|| resetop == 0xa9 //lda #$nn
|| resetop == 0xa2 //ldx #$nn
|| resetop == 0xa0 //ldy #$nn
|| resetop == 0x20 //jsr $nnnn
|| resetop == 0x22 //jsl $nnnnnn
) score += 4;
//implausible opcodes
if(resetop == 0x40 //rti
|| resetop == 0x60 //rts
|| resetop == 0x6b //rtl
|| resetop == 0xcd //cmp $nnnn
|| resetop == 0xec //cpx $nnnn
|| resetop == 0xcc //cpy $nnnn
) score -= 4;
//least likely opcodes
if(resetop == 0x00 //brk #$nn
|| resetop == 0x02 //cop #$nn
|| resetop == 0xdb //stp
|| resetop == 0x42 //wdm
|| resetop == 0xff //sbc $nnnnnn,x
) score -= 8;
//at times, both the header and reset vector's first opcode will match ...
//fallback and rely on info validity in these cases to determine more likely header.
//a valid checksum is the biggest indicator of a valid header.
if((checksum + ichecksum) == 0xffff && (checksum != 0) && (ichecksum != 0)) score += 4;
if(addr == 0x007fc0 && mapper == 0x20) score += 2; //0x20 is usually LoROM
if(addr == 0x00ffc0 && mapper == 0x21) score += 2; //0x21 is usually HiROM
if(addr == 0x007fc0 && mapper == 0x22) score += 2; //0x22 is usually ExLoROM
if(addr == 0x40ffc0 && mapper == 0x25) score += 2; //0x25 is usually ExHiROM
if(rom[addr + COMPANY] == 0x33) score += 2; //0x33 indicates extended header
if(rom[addr + ROM_TYPE] < 0x08) score++;
if(rom[addr + ROM_SIZE] < 0x10) score++;
if(rom[addr + RAM_SIZE] < 0x08) score++;
if(rom[addr + REGION] < 14) score++;
printf("* score @ %0.6x = %2d, resetop = %0.2x\n", addr, score, resetop);
if(score < 0) score = 0;
return score;
}
void Cartridge::find_header() {
int32 score_lo = 0, score_hi = 0, score_ex = 0;
uint8_t *rom = cart.rom;
unsigned score_lo = score_header(0x007fc0);
unsigned score_hi = score_header(0x00ffc0);
unsigned score_ex = score_header(0x40ffc0);
if(score_ex) score_ex += 4; //favor ExHiROM on images > 32mbits
if(cart.rom_size < 0x010000) {
//cart too small to be anything but lorom
info.header_index = 0x007fc0;
return;
}
if((rom[0x7fc0 + MAPPER] & ~0x10) == 0x20) score_lo++;
if((rom[0xffc0 + MAPPER] & ~0x10) == 0x21) score_hi++;
if(rom[0x7fc0 + ROM_TYPE] < 0x08) score_lo++;
if(rom[0xffc0 + ROM_TYPE] < 0x08) score_hi++;
if(rom[0x7fc0 + ROM_SIZE] < 0x10) score_lo++;
if(rom[0xffc0 + ROM_SIZE] < 0x10) score_hi++;
if(rom[0x7fc0 + RAM_SIZE] < 0x08) score_lo++;
if(rom[0xffc0 + RAM_SIZE] < 0x08) score_hi++;
if(rom[0x7fc0 + REGION] < 14) score_lo++;
if(rom[0xffc0 + REGION] < 14) score_hi++;
if(rom[0x7fc0 + COMPANY] < 3) score_lo++;
if(rom[0xffc0 + COMPANY] < 3) score_hi++;
if(rom[0x7fc0 + RESH] & 0x80) score_lo += 2;
if(rom[0xffc0 + RESH] & 0x80) score_hi += 2;
uint16 cksum, icksum;
cksum = rom[0x7fc0 + CKSUM] | (rom[0x7fc0 + CKSUM + 1] << 8);
icksum = rom[0x7fc0 + ICKSUM] | (rom[0x7fc0 + ICKSUM + 1] << 8);
if((cksum + icksum) == 0xffff && (cksum != 0) && (icksum != 0)) {
score_lo += 8;
}
cksum = rom[0xffc0 + CKSUM] | (rom[0xffc0 + CKSUM + 1] << 8);
icksum = rom[0xffc0 + ICKSUM] | (rom[0xffc0 + ICKSUM + 1] << 8);
if((cksum + icksum) == 0xffff && (cksum != 0) && (icksum != 0)) {
score_hi += 8;
}
if(cart.rom_size < 0x401000) {
score_ex = 0;
} else {
if(rom[0x7fc0 + MAPPER] == 0x32) score_lo++;
else score_ex += 12;
}
printf("\n");
if(score_lo >= score_hi && score_lo >= score_ex) {
info.header_index = 0x007fc0;

View File

@ -1,3 +1,3 @@
::@make platform=win compiler=mingw32-gcc
@make platform=win compiler=mingw32-gcc enable_gzip=true enable_jma=true
@make platform=win compiler=mingw32-gcc
::@make platform=win compiler=mingw32-gcc enable_gzip=true enable_jma=true
@pause

View File

@ -2,7 +2,7 @@
void sDSP::brr_decode(voice_t &v) {
//state.t_brr_byte = ram[v.brr_addr + v.brr_offset] cached from previous clock cycle
int nybbles = (state.t_brr_byte << 8) + memory::apuram.read(uint16(v.brr_addr + v.brr_offset + 1));
int nybbles = (state.t_brr_byte << 8) + memory::apuram[(uint16)(v.brr_addr + v.brr_offset + 1)];
const int filter = (state.t_brr_header >> 2) & 3;
const int scale = (state.t_brr_header >> 4);

View File

@ -13,8 +13,8 @@ int sDSP::echo_output(bool channel) {
void sDSP::echo_read(bool channel) {
unsigned addr = state.t_echo_ptr + channel * 2;
uint8 lo = memory::apuram.read(uint16(addr + 0));
uint8 hi = memory::apuram.read(uint16(addr + 1));
uint8 lo = memory::apuram[(uint16)(addr + 0)];
uint8 hi = memory::apuram[(uint16)(addr + 1)];
int s = (int16)((hi << 8) + lo);
state.echo_hist[channel].write(state.echo_hist_pos, s >> 1);
}
@ -23,8 +23,8 @@ void sDSP::echo_write(bool channel) {
if(!(state.t_echo_disabled & 0x20)) {
unsigned addr = state.t_echo_ptr + channel * 2;
int s = state.t_echo_out[channel];
memory::apuram.write(uint16(addr + 0), (uint8)(s >> 0));
memory::apuram.write(uint16(addr + 1), (uint8)(s >> 8));
memory::apuram[(uint16)(addr + 0)] = s;
memory::apuram[(uint16)(addr + 1)] = s >> 8;
}
state.t_echo_out[channel] = 0;

View File

@ -24,8 +24,8 @@ void sDSP::voice_2(voice_t &v) {
//read sample pointer (ignored if not needed)
uint16 addr = state.t_dir_addr;
if(!v.kon_delay) addr += 2;
uint8 lo = memory::apuram.read(uint16(addr + 0));
uint8 hi = memory::apuram.read(uint16(addr + 1));
uint8 lo = memory::apuram[(uint16)(addr + 0)];
uint8 hi = memory::apuram[(uint16)(addr + 1)];
state.t_brr_next_addr = ((hi << 8) + lo);
state.t_adsr0 = VREG(adsr0);
@ -45,8 +45,8 @@ void sDSP::voice_3a(voice_t &v) {
}
void sDSP::voice_3b(voice_t &v) {
state.t_brr_byte = memory::apuram.read(uint16(v.brr_addr + v.brr_offset));
state.t_brr_header = memory::apuram.read(uint16(v.brr_addr));
state.t_brr_byte = memory::apuram[(uint16)(v.brr_addr + v.brr_offset)];
state.t_brr_header = memory::apuram[(uint16)(v.brr_addr)];
}
void sDSP::voice_3c(voice_t &v) {

View File

@ -1,6 +0,0 @@
mingw32-g++ -c test/test.cpp -I. -I../
mingw32-g++ -c hiro.cpp -I. -I../
mingw32-g++ -c ../nall/string.cpp -I. -I../
mingw32-g++ test.o hiro.o string.o -o test_app.exe -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomctl32 -lcomdlg32
@pause
@del *.o

View File

@ -1,6 +0,0 @@
clear
g++ -c test/test.cpp -I. -I../
g++ -c hiro.cpp `pkg-config --cflags gtk+-2.0` -I. -I../
g++ -c ../nall/string.cpp -I. -I../
g++ test.o hiro.o string.o -o test_app `pkg-config --libs gtk+-2.0` -lXtst
rm *.o

View File

@ -1,8 +1,8 @@
void hiro_pbutton_tick(pButton *p) {
if(p->self.on_tick) p->self.on_tick(Event(Event::Tick, 0, &p->self));
if(p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, 0, &p->self));
}
void pButton::create(uint style, uint width, uint height, const char *text) {
void pButton::create(unsigned style, unsigned width, unsigned height, const char *text) {
button = gtk_button_new_with_label(text ? text : "");
set_default_font(button);
gtk_widget_set_size_request(button, width, height);

View File

@ -1,7 +1,7 @@
class pButton : public pFormControl {
public:
Button &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pButton(Button&);

View File

@ -1,8 +1,8 @@
void hiro_pcanvas_expose(pCanvas *p) {
uint32_t *f = p->fbuffer;
uint32_t *r = p->rbuffer;
for(uint y = p->canvas->allocation.height; y; y--) {
for(uint x = p->canvas->allocation.width; x; x--) {
for(unsigned y = p->canvas->allocation.height; y; y--) {
for(unsigned x = p->canvas->allocation.width; x; x--) {
uint32_t p = *f++;
*r++ = ((p << 16) & 0xff0000) + (p & 0x00ff00) + ((p >> 16) & 0x0000ff);
}
@ -14,7 +14,7 @@ void hiro_pcanvas_expose(pCanvas *p) {
GDK_RGB_DITHER_NONE, (guchar*)p->rbuffer, p->bpitch);
}
void pCanvas::create(uint style, uint width, uint height) {
void pCanvas::create(unsigned style, unsigned width, unsigned height) {
canvas = gtk_drawing_area_new();
resize(width, height);
GdkColor color;
@ -54,7 +54,7 @@ pCanvas::~pCanvas() {
/* internal */
void pCanvas::resize(uint width, uint height) {
void pCanvas::resize(unsigned width, unsigned height) {
if(fbuffer) free(fbuffer);
if(rbuffer) free(rbuffer);

View File

@ -1,6 +1,6 @@
class pCanvas : public pFormControl {
public:
void create(uint style, uint width, uint height);
void create(unsigned style, unsigned width, unsigned height);
void redraw();
uint32_t* buffer();
@ -13,7 +13,7 @@ public:
//GTK+ RGB drawing function draws in xBGR format, so two buffers are needed ...
uint32_t *fbuffer; //one for the xRGB image
uint32_t *rbuffer; //one for the xBGR image
uint bpitch;
void resize(uint width, uint height);
unsigned bpitch;
void resize(unsigned width, unsigned height);
GtkWidget* gtk_handle();
};

View File

@ -1,8 +1,8 @@
void hiro_pcheckbox_tick(pCheckbox *p) {
if(!p->locked && p->self.on_tick) p->self.on_tick(Event(Event::Tick, p->checked(), &p->self));
if(!p->locked && p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, p->checked(), &p->self));
}
void pCheckbox::create(uint style, uint width, uint height, const char *text) {
void pCheckbox::create(unsigned style, unsigned width, unsigned height, const char *text) {
checkbox = gtk_check_button_new_with_label(text ? text : "");
set_default_font(checkbox);
gtk_widget_set_size_request(checkbox, width, height);

View File

@ -1,6 +1,6 @@
class pCheckbox : public pFormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check(bool state = true);
void uncheck();

View File

@ -1,8 +1,8 @@
void hiro_pcombobox_change(pCombobox *p) {
if(p->self.on_change) p->self.on_change(Event(Event::Change, p->get_selection(), &p->self));
if(p->self.on_change) p->self.on_change(event_t(event_t::Change, p->get_selection(), &p->self));
}
void pCombobox::create(uint style, uint width, uint height, const char *text) {
void pCombobox::create(unsigned style, unsigned width, unsigned height, const char *text) {
combobox = gtk_combo_box_new_text();
set_default_font(combobox);
gtk_widget_set_size_request(combobox, width, height);

View File

@ -1,6 +1,6 @@
class pCombobox : public pFormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void add_item(const char *text);
int get_selection();
void set_selection(int index);
@ -11,6 +11,6 @@ public:
/* internal */
GtkWidget *combobox;
uint counter;
unsigned counter;
GtkWidget* gtk_handle();
};

View File

@ -1,4 +1,4 @@
void pEditbox::create(uint style, uint width, uint height, const char *text) {
void pEditbox::create(unsigned style, unsigned width, unsigned height, const char *text) {
multiline = bool(style & Editbox::Multiline);
if(multiline == false) {
@ -38,7 +38,7 @@ void pEditbox::set_text(const char *text) {
}
}
uint pEditbox::get_text(char *text, uint length) {
unsigned pEditbox::get_text(char *text, unsigned length) {
if(multiline == false) {
const char *temp = gtk_entry_get_text(GTK_ENTRY(editbox));
return strlcpy(text, temp ? temp : "", length);

View File

@ -1,8 +1,8 @@
class pEditbox : public pFormControl {
public:
Editbox &self;
void create(uint style, uint width, uint height, const char *text = "");
uint get_text(char *text, uint length = -1U);
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
unsigned get_text(char *text, unsigned length = -1U);
void set_text(const char *text = "");
pEditbox(Editbox&);

View File

@ -1,4 +1,4 @@
void pFormControl::resize(uint width, uint height) {
void pFormControl::resize(unsigned width, unsigned height) {
gtk_widget_set_size_request(gtk_handle(), width, height);
}

View File

@ -1,6 +1,6 @@
class pFormControl : public pWidget {
public:
virtual void resize(uint width, uint height);
virtual void resize(unsigned width, unsigned height);
void focus();
bool focused();
void enable(bool = true);

View File

@ -1,4 +1,4 @@
void pFrame::create(uint style, uint width, uint height, const char *text) {
void pFrame::create(unsigned style, unsigned width, unsigned height, const char *text) {
frame = gtk_frame_new(text ? text : "");
set_default_font(frame);
gtk_widget_set_size_request(frame, width, height);

View File

@ -1,7 +1,7 @@
class pFrame : public pFormControl {
public:
Frame &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pFrame(Frame&);

View File

@ -158,11 +158,11 @@ bool pHiro::file_save(Window *focus, char *filename, const char *path, const cha
return strcmp(filename, ""); //return true if filename exists
}
uint pHiro::screen_width() {
unsigned pHiro::screen_width() {
return gdk_screen_width();
}
uint pHiro::screen_height() {
unsigned pHiro::screen_height() {
return gdk_screen_height();
}

View File

@ -43,8 +43,8 @@ public:
bool file_open(Window *focus, char *filename, const char *path = "", const char *filter = "");
bool file_save(Window *focus, char *filename, const char *path = "", const char *filter = "");
uint screen_width();
uint screen_height();
unsigned screen_width();
unsigned screen_height();
void enable_screensaver();
void disable_screensaver();
@ -62,7 +62,7 @@ public:
void set_default_path(const char*);
bool is_screensaver_enabled;
void screensaver_tick();
uint16_t translate_key(uint key);
uint16_t translate_key(unsigned key);
};
pHiro& phiro();

View File

@ -1,4 +1,4 @@
uint16_t pHiro::translate_key(uint key) {
uint16_t pHiro::translate_key(unsigned key) {
switch(key) {
case GDK_Escape: return keyboard::escape;

View File

@ -1,4 +1,4 @@
void pLabel::create(uint style, uint width, uint height, const char *text) {
void pLabel::create(unsigned style, unsigned width, unsigned height, const char *text) {
label = gtk_label_new(text ? text : "");
set_default_font(label);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);

View File

@ -1,7 +1,7 @@
class pLabel : public pFormControl {
public:
Label &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pLabel(Label&);

View File

@ -1,13 +1,13 @@
void hiro_plistbox_change(pListbox *p) {
if(p->listbox_selection == p->get_selection()) return;
if(p->self.on_change) p->self.on_change(Event(Event::Change, p->listbox_selection = p->get_selection(), &p->self));
if(p->self.on_change) p->self.on_change(event_t(event_t::Change, p->listbox_selection = p->get_selection(), &p->self));
}
void hiro_plistbox_activate(pListbox *p) {
if(p->self.on_activate) p->self.on_activate(Event(Event::Activate, p->listbox_selection = p->get_selection(), &p->self));
if(p->self.on_activate) p->self.on_activate(event_t(event_t::Activate, p->listbox_selection = p->get_selection(), &p->self));
}
void pListbox::create(uint style, uint width, uint height, const char *columns, const char *text) {
void pListbox::create(unsigned style, unsigned width, unsigned height, const char *columns, const char *text) {
bool header = style & Listbox::Header;
GtkPolicyType hscroll = (style & Listbox::HorizontalScrollAlways) ? GTK_POLICY_ALWAYS :
(style & Listbox::HorizontalScrollNever) ? GTK_POLICY_NEVER :
@ -24,7 +24,7 @@ void pListbox::create(uint style, uint width, uint height, const char *columns,
split(list, "\t", columns);
GType *v = (GType*)malloc(count(list) * sizeof(GType));
for(uint i = 0; i < count(list); i++) v[i] = G_TYPE_STRING;
for(unsigned i = 0; i < count(list); i++) v[i] = G_TYPE_STRING;
store = gtk_list_store_newv(count(list), v);
free(v);
@ -37,7 +37,7 @@ void pListbox::create(uint style, uint width, uint height, const char *columns,
//alternate colors for each listbox entry if there are multiple columns ...
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(listbox), count(list) >= 2 ? true : false);
for(uint i = 0; i < count(list); i++) {
for(unsigned i = 0; i < count(list); i++) {
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(list[i], renderer, "text", i, (void*)0);
column_list[column_list.size()] = column;
@ -46,7 +46,7 @@ void pListbox::create(uint style, uint width, uint height, const char *columns,
if(text && *text) {
split(list, "\n", text);
for(uint i = 0; i < count(list); i++) add_item(list[i]);
for(unsigned i = 0; i < count(list); i++) add_item(list[i]);
}
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(listbox), header);
@ -62,7 +62,7 @@ void pListbox::autosize_columns() {
gtk_tree_view_columns_autosize(GTK_TREE_VIEW(listbox));
}
void pListbox::set_column_width(uint column, uint width) {
void pListbox::set_column_width(unsigned column, unsigned width) {
gtk_tree_view_column_set_min_width(column_list[column], width);
gtk_tree_view_column_set_max_width(column_list[column], width);
}
@ -71,14 +71,14 @@ void pListbox::add_item(const char *text) {
lstring list;
split(list, "\t", text);
gtk_list_store_append(store, &iter);
for(uint i = 0; i < count(list); i++) {
for(unsigned i = 0; i < count(list); i++) {
gtk_list_store_set(store, &iter, i, list[i](), -1);
}
}
void pListbox::set_item(uint index, const char *text) {
void pListbox::set_item(unsigned index, const char *text) {
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(listbox));
for(uint i = 0; i <= index; i++) {
for(unsigned i = 0; i <= index; i++) {
i == 0 ?
gtk_tree_model_get_iter_first(model, &iter) :
gtk_tree_model_iter_next(model, &iter);
@ -86,7 +86,7 @@ GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(listbox));
lstring list;
split(list, "\t", text);
for(uint i = 0; i < count(list); i++) {
for(unsigned i = 0; i < count(list); i++) {
gtk_list_store_set(store, &iter, i, list[i](), -1);
}
}
@ -96,7 +96,7 @@ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listbox)
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(listbox));
if(gtk_tree_model_get_iter_first(model, &iter) == false) { return -1; }
if(gtk_tree_selection_iter_is_selected(selection, &iter) == true) { return 0; }
for(uint i = 1; i < 100000; i++) {
for(unsigned i = 1; i < 100000; i++) {
if(gtk_tree_model_iter_next(model, &iter) == false) { return -1; }
if(gtk_tree_selection_iter_is_selected(selection, &iter) == true) { return i; }
}
@ -111,12 +111,12 @@ GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(listbox));
if(index < 0) { goto end; }
if(gtk_tree_model_get_iter_first(model, &iter) == false) { goto end; }
if(index == 0) { gtk_tree_selection_select_iter(selection, &iter); goto end; }
for(uint i = 1; i < 100000; i++) {
for(unsigned i = 1; i < 100000; i++) {
if(gtk_tree_model_iter_next(model, &iter) == false) { goto end; }
if(index == i) { gtk_tree_selection_select_iter(selection, &iter); goto end; }
}
end:
if(current != index) ;//{ owner->message(Message::Changed, (uintptr_t)this); }
if(current != index); //{ owner->message(Message::Changed, (uintptr_t)this); }
}
void pListbox::reset() {

View File

@ -1,10 +1,10 @@
class pListbox : public pFormControl {
public:
void create(uint style, uint width, uint height, const char *columns = "", const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *columns = "", const char *text = "");
void autosize_columns();
void set_column_width(uint column, uint width);
void set_column_width(unsigned column, unsigned width);
void add_item(const char *text);
void set_item(uint index, const char *text);
void set_item(unsigned index, const char *text);
int get_selection();
void set_selection(int index);
void reset();

View File

@ -1,5 +1,5 @@
void hiro_pmenucheckitem_tick(pMenuCheckItem *p) {
if(!p->locked && p->self.on_tick) p->self.on_tick(Event(Event::Tick, p->checked(), &p->self));
if(!p->locked && p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, p->checked(), &p->self));
}
void pMenuCheckItem::create(const char *text) {

View File

@ -1,5 +1,5 @@
void hiro_pmenuitem_tick(pMenuItem *p) {
if(p->self.on_tick) p->self.on_tick(Event(Event::Tick, 0, &p->self));
if(p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, 0, &p->self));
}
void pMenuItem::create(const char *text) {

View File

@ -1,7 +1,7 @@
void hiro_pmenuradioitem_tick(pMenuRadioItem *p) {
//GTK+ sends two messages: one for the activated radio item,
//and one for the deactivated radio item. ignore the latter.
if(!p->locked && p->checked() && p->self.on_tick) p->self.on_tick(Event(Event::Tick, 0, &p->self));
if(!p->locked && p->checked() && p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, 0, &p->self));
}
void pMenuRadioItem::create(MenuRadioItemGroup &group, const char *text) {

View File

@ -1,15 +1,15 @@
void pProgressbar::create(uint style, uint width, uint height) {
void pProgressbar::create(unsigned style, unsigned width, unsigned height) {
progressbar = gtk_progress_bar_new();
gtk_widget_set_size_request(progressbar, width, height);
gtk_widget_show(progressbar);
}
uint pProgressbar::get_progress() {
uint progress = (uint)(gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progressbar)) * 100.0);
unsigned pProgressbar::get_progress() {
unsigned progress = (unsigned)(gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progressbar)) * 100.0);
return max(0U, min(progress, 100U));
}
void pProgressbar::set_progress(uint progress) {
void pProgressbar::set_progress(unsigned progress) {
progress = max(0U, min(progress, 100U));
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar), (double)progress / 100.0);
}

View File

@ -1,9 +1,9 @@
class pProgressbar : public pFormControl {
public:
Progressbar &self;
void create(uint style, uint width, uint height);
uint get_progress();
void set_progress(uint progress);
void create(unsigned style, unsigned width, unsigned height);
unsigned get_progress();
void set_progress(unsigned progress);
pProgressbar(Progressbar&);

View File

@ -1,10 +1,10 @@
void hiro_pradiobox_tick(pRadiobox *p) {
//GTK+ sends two messages: one for the activated radiobox,
//and one for the deactivated radiobox. ignore the latter.
if(!p->locked && p->checked() && p->self.on_tick) p->self.on_tick(Event(Event::Tick, 0, &p->self));
if(!p->locked && p->checked() && p->self.on_tick) p->self.on_tick(event_t(event_t::Tick, 0, &p->self));
}
void pRadiobox::create(RadioboxGroup &group, uint style, uint width, uint height, const char *text) {
void pRadiobox::create(RadioboxGroup &group, unsigned style, unsigned width, unsigned height, const char *text) {
if(group.size() == 0 || group[0] == &self) {
radiobox = gtk_radio_button_new_with_label(0, text ? text : "");
} else {

View File

@ -1,6 +1,6 @@
class pRadiobox : public pFormControl {
public:
void create(RadioboxGroup &group, uint style, uint width, uint height, const char *text = "");
void create(RadioboxGroup &group, unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check();
bool checked();

View File

@ -1,9 +1,9 @@
void hiro_pslider_change(pSlider *p) {
if(p->slider_position == p->get_position()) return;
if(p->self.on_change) p->self.on_change(Event(Event::Change, p->slider_position = p->get_position(), &p->self));
if(p->self.on_change) p->self.on_change(event_t(event_t::Change, p->slider_position = p->get_position(), &p->self));
}
void pSlider::create(uint style, uint width, uint height, uint length) {
void pSlider::create(unsigned style, unsigned width, unsigned height, unsigned length) {
if(length < 1) length = 1;
if(style & Slider::Vertical) {
slider = gtk_vscale_new_with_range(0, length - 1, 1);
@ -16,11 +16,11 @@ void pSlider::create(uint style, uint width, uint height, uint length) {
g_signal_connect_swapped(G_OBJECT(slider), "value-changed", G_CALLBACK(hiro_pslider_change), (gpointer)this);
}
uint pSlider::get_position() {
return (uint)gtk_range_get_value(GTK_RANGE(slider));
unsigned pSlider::get_position() {
return (unsigned)gtk_range_get_value(GTK_RANGE(slider));
}
void pSlider::set_position(uint position) {
void pSlider::set_position(unsigned position) {
gtk_range_set_value(GTK_RANGE(slider), position);
}

View File

@ -1,14 +1,14 @@
class pSlider : public pFormControl {
public:
void create(uint style, uint width, uint height, uint length);
uint get_position();
void set_position(uint position);
void create(unsigned style, unsigned width, unsigned height, unsigned length);
unsigned get_position();
void set_position(unsigned position);
Slider &self;
pSlider(Slider&);
/* internal */
GtkWidget *slider;
uint slider_position;
unsigned slider_position;
GtkWidget* gtk_handle();
};

View File

@ -1,5 +1,5 @@
static gint hiro_pwindow_close(pWindow *p) {
uintptr_t r = p->self.on_close ? p->self.on_close(Event(Event::Close, 0, &p->self)) : true;
uintptr_t r = p->self.on_close ? p->self.on_close(event_t(event_t::Close, 0, &p->self)) : true;
return !bool(r);
}
@ -25,16 +25,16 @@ static gboolean hiro_pwindow_expose(pWindow *p) {
}
static gint hiro_pwindow_keydown(GtkWidget *w, GdkEventKey *key, pWindow *p) {
if(p && p->self.on_keydown) p->self.on_keydown(Event(Event::KeyDown, phiro().translate_key(key->keyval), &p->self));
if(p && p->self.on_keydown) p->self.on_keydown(event_t(event_t::KeyDown, phiro().translate_key(key->keyval), &p->self));
return FALSE;
}
static gint hiro_pwindow_keyup(GtkWidget *w, GdkEventKey *key, pWindow *p) {
if(p && p->self.on_keyup) p->self.on_keyup(Event(Event::KeyUp, phiro().translate_key(key->keyval), &p->self));
if(p && p->self.on_keyup) p->self.on_keyup(event_t(event_t::KeyUp, phiro().translate_key(key->keyval), &p->self));
return FALSE;
}
void pWindow::create(uint style, uint width, uint height, const char *text) {
void pWindow::create(unsigned style, unsigned width, unsigned height, const char *text) {
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_colormap(window, phiro().colormap);
@ -81,12 +81,12 @@ void pWindow::close() {
gtk_widget_destroy(window);
}
void pWindow::move(uint x, uint y) {
void pWindow::move(unsigned x, unsigned y) {
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE);
gtk_window_move(GTK_WINDOW(window), x, y);
}
void pWindow::resize(uint width, uint height) {
void pWindow::resize(unsigned width, unsigned height) {
gtk_widget_set_size_request(formcontainer, width, height);
state.width = width;
state.height = height;
@ -132,14 +132,14 @@ void pWindow::unfullscreen() {
//is unreliable, as it will usually report the previous window size.
//therefore, calculate it manually by using state information.
uint pWindow::get_width() {
unsigned pWindow::get_width() {
if(state.is_fullscreen == false) return state.width;
return gdk_screen_width();
}
uint pWindow::get_height() {
unsigned pWindow::get_height() {
if(state.is_fullscreen == false) return state.height;
uint height = gdk_screen_height();
unsigned height = gdk_screen_height();
//do not include menubar height in client area height
if(menu.visible()) {
@ -198,7 +198,7 @@ void pWindow::set_text(const char *text) {
gtk_window_set_title(GTK_WINDOW(window), text ? text : "");
}
void pWindow::attach(Window &window, uint x, uint y) {
void pWindow::attach(Window &window, unsigned x, unsigned y) {
window.p.owner = this;
//GTK+ does not support attaching a window to another window,
@ -216,15 +216,15 @@ void pWindow::attach(MenuGroup &menugroup) {
gtk_widget_show(menubar);
}
void pWindow::attach(FormControl &formcontrol, uint x, uint y) {
void pWindow::attach(FormControl &formcontrol, unsigned x, unsigned y) {
gtk_fixed_put(GTK_FIXED(formcontainer), formcontrol.p.gtk_handle(), x, y);
}
void pWindow::move(Window &window, uint x, uint y) {
void pWindow::move(Window &window, unsigned x, unsigned y) {
gtk_fixed_move(GTK_FIXED(formcontainer), window.p.gtk_handle(), x, y);
}
void pWindow::move(FormControl &formcontrol, uint x, uint y) {
void pWindow::move(FormControl &formcontrol, unsigned x, unsigned y) {
gtk_fixed_move(GTK_FIXED(formcontainer), formcontrol.p.gtk_handle(), x, y);
}

View File

@ -1,24 +1,24 @@
class pWindow : public pWidget {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void close();
void move(uint x, uint y);
void resize(uint width, uint height);
void move(unsigned x, unsigned y);
void resize(unsigned width, unsigned height);
void focus();
bool focused();
void fullscreen();
void unfullscreen();
uint get_width();
uint get_height();
unsigned get_width();
unsigned get_height();
void set_opacity(uint8_t opacity);
void set_background_color(uint8_t r, uint8_t g, uint8_t b);
void set_icon(unsigned width, unsigned height, const uint32_t *data);
void set_text(const char *text = "");
void attach(Window &window, uint x, uint y);
void attach(Window &window, unsigned x, unsigned y);
void attach(MenuGroup &menugroup);
void attach(FormControl &formcontrol, uint x, uint y);
void move(Window &window, uint x, uint y);
void move(FormControl &formcontrol, uint x, uint y);
void attach(FormControl &formcontrol, unsigned x, unsigned y);
void move(Window &window, unsigned x, unsigned y);
void move(FormControl &formcontrol, unsigned x, unsigned y);
class Statusbar {
public:
@ -55,9 +55,9 @@ public:
GtkWidget* gtk_handle();
struct {
bool is_fullscreen;
uint width;
uint height;
uint alpha;
unsigned width;
unsigned height;
unsigned alpha;
} state;
void menu_show(bool = true);

View File

@ -18,8 +18,8 @@ bool Hiro::pending() { return p.pending(); }
bool Hiro::folder_select(Window *focus, char *filename, const char *path) { return p.folder_select(focus, filename, path); }
bool Hiro::file_open(Window *focus, char *filename, const char *path, const char *filter) { return p.file_open(focus, filename, path, filter); }
bool Hiro::file_save(Window *focus, char *filename, const char *path, const char *filter) { return p.file_save(focus, filename, path, filter); }
uint Hiro::screen_width() { return p.screen_width(); }
uint Hiro::screen_height() { return p.screen_height(); }
unsigned Hiro::screen_width() { return p.screen_width(); }
unsigned Hiro::screen_height() { return p.screen_height(); }
void Hiro::enable_screensaver() { p.enable_screensaver(); }
void Hiro::disable_screensaver() { p.disable_screensaver(); }
Hiro& Hiro::handle() { static Hiro hiro; return hiro; }
@ -39,25 +39,25 @@ Widget::~Widget() { delete &p; }
/* Widget -> Window */
void Window::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Window::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Window::close() { p.close(); }
void Window::move(uint x, uint y) { p.move(x, y); }
void Window::resize(uint width, uint height) { p.resize(width, height); }
void Window::move(unsigned x, unsigned y) { p.move(x, y); }
void Window::resize(unsigned width, unsigned height) { p.resize(width, height); }
void Window::focus() { p.focus(); }
bool Window::focused() { return p.focused(); }
void Window::fullscreen() { p.fullscreen(); }
void Window::unfullscreen() { p.unfullscreen(); }
uint Window::get_width() { return p.get_width(); }
uint Window::get_height() { return p.get_height(); }
unsigned Window::get_width() { return p.get_width(); }
unsigned Window::get_height() { return p.get_height(); }
void Window::set_opacity(uint8_t opacity) { p.set_opacity(opacity); }
void Window::set_background_color(uint8_t r, uint8_t g, uint8_t b) { p.set_background_color(r, g, b); }
void Window::set_icon(unsigned width, unsigned height, const uint32_t *data) { p.set_icon(width, height, data); }
void Window::set_text(const char *text) { p.set_text(text); }
void Window::attach(Window &window, uint x, uint y) { p.attach(window, x, y); }
void Window::attach(Window &window, unsigned x, unsigned y) { p.attach(window, x, y); }
void Window::attach(MenuGroup &menugroup) { p.attach(menugroup); }
void Window::attach(FormControl &formcontrol, uint x, uint y) { p.attach(formcontrol, x, y); }
void Window::move(Window &window, uint x, uint y) { p.move(window, x, y); }
void Window::move(FormControl &formcontrol, uint x, uint y) { p.move(formcontrol, x, y); }
void Window::attach(FormControl &formcontrol, unsigned x, unsigned y) { p.attach(formcontrol, x, y); }
void Window::move(Window &window, unsigned x, unsigned y) { p.move(window, x, y); }
void Window::move(FormControl &formcontrol, unsigned x, unsigned y) { p.move(formcontrol, x, y); }
void Window::Menubar::show(bool state) { p.menu.show(state); }
void Window::Menubar::hide() { p.menu.hide(); }
@ -139,7 +139,7 @@ MenuSeparator::MenuSeparator() :
/* Widget -> FormControl */
void FormControl::resize(uint width, uint height) { p.resize(width, height); }
void FormControl::resize(unsigned width, unsigned height) { p.resize(width, height); }
void FormControl::focus() { p.focus(); }
bool FormControl::focused() { return p.focused(); }
void FormControl::enable(bool state) { p.enable(state); }
@ -156,7 +156,7 @@ FormControl::FormControl(pFormControl &p_) :
/* Widget -> FormControl -> Frame */
void Frame::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Frame::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Frame::set_text(const char *text) { p.set_text(text); }
Frame::Frame() :
base_from_member<pFrame&>(*new pFrame(*this)),
@ -165,7 +165,7 @@ Frame::Frame() :
/* Widget -> FormControl -> Canvas */
void Canvas::create(uint style, uint width, uint height) { p.create(style, width, height); }
void Canvas::create(unsigned style, unsigned width, unsigned height) { p.create(style, width, height); }
void Canvas::redraw() { p.redraw(); }
uint32_t* Canvas::buffer() { return p.buffer(); }
Canvas::Canvas() :
@ -175,7 +175,7 @@ Canvas::Canvas() :
/* Widget -> FormControl -> Label */
void Label::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Label::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Label::set_text(const char *text) { p.set_text(text); }
Label::Label() :
base_from_member<pLabel&>(*new pLabel(*this)),
@ -184,7 +184,7 @@ Label::Label() :
/* Widget -> FormControl -> Button */
void Button::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Button::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Button::set_text(const char *text) { p.set_text(text); }
Button::Button() :
base_from_member<pButton&>(*new pButton(*this)),
@ -193,7 +193,7 @@ Button::Button() :
/* Widget -> FormControl -> Checkbox */
void Checkbox::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Checkbox::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Checkbox::set_text(const char *text) { p.set_text(text); }
void Checkbox::check(bool state) { state ? p.check() : p.uncheck(); }
void Checkbox::uncheck() { p.uncheck(); }
@ -205,7 +205,7 @@ Checkbox::Checkbox() :
/* Widget -> FormControl -> Radiobox */
void Radiobox::create(RadioboxGroup &group, uint style, uint width, uint height, const char *text) { p.create(group, style, width, height, text); }
void Radiobox::create(RadioboxGroup &group, unsigned style, unsigned width, unsigned height, const char *text) { p.create(group, style, width, height, text); }
void Radiobox::set_text(const char *text) { p.set_text(text); }
void Radiobox::check() { p.check(); }
bool Radiobox::checked() { return p.checked(); }
@ -216,8 +216,8 @@ Radiobox::Radiobox() :
/* Widget -> FormControl -> Editbox */
void Editbox::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
uint Editbox::get_text(char *text, uint length) { return p.get_text(text, length); }
void Editbox::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
unsigned Editbox::get_text(char *text, unsigned length) { return p.get_text(text, length); }
void Editbox::set_text(const char *text) { p.set_text(text); }
Editbox::Editbox() :
base_from_member<pEditbox&>(*new pEditbox(*this)),
@ -226,11 +226,11 @@ Editbox::Editbox() :
/* Widget -> FormControl -> Listbox */
void Listbox::create(uint style, uint width, uint height, const char *columns, const char *text) { p.create(style, width, height, columns, text); }
void Listbox::create(unsigned style, unsigned width, unsigned height, const char *columns, const char *text) { p.create(style, width, height, columns, text); }
void Listbox::autosize_columns() { p.autosize_columns(); }
void Listbox::set_column_width(uint column, uint width) { p.set_column_width(column, width); }
void Listbox::set_column_width(unsigned column, unsigned width) { p.set_column_width(column, width); }
void Listbox::add_item(const char *text) { p.add_item(text); }
void Listbox::set_item(uint index, const char *text) { p.set_item(index, text); }
void Listbox::set_item(unsigned index, const char *text) { p.set_item(index, text); }
int Listbox::get_selection() { return p.get_selection(); }
void Listbox::set_selection(int index) { p.set_selection(index); }
void Listbox::reset() { p.reset(); }
@ -241,7 +241,7 @@ Listbox::Listbox() :
/* Widget -> FormControl -> Combobox */
void Combobox::create(uint style, uint width, uint height, const char *text) { p.create(style, width, height, text); }
void Combobox::create(unsigned style, unsigned width, unsigned height, const char *text) { p.create(style, width, height, text); }
void Combobox::add_item(const char *text) { p.add_item(text); }
int Combobox::get_selection() { return p.get_selection(); }
void Combobox::set_selection(int index) { p.set_selection(index); }
@ -253,9 +253,9 @@ Combobox::Combobox() :
/* Widget -> FormControl -> Progressbar */
void Progressbar::create(uint style, uint width, uint height) { p.create(style, width, height); }
uint Progressbar::get_progress() { return p.get_progress(); }
void Progressbar::set_progress(uint progress) { p.set_progress(progress); }
void Progressbar::create(unsigned style, unsigned width, unsigned height) { p.create(style, width, height); }
unsigned Progressbar::get_progress() { return p.get_progress(); }
void Progressbar::set_progress(unsigned progress) { p.set_progress(progress); }
Progressbar::Progressbar() :
base_from_member<pProgressbar&>(*new pProgressbar(*this)),
FormControl(base_from_member<pProgressbar&>::value),
@ -263,9 +263,9 @@ Progressbar::Progressbar() :
/* Widget -> FormControl -> Slider */
void Slider::create(uint style, uint width, uint height, uint length) { p.create(style, width, height, length); }
uint Slider::get_position() { return p.get_position(); }
void Slider::set_position(uint position) { p.set_position(position); }
void Slider::create(unsigned style, unsigned width, unsigned height, unsigned length) { p.create(style, width, height, length); }
unsigned Slider::get_position() { return p.get_position(); }
void Slider::set_position(unsigned position) { p.set_position(position); }
Slider::Slider() :
base_from_member<pSlider&>(*new pSlider(*this)),
FormControl(base_from_member<pSlider&>::value),

View File

@ -1,6 +1,6 @@
/*
hiro
version: 0.005 (2008-05-25)
version: 0.006 (2008-08-12)
author: byuu
license: public domain
*/
@ -15,7 +15,6 @@
#include <nall/stdint.hpp>
#include <nall/string.hpp>
#include <nall/utility.hpp>
typedef unsigned int uint;
namespace libhiro {
@ -89,8 +88,8 @@ class Widget;
typedef nall::array<MenuRadioItem*> MenuRadioItemGroup;
typedef nall::array<Radiobox*> RadioboxGroup;
struct Event {
enum Type {
struct event_t {
enum type_t {
Close,
Block,
KeyDown,
@ -102,7 +101,7 @@ struct Event {
uintptr_t param;
Widget *widget;
Event(Type type_, uintptr_t param_ = 0, Widget *widget_ = 0) :
event_t(type_t type_, uintptr_t param_ = 0, Widget *widget_ = 0) :
type(type_), param(param_), widget(widget_) {}
};
@ -117,8 +116,8 @@ public:
bool file_open(Window *focus, char *filename, const char *path = "", const char *filter = "");
bool file_save(Window *focus, char *filename, const char *path = "", const char *filter = "");
uint screen_width();
uint screen_height();
unsigned screen_width();
unsigned screen_height();
void enable_screensaver();
void disable_screensaver();
@ -182,26 +181,26 @@ public:
AutoCenter = 1 << 1,
};
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void close();
void move(uint x, uint y);
void resize(uint width, uint height);
void move(unsigned x, unsigned y);
void resize(unsigned width, unsigned height);
void focus();
bool focused();
void fullscreen();
void unfullscreen();
uint get_width();
uint get_height();
unsigned get_width();
unsigned get_height();
void set_opacity(uint8_t opacity);
void set_background_color(uint8_t r, uint8_t g, uint8_t b);
void set_icon(unsigned width, unsigned height, const uint32_t *data);
void set_status_text(const char *text = "");
void set_text(const char *text = "");
void attach(Window &window, uint x, uint y);
void attach(Window &window, unsigned x, unsigned y);
void attach(MenuGroup &menugroup);
void attach(FormControl &formcontrol, uint x, uint y);
void move(Window &window, uint x, uint y);
void move(FormControl &formcontrol, uint x, uint y);
void attach(FormControl &formcontrol, unsigned x, unsigned y);
void move(Window &window, unsigned x, unsigned y);
void move(FormControl &formcontrol, unsigned x, unsigned y);
class Menubar {
public:
@ -224,10 +223,10 @@ public:
Statusbar(pWindow&);
} status;
nall::function<uintptr_t (Event)> on_close;
nall::function<uintptr_t (Event)> on_block;
nall::function<uintptr_t (Event)> on_keydown;
nall::function<uintptr_t (Event)> on_keyup;
nall::function<uintptr_t (event_t)> on_close;
nall::function<uintptr_t (event_t)> on_block;
nall::function<uintptr_t (event_t)> on_keydown;
nall::function<uintptr_t (event_t)> on_keyup;
Window();
@ -268,7 +267,7 @@ public:
MenuItem& create(const char *text);
MenuItem();
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
private:
pFriends;
@ -283,7 +282,7 @@ public:
bool checked();
MenuCheckItem();
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
private:
pFriends;
@ -297,7 +296,7 @@ public:
bool checked();
MenuRadioItem();
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
private:
pFriends;
@ -316,7 +315,7 @@ private:
class FormControl : private nall::base_from_member<pFormControl&>, public Widget {
public:
void resize(uint width, uint height);
void resize(unsigned width, unsigned height);
void focus();
bool focused();
void enable(bool = true);
@ -335,7 +334,7 @@ private:
class Frame : private nall::base_from_member<pFrame&>, public FormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
Frame();
@ -347,7 +346,7 @@ private:
class Canvas : private nall::base_from_member<pCanvas&>, public FormControl {
public:
void create(uint style, uint width, uint height);
void create(unsigned style, unsigned width, unsigned height);
void redraw();
uint32_t* buffer();
@ -360,7 +359,7 @@ private:
class Label : private nall::base_from_member<pLabel&>, public FormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
Label();
@ -372,10 +371,10 @@ private:
class Button : private nall::base_from_member<pButton&>, public FormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
Button();
@ -386,13 +385,13 @@ private:
class Checkbox : private nall::base_from_member<pCheckbox&>, public FormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check(bool = true);
void uncheck();
bool checked();
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
Checkbox();
@ -403,12 +402,12 @@ private:
class Radiobox : private nall::base_from_member<pRadiobox&>, public FormControl {
public:
void create(RadioboxGroup &group, uint style, uint width, uint height, const char *text = "");
void create(RadioboxGroup &group, unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check();
bool checked();
nall::function<uintptr_t (Event)> on_tick;
nall::function<uintptr_t (event_t)> on_tick;
Radiobox();
@ -432,8 +431,8 @@ public:
VerticalScrollNever = 1 << 6,
};
void create(uint style, uint width, uint height, const char *text = "");
uint get_text(char *text, uint length = -1U);
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
unsigned get_text(char *text, unsigned length = -1U);
void set_text(const char *text = "");
Editbox();
@ -457,17 +456,17 @@ public:
VerticalScrollNever = 1 << 5,
};
void create(uint style, uint width, uint height, const char *columns = "", const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *columns = "", const char *text = "");
void autosize_columns();
void set_column_width(uint column, uint width);
void set_column_width(unsigned column, unsigned width);
void add_item(const char *text);
void set_item(uint index, const char *text);
void set_item(unsigned index, const char *text);
int get_selection();
void set_selection(int index);
void reset();
nall::function<uintptr_t (Event)> on_change;
nall::function<uintptr_t (Event)> on_activate;
nall::function<uintptr_t (event_t)> on_change;
nall::function<uintptr_t (event_t)> on_activate;
Listbox();
@ -478,13 +477,13 @@ private:
class Combobox : private nall::base_from_member<pCombobox&>, public FormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void add_item(const char *text);
int get_selection();
void set_selection(int index);
void reset();
nall::function<uintptr_t (Event)> on_change;
nall::function<uintptr_t (event_t)> on_change;
Combobox();
@ -495,9 +494,9 @@ private:
class Progressbar : private nall::base_from_member<pProgressbar&>, public FormControl {
public:
void create(uint style, uint width, uint height);
uint get_progress();
void set_progress(uint progress);
void create(unsigned style, unsigned width, unsigned height);
unsigned get_progress();
void set_progress(unsigned progress);
Progressbar();
@ -513,11 +512,11 @@ public:
Vertical = 1 << 1,
};
void create(uint style, uint width, uint height, uint length);
uint get_position();
void set_position(uint position);
void create(unsigned style, unsigned width, unsigned height, unsigned length);
unsigned get_position();
void set_position(unsigned position);
nall::function<uintptr_t (Event)> on_change;
nall::function<uintptr_t (event_t)> on_change;
Slider();

View File

@ -1,237 +0,0 @@
#include "../hiro.h"
using namespace libhiro;
#include <nall/algorithm.hpp>
using nall::min;
using nall::max;
bool kill_ = false;
uint32_t windowicon[16 * 16] = {
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
};
class SubWindow : public Window {
public:
Button button;
uintptr_t tick(Event) {
hide();
}
void setup() {
create(0, 595, 80);
button.create(0, 595, 80, "SubWindow (click to hide)");
button.on_tick = bind(&SubWindow::tick, this);
attach(button, 0, 0);
}
} subwindow;
class MainWindow : public Window {
public:
MenuGroup menu_file;
MenuGroup menu_file_disk;
MenuItem menu_file_disk_load;
MenuItem menu_file_disk_save;
MenuSeparator menu_file_separator;
MenuItem menu_file_exit;
MenuGroup menu_help;
MenuCheckItem menu_help_check1, menu_help_check2;
MenuSeparator menu_help_separator1;
MenuRadioItem menu_help_radio1, menu_help_radio2, menu_help_radio3;
MenuSeparator menu_help_separator2;
MenuItem menu_help_about;
Label label;
Editbox editbox, editbox_multi;
Button button_ok;
Button button_exit;
Checkbox check1, check2;
Radiobox radio1, radio2;
Progressbar progress;
Combobox combobox;
Listbox listbox;
Slider hslider, vslider;
Frame frame;
Canvas canvas;
uintptr_t change(Event e) {
printf("change(%d)\n", (uint)e.param);
}
uintptr_t activate(Event e) {
printf("activate(%d)\n", (uint)e.param);
}
uintptr_t tick(Event e) {
printf("tick(%d)\n", e.param);
if(e.widget == &button_ok) {
char t[4096];
editbox.get_text(t, 4096);
printf("'%s'\n", t);
}
if(e.widget == &menu_file_disk_load) {
char t[4096] = "";
hiro().file_open(0, t, "", "Source files\t*.cpp,*.h\nAll Files\t*.*");
printf("'%s'\n", t);
}
if(e.widget == &menu_file_disk_save) {
char t[4096] = "";
hiro().file_save(0, t, "", "Source files\t*.cpp,*.h\nAll Files\t*.*");
printf("'%s'\n", t);
}
}
uintptr_t keydown(Event e) {
static bool fs = false;
if(e.param == nall::keyboard::f11) {
fs = !fs;
fs ? fullscreen() : unfullscreen();
printf("%d -> %4d, %4d\n", fs, get_width(), get_height());
} else if(e.param == nall::keyboard::escape) {
menu.show(!menu.visible());
}
}
uintptr_t close(Event) {
printf("close()\n");
return kill_ = true;
}
void setup() {
create(Window::AutoCenter, 605, 320, "hiro test application");
//set_opacity(224);
//set_background_color(0, 0, 0);
set_icon(16, 16, windowicon);
attach(menu_file.create("File"));
menu_file.attach(menu_file_disk.create("Disk"));
menu_file_disk.attach(menu_file_disk_load.create("Load ..."));
menu_file_disk.attach(menu_file_disk_save.create("Save ..."));
menu_file.attach(menu_file_separator.create());
menu_file.attach(menu_file_exit.create("Exit"));
attach(menu_help.create("Help"));
menu_help.attach(menu_help_check1.create("Check 1"));
menu_help.attach(menu_help_check2.create("Check 2"));
menu_help.attach(menu_help_separator1.create());
{ MenuRadioItemGroup group;
group.add(&menu_help_radio1);
group.add(&menu_help_radio2);
group.add(&menu_help_radio3);
menu_help.attach(menu_help_radio1.create(group, "Radio 1"));
menu_help.attach(menu_help_radio2.create(group, "Radio 2"));
menu_help.attach(menu_help_radio3.create(group, "Radio 3"));
} menu_help.attach(menu_help_separator2.create());
menu_help.attach(menu_help_about.create("About ..."));
menu_help_about.disable();
label.create(0, 200, 35, "hiro test application\n~ byuu");
editbox.create(0, 200, 25);
button_ok.create(0, 100, 30, "Ok");
button_exit.create(0, 100, 30, "Exit");
editbox_multi.create(Editbox::Multiline | Editbox::VerticalScrollAlways, 200, 95);
check1.create(0, 100, 20, "Check 1");
check2.create(0, 100, 20, "Check 2");
{ RadioboxGroup group;
group.add(&radio1);
group.add(&radio2);
radio1.create(group, 0, 100, 20, "Radio 1");
radio2.create(group, 0, 100, 20, "Radio 2");
} progress.create(0, 200, 30);
progress.set_progress(50);
combobox.create(0, 200, 30);
combobox.add_item("Option 1");
combobox.add_item("Option 2");
combobox.add_item("Option 3");
listbox.create(Listbox::Header | Listbox::VerticalScrollAlways, 200, 100, "Name\tValue");
listbox.add_item("a\ttrue");
listbox.add_item("b\tfalse");
hslider.create(Slider::Horizontal, 425, 25, 10);
vslider.create(Slider::Vertical, 25, 200, 10);
frame.create(0, 155, 225, "Canvas:");
canvas.create(0, 135, 195);
for(uint y = 0; y < 195; y++) {
uint32_t *p = canvas.buffer() + y * 135;
for(uint x = 0; x < 135; x++) {
double dx = 128.0 / 135.0 * double(x);
double dy = 128.0 / 195.0 * double(y);
uint32_t c = uint32_t(dx) + uint32_t(dy);
*p++ = (max(0U, min(c, 255U)) ^ 0xff) << 16;
}
}
status.show();
status.set_text("Statusbar");
on_close = bind(&MainWindow::close, this);
on_keydown = bind(&MainWindow::keydown, this);
menu_file_disk_load.on_tick =
menu_file_disk_save.on_tick = bind(&MainWindow::tick, this);
menu_file_exit.on_tick = on_close;
menu_help_check1.on_tick = menu_help_check2.on_tick =
menu_help_radio1.on_tick = menu_help_radio2.on_tick =
menu_help_radio3.on_tick = bind(&MainWindow::tick, this);
menu_help_about.on_tick = bind(&MainWindow::tick, this);
button_ok.on_tick = bind(&MainWindow::tick, this);
button_exit.on_tick = bind(&MainWindow::close, this);
check1.on_tick = check2.on_tick =
radio1.on_tick = radio2.on_tick = bind(&MainWindow::tick, this);
combobox.on_change = bind(&MainWindow::change, this);
listbox.on_change = bind(&MainWindow::change, this);
listbox.on_activate = bind(&MainWindow::activate, this);
hslider.on_change = bind(&MainWindow::change, this);
vslider.on_change = bind(&MainWindow::change, this);
attach(label, 5, 5);
attach(editbox, 5, 40);
attach(button_ok, 5, 70);
attach(button_exit, 105, 70);
attach(editbox_multi, 210, 5);
attach(check1, 5, 105);
attach(check2, 105, 105);
attach(radio1, 5, 125);
attach(radio2, 105, 125);
attach(progress, 5, 145);
attach(combobox, 5, 175);
attach(listbox, 210, 105);
attach(hslider, 5, 205);
attach(vslider, 415, 5);
attach(frame, 445, 5);
attach(canvas, 455, 25);
attach(subwindow, 5, 235);
}
} window;
int main() {
hiro().init();
hiro().disable_screensaver();
subwindow.setup();
window.setup();
window.show();
window.check1.check();
while(kill_ == false) hiro().run();
hiro().term();
return 0;
}

View File

@ -1,4 +1,4 @@
void pButton::create(uint style, uint width, uint height, const char *text) {
void pButton::create(unsigned style, unsigned width, unsigned height, const char *text) {
hwnd = CreateWindow(L"BUTTON", utf16(text), WS_CHILD | WS_TABSTOP | WS_VISIBLE,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);

View File

@ -1,7 +1,7 @@
class pButton : public pFormControl {
public:
Button &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pButton(Button&);

View File

@ -1,4 +1,4 @@
void pCanvas::create(uint style, uint width, uint height) {
void pCanvas::create(unsigned style, unsigned width, unsigned height) {
hwnd = CreateWindow(L"hiro_window", L"", WS_CHILD,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);
@ -35,7 +35,7 @@ pCanvas::~pCanvas() {
/* internal */
void pCanvas::resize(uint width, uint height) {
void pCanvas::resize(unsigned width, unsigned height) {
if(ibuffer) free(ibuffer);
ipitch = width * sizeof(uint32_t);

View File

@ -1,6 +1,6 @@
class pCanvas : public pFormControl {
public:
void create(uint style, uint width, uint height);
void create(unsigned style, unsigned width, unsigned height);
void redraw();
uint32_t* buffer();
@ -11,6 +11,6 @@ public:
/* internal */
BITMAPINFO bmi;
uint32_t *ibuffer;
uint ipitch, iwidth, iheight;
void resize(uint width, uint height);
unsigned ipitch, iwidth, iheight;
void resize(unsigned width, unsigned height);
};

View File

@ -1,4 +1,4 @@
void pCheckbox::create(uint style, uint width, uint height, const char *text) {
void pCheckbox::create(unsigned style, unsigned width, unsigned height, const char *text) {
hwnd = CreateWindow(L"BUTTON", utf16(text), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_CHECKBOX,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);

View File

@ -1,6 +1,6 @@
class pCheckbox : public pFormControl {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check(bool state = true);
void uncheck();

View File

@ -1,4 +1,4 @@
void pCombobox::create(uint style, uint width, uint height, const char *text) {
void pCombobox::create(unsigned style, unsigned width, unsigned height, const char *text) {
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"COMBOBOX", L"",
WS_CHILD | WS_TABSTOP | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
0, 0, width, 200,

View File

@ -1,7 +1,7 @@
class pCombobox : public pFormControl {
public:
Combobox &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void add_item(const char *text);
int get_selection();
void set_selection(int index);

View File

@ -1,12 +1,12 @@
void pEditbox::create(uint style, uint width, uint height, const char *text) {
void pEditbox::create(unsigned style, unsigned width, unsigned height, const char *text) {
bool multiline = style & Editbox::Multiline;
bool readonly = style & Editbox::Readonly;
uint vscroll = (style & Editbox::VerticalScrollAlways) ? WS_VSCROLL :
(style & Editbox::VerticalScrollNever) ? 0 :
ES_AUTOVSCROLL;
uint hscroll = (style & Editbox::HorizontalScrollAlways) ? WS_HSCROLL :
(style & Editbox::HorizontalScrollNever) ? 0 :
ES_AUTOHSCROLL;
bool readonly = style & Editbox::Readonly;
unsigned vscroll = (style & Editbox::VerticalScrollAlways) ? WS_VSCROLL :
(style & Editbox::VerticalScrollNever) ? 0 :
ES_AUTOVSCROLL;
unsigned hscroll = (style & Editbox::HorizontalScrollAlways) ? WS_HSCROLL :
(style & Editbox::HorizontalScrollNever) ? 0 :
ES_AUTOHSCROLL;
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"",
WS_CHILD | WS_VISIBLE | vscroll | hscroll |
@ -25,10 +25,11 @@ void pEditbox::set_text(const char *text) {
SetWindowText(hwnd, utf16(temp));
}
uint pEditbox::get_text(char *text, uint length) {
wchar_t buffer[length * 2 + 1];
GetWindowText(hwnd, buffer, length * 2);
unsigned pEditbox::get_text(char *text, unsigned length) {
wchar_t *buffer = new wchar_t[length + 1];
GetWindowText(hwnd, buffer, length);
string temp = (const char*)utf8(buffer);
delete[] buffer;
replace(temp, "\r", "");
strlcpy(text, temp, length);
return strlen(text);

View File

@ -1,8 +1,8 @@
class pEditbox : public pFormControl {
public:
Editbox &self;
void create(uint style, uint width, uint height, const char *text = "");
uint get_text(char *text, uint length = -1U);
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
unsigned get_text(char *text, unsigned length = -1U);
void set_text(const char *text = "");
pEditbox(Editbox&);

View File

@ -1,4 +1,4 @@
void pFormControl::resize(uint width, uint height) {
void pFormControl::resize(unsigned width, unsigned height) {
SetWindowPos(hwnd, 0, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE);
}

View File

@ -1,6 +1,6 @@
class pFormControl : public pWidget {
public:
virtual void resize(uint width, uint height);
virtual void resize(unsigned width, unsigned height);
void focus();
bool focused();
void enable(bool = true);

View File

@ -1,4 +1,4 @@
void pFrame::create(uint style, uint width, uint height, const char *text) {
void pFrame::create(unsigned style, unsigned width, unsigned height, const char *text) {
hwnd = CreateWindow(L"BUTTON", utf16(text), WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);

View File

@ -1,7 +1,7 @@
class pFrame : public pFormControl {
public:
Frame &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pFrame(Frame&);

View File

@ -200,11 +200,11 @@ bool pHiro::file_save(Window *focus, char *filename, const char *path, const cha
return result;
}
uint pHiro::screen_width() {
unsigned pHiro::screen_width() {
return GetSystemMetrics(SM_CXSCREEN);
}
uint pHiro::screen_height() {
unsigned pHiro::screen_height() {
return GetSystemMetrics(SM_CYSCREEN);
}
@ -230,7 +230,7 @@ pHiro& phiro() {
/* internal */
HFONT pHiro::create_font(const char *name, uint size) {
HFONT pHiro::create_font(const char *name, unsigned size) {
return CreateFont(
-(size * 96.0 / 72.0 + 0.5), //96 = DPI
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -238,9 +238,9 @@ HFONT pHiro::create_font(const char *name, uint size) {
);
}
Widget* pHiro::get_widget(uint instance) {
Widget* pHiro::get_widget(unsigned instance) {
Widget *widget = 0;
for(uint i = 0; i < widget_list.size(); i++) {
for(unsigned i = 0; i < widget_list.size(); i++) {
if(widget_list[i]->p.instance != instance) continue;
widget = widget_list[i];
break;
@ -274,26 +274,26 @@ LRESULT pHiro::wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
case WM_CLOSE: {
if(!p || p->self.type != Widget::WindowType) break;
Window &w = ((pWindow*)p)->self;
if(w.on_close) return (bool)w.on_close(Event(Event::Close, 0, &w));
if(w.on_close) return (bool)w.on_close(event_t(event_t::Close, 0, &w));
return TRUE; //true = destroy window
} break;
case WM_ENTERMENULOOP: {
if(!p || p->self.type != Widget::WindowType) break;
Window &w = ((pWindow*)p)->self;
if(w.on_block) w.on_block(Event(Event::Block, 0, &w));
if(w.on_block) w.on_block(event_t(event_t::Block, 0, &w));
} break;
case WM_KEYDOWN: {
if(!p || p->self.type != Widget::WindowType) break;
Window &w = ((pWindow*)p)->self;
if(w.on_keydown) w.on_keydown(Event(Event::KeyDown, translate_key(wparam), &w));
if(w.on_keydown) w.on_keydown(event_t(event_t::KeyDown, translate_key(wparam), &w));
} break;
case WM_KEYUP: {
if(!p || p->self.type != Widget::WindowType) break;
Window &w = ((pWindow*)p)->self;
if(w.on_keyup) w.on_keyup(Event(Event::KeyUp, translate_key(wparam), &w));
if(w.on_keyup) w.on_keyup(event_t(event_t::KeyUp, translate_key(wparam), &w));
} break;
case WM_ERASEBKGND: {
@ -322,39 +322,39 @@ LRESULT pHiro::wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
switch(widget->type) {
case Widget::MenuItemType: {
MenuItem &w = (MenuItem&)*widget;
if(w.on_tick) w.on_tick(Event(Event::Tick, 0, &w));
if(w.on_tick) w.on_tick(event_t(event_t::Tick, 0, &w));
} break;
case Widget::MenuCheckItemType: {
MenuCheckItem &w = (MenuCheckItem&)*widget;
w.check(!w.checked()); //invert check state
if(w.on_tick) w.on_tick(Event(Event::Tick, w.checked(), &w));
if(w.on_tick) w.on_tick(event_t(event_t::Tick, w.checked(), &w));
} break;
case Widget::MenuRadioItemType: {
MenuRadioItem &w = (MenuRadioItem&)*widget;
bool checked = w.checked();
w.check();
if(!checked && w.on_tick) w.on_tick(Event(Event::Tick, w.checked(), &w));
if(!checked && w.on_tick) w.on_tick(event_t(event_t::Tick, w.checked(), &w));
} break;
case Widget::ButtonType: {
Button &w = (Button&)*widget;
if(w.on_tick) w.on_tick(Event(Event::Tick, 0, &w));
if(w.on_tick) w.on_tick(event_t(event_t::Tick, 0, &w));
} break;
case Widget::CheckboxType: {
Checkbox &w = (Checkbox&)*widget;
w.check(!w.checked()); //invert check state
if(w.on_tick) w.on_tick(Event(Event::Tick, w.checked(), &w));
if(w.on_tick) w.on_tick(event_t(event_t::Tick, w.checked(), &w));
} break;
case Widget::RadioboxType: {
Radiobox &w = (Radiobox&)*widget;
bool checked = w.checked();
w.check();
if(!checked && w.on_tick) w.on_tick(Event(Event::Tick, w.checked(), &w));
if(!checked && w.on_tick) w.on_tick(event_t(event_t::Tick, w.checked(), &w));
} break;
case Widget::ComboboxType: {
Combobox &combobox = (Combobox&)*widget;
if(HIWORD(wparam) == CBN_SELCHANGE) {
if(combobox.p.combobox_selection == combobox.get_selection()) break;
if(combobox.on_change) combobox.on_change(Event(Event::Change, combobox.p.combobox_selection = combobox.get_selection(), &combobox));
if(combobox.on_change) combobox.on_change(event_t(event_t::Change, combobox.p.combobox_selection = combobox.get_selection(), &combobox));
}
} break;
}
@ -369,7 +369,7 @@ LRESULT pHiro::wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
case Widget::SliderType: {
Slider &slider = (Slider&)*widget;
if(slider.p.slider_position == slider.get_position()) break;
if(slider.on_change) slider.on_change(Event(Event::Change, slider.p.slider_position = slider.get_position(), &slider));
if(slider.on_change) slider.on_change(event_t(event_t::Change, slider.p.slider_position = slider.get_position(), &slider));
} break;
}
} break;
@ -386,9 +386,9 @@ LRESULT pHiro::wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
&& ListView_GetItemState(listbox.p.hwnd, ((LPNMLISTVIEW)lparam)->iItem, LVIS_FOCUSED)
&& ListView_GetItemState(listbox.p.hwnd, ((LPNMLISTVIEW)lparam)->iItem, LVIS_SELECTED)
) {
if(listbox.on_change) listbox.on_change(Event(Event::Change, listbox.get_selection(), &listbox));
if(listbox.on_change) listbox.on_change(event_t(event_t::Change, listbox.get_selection(), &listbox));
} else if(((LPNMHDR)lparam)->code == LVN_ITEMACTIVATE) {
if(listbox.on_activate) listbox.on_activate(Event(Event::Activate, listbox.get_selection(), &listbox));
if(listbox.on_activate) listbox.on_activate(event_t(event_t::Activate, listbox.get_selection(), &listbox));
}
} break;
}

View File

@ -51,8 +51,8 @@ public:
bool file_open(Window *focus, char *filename, const char *path = "", const char *filter = "");
bool file_save(Window *focus, char *filename, const char *path = "", const char *filter = "");
uint screen_width();
uint screen_height();
unsigned screen_width();
unsigned screen_height();
void enable_screensaver();
void disable_screensaver();
@ -66,12 +66,12 @@ public:
HWND default_hwnd; //default parent window for all windowless controls
HFONT default_font; //default font for all controls
HBRUSH black_brush; //used for Canvas background
HFONT create_font(const char *name, uint size);
HFONT create_font(const char *name, unsigned size);
array<Widget*> widget_list;
Widget* get_widget(uint instance);
Widget* get_widget(unsigned instance);
LRESULT wndproc(HWND, UINT, WPARAM, LPARAM);
uint16_t translate_key(uint key);
uint16_t translate_key(unsigned key);
};
pHiro& phiro();

View File

@ -1,4 +1,4 @@
uint16_t pHiro::translate_key(uint key) {
uint16_t pHiro::translate_key(unsigned key) {
switch(key) {
case VK_ESCAPE: return keyboard::escape;

View File

@ -1,4 +1,4 @@
void pLabel::create(uint style, uint width, uint height, const char *text) {
void pLabel::create(unsigned style, unsigned width, unsigned height, const char *text) {
hwnd = CreateWindow(L"STATIC", utf16(text), WS_CHILD | WS_VISIBLE,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);

View File

@ -1,7 +1,7 @@
class pLabel : public pFormControl {
public:
Label &self;
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
pLabel(Label&);

View File

@ -1,4 +1,4 @@
void pListbox::create(uint style, uint width, uint height, const char *columns, const char *text) {
void pListbox::create(unsigned style, unsigned width, unsigned height, const char *columns, const char *text) {
bool header = style & Listbox::Header;
unsigned hscroll = (style & Listbox::HorizontalScrollAlways) ? WS_HSCROLL :
(style & Listbox::HorizontalScrollNever) ? 0 :
@ -41,7 +41,7 @@ void pListbox::autosize_columns() {
}
}
void pListbox::set_column_width(uint column, uint width) {
void pListbox::set_column_width(unsigned column, unsigned width) {
ListView_SetColumnWidth(hwnd, column, width);
}
@ -63,7 +63,7 @@ void pListbox::add_item(const char *text) {
}
}
void pListbox::set_item(uint index, const char *text) {
void pListbox::set_item(unsigned index, const char *text) {
lstring list;
split(list, "\t", text ? text : "");
for(unsigned i = 0; i < count(list); i++) {

View File

@ -1,11 +1,11 @@
class pListbox : public pFormControl {
public:
Listbox &self;
void create(uint style, uint width, uint height, const char *columns = "", const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *columns = "", const char *text = "");
void autosize_columns();
void set_column_width(uint column, uint width);
void set_column_width(unsigned column, unsigned width);
void add_item(const char *text);
void set_item(uint index, const char *text);
void set_item(unsigned index, const char *text);
int get_selection();
void set_selection(int index);
void reset();
@ -13,5 +13,5 @@ public:
pListbox(Listbox&);
/* internal */
uint column_count;
unsigned column_count;
};

View File

@ -6,7 +6,7 @@ void pMenuGroup::create(const char *text_) {
void pMenuGroup::attach(MenuControl &menucontrol) {
switch(menucontrol.type) {
case Widget::MenuGroupType: {
AppendMenu(group, MF_STRING | MF_POPUP, (uint)((MenuGroup&)menucontrol).p.group, utf16(menucontrol.p.text));
AppendMenu(group, MF_STRING | MF_POPUP, (unsigned)((MenuGroup&)menucontrol).p.group, utf16(menucontrol.p.text));
} break;
case Widget::MenuItemType:

View File

@ -5,7 +5,7 @@ void pMenuRadioItem::create(MenuRadioItemGroup &group_, const char *text_) {
}
void pMenuRadioItem::check() {
for(uint i = 0; i < group.size(); i++) {
for(unsigned i = 0; i < group.size(); i++) {
CheckMenuItem(parent, group[i]->p.instance, (group[i] == &self) ? MF_CHECKED : MF_UNCHECKED);
}
}

View File

@ -1,4 +1,4 @@
void pProgressbar::create(uint style, uint width, uint height) {
void pProgressbar::create(unsigned style, unsigned width, unsigned height) {
hwnd = CreateWindow(PROGRESS_CLASS, L"", WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
0, 0, width, height,
phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);
@ -6,12 +6,12 @@ void pProgressbar::create(uint style, uint width, uint height) {
SendMessage(hwnd, PBM_SETSTEP, MAKEWPARAM(1, 0), 0);
}
uint pProgressbar::get_progress() {
uint progress = SendMessage(hwnd, PBM_GETPOS, 0, 0);
unsigned pProgressbar::get_progress() {
unsigned progress = SendMessage(hwnd, PBM_GETPOS, 0, 0);
return max(0U, min(progress, 100U));
}
void pProgressbar::set_progress(uint progress) {
void pProgressbar::set_progress(unsigned progress) {
progress = max(0U, min(progress, 100U));
SendMessage(hwnd, PBM_SETPOS, (WPARAM)progress, 0);
}

View File

@ -1,9 +1,9 @@
class pProgressbar : public pFormControl {
public:
Progressbar &self;
void create(uint style, uint width, uint height);
uint get_progress();
void set_progress(uint progress);
void create(unsigned style, unsigned width, unsigned height);
unsigned get_progress();
void set_progress(unsigned progress);
pProgressbar(Progressbar&);
};

View File

@ -1,4 +1,4 @@
void pRadiobox::create(RadioboxGroup &group_, uint style, uint width, uint height, const char *text) {
void pRadiobox::create(RadioboxGroup &group_, unsigned style, unsigned width, unsigned height, const char *text) {
group = group_;
hwnd = CreateWindow(L"BUTTON", utf16(text), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_RADIOBUTTON,
0, 0, width, height, phiro().default_hwnd, (HMENU)instance, GetModuleHandle(0), 0);
@ -11,7 +11,7 @@ void pRadiobox::set_text(const char *text) {
}
void pRadiobox::check() {
for(uint i = 0; i < group.size(); i++) {
for(unsigned i = 0; i < group.size(); i++) {
SendMessage(group[i]->p.hwnd, BM_SETCHECK, (WPARAM)(group[i] == &self), 0);
}
}

View File

@ -1,6 +1,6 @@
class pRadiobox : public pFormControl {
public:
void create(RadioboxGroup &group, uint style, uint width, uint height, const char *text = "");
void create(RadioboxGroup &group, unsigned style, unsigned width, unsigned height, const char *text = "");
void set_text(const char *text = "");
void check();
bool checked();

View File

@ -1,4 +1,4 @@
void pSlider::create(uint style, uint width, uint height, uint length) {
void pSlider::create(unsigned style, unsigned width, unsigned height, unsigned length) {
if(length < 1) length = 1;
hwnd = CreateWindow(TRACKBAR_CLASS, L"",
@ -11,11 +11,11 @@ void pSlider::create(uint style, uint width, uint height, uint length) {
SendMessage(hwnd, TBM_SETPOS, (WPARAM)true, (LPARAM)0);
}
uint pSlider::get_position() {
unsigned pSlider::get_position() {
return SendMessage(hwnd, TBM_GETPOS, 0, 0);
}
void pSlider::set_position(uint position) {
void pSlider::set_position(unsigned position) {
SendMessage(hwnd, TBM_SETPOS, (WPARAM)true, (LPARAM)(slider_position = position));
}

View File

@ -1,12 +1,12 @@
class pSlider : public pFormControl {
public:
Slider &self;
void create(uint style, uint width, uint height, uint length);
uint get_position();
void set_position(uint position);
void create(unsigned style, unsigned width, unsigned height, unsigned length);
unsigned get_position();
void set_position(unsigned position);
pSlider(Slider&);
/* internal */
uint slider_position;
unsigned slider_position;
};

View File

@ -24,4 +24,4 @@ pWidget::~pWidget() {
//100 is the standard start index for control IDs in the Windows API
//avoids duplicate IDs when they are not explicitly set (and are thus 0)
uint pWidget::instance_counter = 100;
unsigned pWidget::instance_counter = 100;

View File

@ -14,6 +14,6 @@ public:
//Windows API controls often require a unique ID for each control to identify it.
//Simulate this with an instance counter, so that each Widget has a unique ID.
//In each pWidget() constructor, instance = instance_counter++; is called.
static uint instance_counter;
uint instance;
static unsigned instance_counter;
unsigned instance;
};

View File

@ -1,4 +1,4 @@
void pWindow::create(uint style, uint width_, uint height_, const char *text) {
void pWindow::create(unsigned style, unsigned width_, unsigned height_, const char *text) {
auto_center = style & Window::AutoCenter;
RECT rc;
@ -24,12 +24,12 @@ void pWindow::close() {
CloseWindow(hwnd);
}
void pWindow::move(uint x, uint y) {
void pWindow::move(unsigned x, unsigned y) {
if(is_fullscreen == true) return;
SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
void pWindow::resize(uint width_, uint height_) {
void pWindow::resize(unsigned width_, unsigned height_) {
int screen_width = GetSystemMetrics(SM_CXSCREEN);
int screen_height = GetSystemMetrics(SM_CYSCREEN);
@ -119,13 +119,13 @@ void pWindow::unfullscreen() {
resize(width, height);
}
uint pWindow::get_width() {
unsigned pWindow::get_width() {
RECT rc;
GetClientRect(hwnd, &rc);
return rc.right - rc.left;
}
uint pWindow::get_height() {
unsigned pWindow::get_height() {
RECT rc;
GetClientRect(hwnd, &rc);
if(status.visible() == false) return rc.bottom - rc.top;
@ -197,7 +197,7 @@ void pWindow::set_text(const char *text) {
SetWindowText(hwnd, utf16(text));
}
void pWindow::attach(Window &window, uint x, uint y) {
void pWindow::attach(Window &window, unsigned x, unsigned y) {
if(!window.p.hwnd) return;
//toplevel window size is larger, because it includes window borders
@ -214,11 +214,11 @@ void pWindow::attach(Window &window, uint x, uint y) {
}
void pWindow::attach(MenuGroup &menugroup) {
AppendMenu(hmenu, MF_STRING | MF_POPUP, (uint)menugroup.p.group, utf16(menugroup.p.text));
AppendMenu(hmenu, MF_STRING | MF_POPUP, (unsigned)menugroup.p.group, utf16(menugroup.p.text));
if(menu_visible() == false) menu_show();
}
void pWindow::attach(FormControl &formcontrol, uint x, uint y) {
void pWindow::attach(FormControl &formcontrol, unsigned x, unsigned y) {
SetWindowPos(formcontrol.p.hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
SetParent(formcontrol.p.hwnd, hwnd);
//SetParent() sets Z-order to topmost ...
@ -227,11 +227,11 @@ void pWindow::attach(FormControl &formcontrol, uint x, uint y) {
SetWindowPos(formcontrol.p.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
void pWindow::move(Window &window, uint x, uint y) {
void pWindow::move(Window &window, unsigned x, unsigned y) {
SetWindowPos(window.p.hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
void pWindow::move(FormControl &formcontrol, uint x, uint y) {
void pWindow::move(FormControl &formcontrol, unsigned x, unsigned y) {
SetWindowPos(formcontrol.p.hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}

View File

@ -1,24 +1,24 @@
class pWindow : public pWidget {
public:
void create(uint style, uint width, uint height, const char *text = "");
void create(unsigned style, unsigned width, unsigned height, const char *text = "");
void close();
void move(uint x, uint y);
void resize(uint width, uint height);
void move(unsigned x, unsigned y);
void resize(unsigned width, unsigned height);
void focus();
bool focused();
void fullscreen();
void unfullscreen();
uint get_width();
uint get_height();
unsigned get_width();
unsigned get_height();
void set_opacity(uint8_t opacity);
void set_background_color(uint8_t r, uint8_t g, uint8_t b);
void set_icon(unsigned width, unsigned height, const uint32_t *data);
void set_text(const char *text = "");
void attach(Window &window, uint x, uint y);
void attach(Window &window, unsigned x, unsigned y);
void attach(MenuGroup &menugroup);
void attach(FormControl &formcontrol, uint x, uint y);
void move(Window &window, uint x, uint y);
void move(FormControl &formcontrol, uint x, uint y);
void attach(FormControl &formcontrol, unsigned x, unsigned y);
void move(Window &window, unsigned x, unsigned y);
void move(FormControl &formcontrol, unsigned x, unsigned y);
class Statusbar {
public:
@ -55,7 +55,7 @@ public:
uint8_t opacity;
bool is_fullscreen;
bool auto_center;
uint width, height;
unsigned width, height;
uintptr_t handle();

View File

@ -37,9 +37,9 @@ public:
trim_once(part[0], "\"");
trim_once(part[1], "\"");
unsigned i = index_input.size();
index_input[i] = strdup(part[0]);
index_output[i] = strdup(part[1]);
unsigned n = index_input.size();
index_input[n] = strdup(part[0]);
index_output[n] = strdup(part[1]);
}
}

View File

@ -1,10 +1,10 @@
#ifndef NALL_FILE_HPP
#define NALL_FILE_HPP
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <nall/stdint.hpp>
#include <nall/utility.hpp>
namespace nall {

View File

@ -2,7 +2,7 @@
#define NALL_UPS_HPP
#include <stdio.h>
#include <stdint.h>
#include <nall/algorithm.hpp>
#include <nall/crc32.hpp>
#include <nall/new.hpp>

View File

@ -26,20 +26,31 @@ public:
} buffer;
struct {
bool synchronize;
unsigned frequency;
} settings;
bool cap(Audio::Setting setting) {
if(setting == Audio::Synchronize) return true;
if(setting == Audio::Frequency) return true;
return false;
}
uintptr_t get(Audio::Setting setting) {
if(setting == Audio::Synchronize) return settings.synchronize;
if(setting == Audio::Frequency) return settings.frequency;
return false;
}
bool set(Audio::Setting setting, uintptr_t param) {
if(setting == Audio::Synchronize) {
settings.synchronize = param;
if(device.handle) {
term();
init();
}
return true;
}
if(setting == Audio::Frequency) {
settings.frequency = param;
if(device.handle) {
@ -56,30 +67,49 @@ public:
buffer.data[buffer.length++] = left + (right << 16);
if(buffer.length < device.period_size) return;
if(settings.synchronize == false) {
snd_pcm_avail_update(device.handle);
snd_pcm_sframes_t delay;
snd_pcm_delay(device.handle, &delay);
if(delay < 0) {
snd_pcm_prepare(device.handle);
} else if(delay > device.buffer_size - device.period_size) {
buffer.length = 0;
return;
}
}
uint32_t *buffer_ptr = buffer.data;
do {
int i = 4;
while((buffer.length > 0) && i--) {
snd_pcm_sframes_t written = snd_pcm_writei(device.handle, buffer_ptr, buffer.length);
if(written < 0) {
//no samples written
snd_pcm_recover(device.handle, written, 1);
} else if(written < buffer.length) {
//only some samples written
} else if(written <= buffer.length) {
buffer.length -= written;
buffer_ptr += written;
} else {
//all samples written
buffer.length = 0;
}
} while(buffer.length > 0);
}
/*if(i < 0) {
if(buffer.data == buffer_ptr) {
buffer.length--;
buffer_ptr++;
}
memmove(buffer.data, buffer_ptr, buffer.length * sizeof(uint32_t));
}*/
}
bool init() {
if(snd_pcm_open(&device.handle, device.name, SND_PCM_STREAM_PLAYBACK, 0) < 0) {
//failed to initialize
term();
return false;
}
/* //below code will not work with 24khz mode (ALSA library bug)
if(snd_pcm_set_params(device.handle, device.format, SND_PCM_ACCESS_RW_INTERLEAVED,
device.channels, settings.frequency, 1, device.latency) < 0) {
//failed to set device parameters
@ -89,6 +119,57 @@ public:
if(snd_pcm_get_params(device.handle, &device.buffer_size, &device.period_size) < 0) {
device.period_size = device.latency * 1e-6 * settings.frequency / 4;
}*/
snd_pcm_hw_params_t *hwparams;
snd_pcm_sw_params_t *swparams;
unsigned rate = settings.frequency;
unsigned buffer_time = device.latency;
unsigned period_time = device.latency / 4;
snd_pcm_hw_params_alloca(&hwparams);
if(snd_pcm_hw_params_any(device.handle, hwparams) < 0) {
term();
return false;
}
if(snd_pcm_hw_params_set_access(device.handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0
|| snd_pcm_hw_params_set_format(device.handle, hwparams, device.format) < 0
|| snd_pcm_hw_params_set_channels(device.handle, hwparams, device.channels) < 0
|| snd_pcm_hw_params_set_rate_near(device.handle, hwparams, &rate, 0) < 0
|| snd_pcm_hw_params_set_period_time_near(device.handle, hwparams, &period_time, 0) < 0
|| snd_pcm_hw_params_set_buffer_time_near(device.handle, hwparams, &buffer_time, 0) < 0
) {
term();
return false;
}
if(snd_pcm_hw_params(device.handle, hwparams) < 0) {
term();
return false;
}
if(snd_pcm_get_params(device.handle, &device.buffer_size, &device.period_size) < 0) {
term();
return false;
}
snd_pcm_sw_params_alloca(&swparams);
if(snd_pcm_sw_params_current(device.handle, swparams) < 0) {
term();
return false;
}
if(snd_pcm_sw_params_set_start_threshold(device.handle, swparams,
(device.buffer_size / device.period_size) * device.period_size) < 0
) {
term();
return false;
}
if(snd_pcm_sw_params(device.handle, swparams) < 0) {
term();
return false;
}
buffer.data = new uint32_t[device.period_size];
@ -113,11 +194,12 @@ public:
device.format = SND_PCM_FORMAT_S16_LE;
device.channels = 2;
device.name = "default";
device.latency = 100000;
device.latency = 60000;
buffer.data = 0;
buffer.length = 0;
settings.synchronize = false;
settings.frequency = 22050;
}

View File

@ -1,5 +1,5 @@
/*
audio.alsa (2008-06-01)
audio.alsa (2008-08-12)
authors: Nach, RedDwarf
*/

View File

@ -7,34 +7,37 @@ namespace memory {
MMIOAccess mmio;
StaticRAM wram(128 * 1024);
StaticRAM apuram(64 * 1024);
StaticRAM vram(64 * 1024);
StaticRAM oam(544);
StaticRAM cgram(512);
UnmappedMemory memory_unmapped;
UnmappedMMIO mmio_unmapped;
};
uint8 UnmappedMemory::read(uint) { return cpu.regs.mdr; }
void UnmappedMemory::write(uint, uint8) {}
uint8 UnmappedMemory::read(unsigned) { return cpu.regs.mdr; }
void UnmappedMemory::write(unsigned, uint8) {}
uint8 UnmappedMMIO::mmio_read(uint) { return cpu.regs.mdr; }
void UnmappedMMIO::mmio_write(uint, uint8) {}
uint8 UnmappedMMIO::mmio_read(unsigned) { return cpu.regs.mdr; }
void UnmappedMMIO::mmio_write(unsigned, uint8) {}
void MMIOAccess::map(uint addr, MMIO &access) {
void MMIOAccess::map(unsigned addr, MMIO &access) {
//MMIO: $[00-3f]:[2000-5fff]
mmio[(addr - 0x2000) & 0x3fff] = &access;
}
uint8 MMIOAccess::read(uint addr) {
uint8 MMIOAccess::read(unsigned addr) {
return mmio[(addr - 0x2000) & 0x3fff]->mmio_read(addr);
}
void MMIOAccess::write(uint addr, uint8 data) {
void MMIOAccess::write(unsigned addr, uint8 data) {
mmio[(addr - 0x2000) & 0x3fff]->mmio_write(addr, data);
}
uint Bus::mirror(uint addr, uint size) {
uint base = 0;
unsigned Bus::mirror(unsigned addr, unsigned size) {
unsigned base = 0;
if(size) {
uint mask = 1 << 23;
unsigned mask = 1 << 23;
while(addr >= size) {
while(!(addr & mask)) mask >>= 1;
addr -= mask;
@ -49,7 +52,7 @@ uint Bus::mirror(uint addr, uint size) {
return base;
}
void Bus::map(uint addr, Memory &access, uint offset) {
void Bus::map(unsigned addr, Memory &access, unsigned offset) {
page[addr >> 8].access = &access;
page[addr >> 8].offset = offset - addr;
}
@ -58,7 +61,7 @@ void Bus::map(
MapMode mode,
uint8 bank_lo, uint8 bank_hi,
uint16 addr_lo, uint16 addr_hi,
Memory &access, uint offset, uint size
Memory &access, unsigned offset, unsigned size
) {
assert(bank_lo <= bank_hi);
assert(addr_lo <= addr_hi);
@ -67,20 +70,20 @@ void Bus::map(
uint8 page_lo = addr_lo >> 8;
uint8 page_hi = addr_hi >> 8;
uint index = 0;
unsigned index = 0;
switch(mode) {
case MapDirect: {
for(uint bank = bank_lo; bank <= bank_hi; bank++) {
for(uint page = page_lo; page <= page_hi; page++) {
for(unsigned bank = bank_lo; bank <= bank_hi; bank++) {
for(unsigned page = page_lo; page <= page_hi; page++) {
map((bank << 16) + (page << 8), access, (bank << 16) + (page << 8));
}
}
} break;
case MapLinear: {
for(uint bank = bank_lo; bank <= bank_hi; bank++) {
for(uint page = page_lo; page <= page_hi; page++) {
for(unsigned bank = bank_lo; bank <= bank_hi; bank++) {
for(unsigned page = page_lo; page <= page_hi; page++) {
map((bank << 16) + (page << 8), access, mirror(offset + index, access.size()));
index += 256;
if(size) index %= size;
@ -89,11 +92,11 @@ void Bus::map(
} break;
case MapShadow: {
for(uint bank = bank_lo; bank <= bank_hi; bank++) {
for(unsigned bank = bank_lo; bank <= bank_hi; bank++) {
index += page_lo * 256;
if(size) index %= size;
for(uint page = page_lo; page <= page_hi; page++) {
for(unsigned page = page_lo; page <= page_hi; page++) {
map((bank << 16) + (page << 8), access, mirror(offset + index, access.size()));
index += 256;
if(size) index %= size;

View File

@ -1,81 +1,86 @@
struct Memory {
virtual uint size() { return 0; }
virtual uint8 read(uint addr) = 0;
virtual void write(uint addr, uint8 data) = 0;
virtual unsigned size() { return 0; }
virtual uint8 read(unsigned addr) = 0;
virtual void write(unsigned addr, uint8 data) = 0;
//deprecated, still used by S-CPU, S-SMP disassemblers
enum { WRAP_NONE = 0, WRAP_BANK = 1, WRAP_PAGE = 2 };
virtual uint16 read_word(uint addr, uint wrap = WRAP_NONE);
virtual void write_word(uint addr, uint16 data, uint wrap = WRAP_NONE);
virtual uint32 read_long(uint addr, uint wrap = WRAP_NONE);
virtual void write_long(uint addr, uint32 data, uint wrap = WRAP_NONE);
virtual uint16 read_word(unsigned addr, unsigned wrap = WRAP_NONE);
virtual void write_word(unsigned addr, uint16 data, unsigned wrap = WRAP_NONE);
virtual uint32 read_long(unsigned addr, unsigned wrap = WRAP_NONE);
virtual void write_long(unsigned addr, uint32 data, unsigned wrap = WRAP_NONE);
};
struct MMIO {
virtual uint8 mmio_read(uint addr) = 0;
virtual void mmio_write(uint addr, uint8 data) = 0;
virtual uint8 mmio_read(unsigned addr) = 0;
virtual void mmio_write(unsigned addr, uint8 data) = 0;
};
struct UnmappedMemory : Memory {
uint8 read(uint);
void write(uint, uint8);
uint8 read(unsigned);
void write(unsigned, uint8);
};
struct UnmappedMMIO : MMIO {
uint8 mmio_read(uint);
void mmio_write(uint, uint8);
uint8 mmio_read(unsigned);
void mmio_write(unsigned, uint8);
};
struct StaticRAM : Memory {
uint8* handle() { return data; }
unsigned size() { return datasize; }
inline uint8 read(unsigned addr) { return data[addr]; }
inline void write(unsigned addr, uint8 n) { data[addr] = n; }
inline uint8& operator[](unsigned addr) { return data[addr]; }
inline const uint8& operator[](unsigned addr) const { return data[addr]; }
StaticRAM(unsigned n) : datasize(n) { data = new uint8[datasize]; }
~StaticRAM() { delete[] data; }
private:
uint8 *data;
uint data_size;
uint size() { return data_size; }
uint8 read(uint addr) { return data[addr]; }
void write(uint addr, uint8 n) { data[addr] = n; }
StaticRAM(uint n) : data_size(n) { data = (uint8*)malloc(data_size); }
~StaticRAM() { free(data); }
unsigned datasize;
};
struct MappedRAM : Memory {
uint8 *data;
uint data_size;
bool write_protection;
void map(uint8 *source, uint length) { data = source; data_size = length > 0 ? length : -1U; }
void map(uint8 *source, unsigned length) { data = source; datasize = length > 0 ? length : -1U; }
void write_protect(bool status) { write_protection = status; }
uint8* handle() { return data; }
uint size() { return data_size; }
uint8 read(uint addr) { return data[addr]; }
void write(uint addr, uint8 n) { if(!write_protection) data[addr] = n; }
unsigned size() { return datasize; }
MappedRAM() : data(0), data_size(0), write_protection(false) {}
inline uint8 read(unsigned addr) { return data[addr]; }
inline void write(unsigned addr, uint8 n) { if(!write_protection) data[addr] = n; }
inline const uint8& operator[](unsigned addr) const { return data[addr]; }
MappedRAM() : data(0), datasize(0), write_protection(false) {}
private:
uint8 *data;
unsigned datasize;
bool write_protection;
};
struct MMIOAccess : Memory {
MMIO *mmio[0x4000];
void map(unsigned addr, MMIO &access);
uint8 read(unsigned addr);
void write(unsigned addr, uint8 data);
void map(uint addr, MMIO &access);
uint8 read(uint addr);
void write(uint addr, uint8 data);
private:
MMIO *mmio[0x4000];
};
class Bus { public:
struct Page {
Memory *access;
uint offset;
} page[65536];
uint fastSpeed;
uint mirror(uint addr, uint size);
void map(uint addr, Memory &access, uint offset);
class Bus {
public:
unsigned mirror(unsigned addr, unsigned size);
void map(unsigned addr, Memory &access, unsigned offset);
enum MapMode { MapDirect, MapLinear, MapShadow };
void map(MapMode mode,
uint8 bank_lo, uint8 bank_hi,
uint16 addr_lo, uint16 addr_hi,
Memory &access, uint offset = 0, uint size = 0);
Memory &access, unsigned offset = 0, unsigned size = 0);
alwaysinline uint8 read(uint addr) {
alwaysinline uint8 read(unsigned addr) {
#if defined(CHEAT_SYSTEM)
if(cheat.enabled() && cheat.exists(addr)) {
uint8 r;
@ -87,19 +92,22 @@ class Bus { public:
return p.access->read(p.offset + addr);
}
alwaysinline void write(uint addr, uint8 data) {
alwaysinline void write(unsigned addr, uint8 data) {
Page &p = page[addr >> 8];
return p.access->write(p.offset + addr, data);
}
void set_speed(bool fast) { fastSpeed = fast ? 6 : 8; }
alwaysinline uint speed(uint addr) {
void set_speed(bool fast) {
fastSpeed = fast ? 6 : 8;
}
alwaysinline unsigned speed(unsigned addr) const {
if(addr & 0x408000) {
if(addr & 0x800000) { return fastSpeed; }
if(addr & 0x800000) return fastSpeed;
return 8;
}
if((addr + 0x6000) & 0x4000) { return 8; }
if((addr - 0x4000) & 0x7e00) { return 6; }
if((addr + 0x6000) & 0x4000) return 8;
if((addr - 0x4000) & 0x7e00) return 6;
return 12;
}
@ -112,12 +120,22 @@ class Bus { public:
Bus() {}
virtual ~Bus() {}
protected:
struct Page {
Memory *access;
unsigned offset;
} page[65536];
unsigned fastSpeed;
};
namespace memory {
extern MMIOAccess mmio; //S-CPU, S-PPU
extern StaticRAM wram; //S-CPU
extern StaticRAM apuram; //S-SMP, S-DSP
extern StaticRAM vram; //S-PPU
extern StaticRAM oam; //S-PPU
extern StaticRAM cgram; //S-PPU
extern UnmappedMemory memory_unmapped;
extern UnmappedMMIO mmio_unmapped;

View File

@ -1,6 +1,6 @@
#ifdef MEMORY_CPP
uint16 Memory::read_word(uint addr, uint wrap) {
uint16 Memory::read_word(unsigned addr, unsigned wrap) {
uint16 r;
switch(wrap) {
case WRAP_NONE: {
@ -19,7 +19,7 @@ uint16 Memory::read_word(uint addr, uint wrap) {
return r;
}
void Memory::write_word(uint addr, uint16 data, uint wrap) {
void Memory::write_word(unsigned addr, uint16 data, unsigned wrap) {
switch(wrap) {
case WRAP_NONE: {
write(addr, data);
@ -36,7 +36,7 @@ void Memory::write_word(uint addr, uint16 data, uint wrap) {
}
}
uint32 Memory::read_long(uint addr, uint wrap) {
uint32 Memory::read_long(unsigned addr, unsigned wrap) {
uint32 r;
switch(wrap) {
case WRAP_NONE: {
@ -58,7 +58,7 @@ uint32 Memory::read_long(uint addr, uint wrap) {
return r;
}
void Memory::write_long(uint addr, uint32 data, uint wrap) {
void Memory::write_long(unsigned addr, uint32 data, unsigned wrap) {
switch(wrap) {
case WRAP_NONE: {
write(addr, data);

View File

@ -6,8 +6,8 @@
#include "mapper/chip.cpp"
void sBus::power() {
for(uint i = 0x2000; i <= 0x5fff; i++) memory::mmio.map(i, memory::mmio_unmapped);
memset(memory::wram.data, config::cpu.wram_init_value, memory::wram.size());
for(unsigned i = 0x2000; i <= 0x5fff; i++) memory::mmio.map(i, memory::mmio_unmapped);
for(unsigned i = 0; i < memory::wram.size(); i++) memory::wram[i] = config::cpu.wram_init_value;
reset();
}

View File

@ -69,9 +69,9 @@ void bPPU::frame() {
void bPPU::power() {
PPU::power();
memset(vram, 0, 65536);
memset(oam, 0, 544);
memset(cgram, 0, 512);
for(unsigned i = 0; i < memory::vram.size(); i++) memory::vram[i] = 0x00;
for(unsigned i = 0; i < memory::oam.size(); i++) memory::oam[i] = 0x00;
for(unsigned i = 0; i < memory::cgram.size(); i++) memory::cgram[i] = 0x00;
region = snes.region();
@ -298,42 +298,7 @@ void bPPU::reset() {
clear_tiledata_cache();
}
uint8 bPPU::vram_read(uint16 addr) {
return vram[addr];
}
void bPPU::vram_write(uint16 addr, uint8 value) {
vram[addr] = value;
}
uint8 bPPU::oam_read(uint16 addr) {
if(addr >= 0x0200) { addr = 0x0200 | (addr & 31); }
return oam[addr];
}
void bPPU::oam_write(uint16 addr, uint8 value) {
if(addr >= 0x0200) { addr = 0x0200 | (addr & 31); }
oam[addr] = value;
}
uint8 bPPU::cgram_read(uint16 addr) {
addr &= 511;
uint8 r = cgram[addr];
if(addr & 1) { r &= 0x7f; }
return r;
}
void bPPU::cgram_write(uint16 addr, uint8 value) {
addr &= 511;
if(addr & 1) { value &= 0x7f; }
cgram[addr] = value;
}
bPPU::bPPU() {
vram = new(zeromemory) uint8_t[65536];
oam = new(zeromemory) uint8_t[ 544];
cgram = new(zeromemory) uint8_t[ 512];
init_tiledata_cache();
for(int l = 0; l < 16; l++) {
@ -356,7 +321,4 @@ bPPU::bPPU() {
}
bPPU::~bPPU() {
delete[] vram;
delete[] oam;
delete[] cgram;
}

View File

@ -1,6 +1,5 @@
class bPPU : public PPU {
public:
uint8 *vram, *oam, *cgram;
uint8 region;
enum { NTSC = 0, PAL = 1 };
@ -150,13 +149,6 @@ public:
alwaysinline bool overscan() { return display.overscan; }
alwaysinline bool hires() { return (regs.pseudo_hires || regs.bg_mode == 5 || regs.bg_mode == 6); }
uint8 vram_read (uint16 addr);
void vram_write (uint16 addr, uint8 value);
uint8 oam_read (uint16 addr);
void oam_write (uint16 addr, uint8 value);
uint8 cgram_read (uint16 addr);
void cgram_write(uint16 addr, uint8 value);
uint16 get_vram_address();
uint8 vram_mmio_read (uint16 addr);
void vram_mmio_write (uint16 addr, uint8 data);
@ -252,14 +244,6 @@ public:
void power();
void reset();
inline uint16 read16(uint8 *addr, uint pos) {
#if defined(ARCH_LSB)
return *((uint16*)(addr + pos));
#else
return (addr[pos]) | (addr[pos + 1] << 8);
#endif
}
bPPU();
~bPPU();
};

View File

@ -23,37 +23,60 @@ uint16 bPPU::get_vram_address() {
//write occurs during the very last clock cycle of vblank.
uint8 bPPU::vram_mmio_read(uint16 addr) {
if(regs.display_disabled == true) return vram_read(addr);
uint8 data;
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
uint16 ls = ((snes.region() == SNES::NTSC ? 525 : 625) >> 1) - 1;
if(interlace() && !field()) ls++;
if(v == ls && h == 1362) return 0x00;
if(v < (!overscan() ? 224 : 239)) return 0x00;
if(v == (!overscan() ? 224 : 239)) {
if(h == 1362) return vram_read(addr);
return 0x00;
if(regs.display_disabled == true) {
data = memory::vram[addr];
} else {
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
uint16 ls = ((snes.region() == SNES::NTSC ? 525 : 625) >> 1) - 1;
if(interlace() && !field()) ls++;
if(v == ls && h == 1362) {
data = 0x00;
} else if(v < (!overscan() ? 224 : 239)) {
data = 0x00;
} else if(v == (!overscan() ? 224 : 239)) {
if(h == 1362) {
data = memory::vram[addr];
} else {
data = 0x00;
}
} else {
data = memory::vram[addr];
}
}
return vram_read(addr);
return data;
}
void bPPU::vram_mmio_write(uint16 addr, uint8 data) {
if(regs.display_disabled == true) return vram_write(addr, data);
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v == 0) {
if(h <= 4) return vram_write(addr, data);
if(h == 6) return vram_write(addr, cpu.regs.mdr);
return;
if(regs.display_disabled == true) {
memory::vram[addr] = data;
} else {
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v == 0) {
if(h <= 4) {
memory::vram[addr] = data;
} else if(h == 6) {
memory::vram[addr] = cpu.regs.mdr;
} else {
//no write
}
} else if(v < (!overscan() ? 225 : 240)) {
//no write
} else if(v == (!overscan() ? 225 : 240)) {
if(h <= 4) {
//no write
} else {
memory::vram[addr] = data;
}
} else {
memory::vram[addr] = data;
}
}
if(v < (!overscan() ? 225 : 240)) return;
if(v == (!overscan() ? 225 : 240)) {
if(h <= 4) return;
return vram_write(addr, data);
}
vram_write(addr, data);
}
//NOTE: OAM accesses during active display are rerouted to 0x0218 ... this can be considered
@ -72,23 +95,36 @@ void bPPU::vram_mmio_write(uint16 addr, uint8 data) {
//or by changing the address from 0x0218 to 0x0000 below if it bothers you that greatly.
uint8 bPPU::oam_mmio_read(uint16 addr) {
addr &= 0x03ff;
if(addr & 0x0200) addr &= 0x021f;
uint8 data;
if(config::ppu.hack.oam_address_invalidation == false || regs.display_disabled == true) {
return oam_read(addr);
data = memory::oam[addr];
} else {
if(cpu.vcounter() < (!overscan() ? 225 : 240)) {
data = memory::oam[0x0218];
} else {
data = memory::oam[addr];
}
}
uint16 v = cpu.vcounter();
if(v < (!overscan() ? 225 : 240)) return oam_read(0x0218);
return oam_read(addr);
return data;
}
void bPPU::oam_mmio_write(uint16 addr, uint8 data) {
if(config::ppu.hack.oam_address_invalidation == false || regs.display_disabled == true) {
return oam_write(addr, data);
}
addr &= 0x03ff;
if(addr & 0x0200) addr &= 0x021f;
uint16 v = cpu.vcounter();
if(v < (!overscan() ? 225 : 240)) return oam_write(0x0218, data);
oam_write(addr, data);
if(config::ppu.hack.oam_address_invalidation == false || regs.display_disabled == true) {
memory::oam[addr] = data;
} else {
if(cpu.vcounter() < (!overscan() ? 225 : 240)) {
memory::oam[0x0218] = data;
} else {
memory::oam[addr] = data;
}
}
}
//NOTE: CGRAM writes during hblank are valid. During active display, the actual address the
@ -98,29 +134,40 @@ void bPPU::oam_mmio_write(uint16 addr, uint8 data) {
//about this address, it is simply more accurate to invalidate the 'expected' address than not.
uint8 bPPU::cgram_mmio_read(uint16 addr) {
addr &= 0x01ff;
uint8 data;
if(config::ppu.hack.cgram_address_invalidation == false || regs.display_disabled == true) {
return cgram_read(addr);
data = memory::cgram[addr];
} else {
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v < (!overscan() ? 225 : 240) && h >= 72 && h < 1096) {
data = memory::cgram[0x01ff] & 0x7f;
} else {
data = memory::cgram[addr];
}
}
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v < (!overscan() ? 225 : 240) && h >= 72 && h < 1096) {
return cgram_read(0x01ff);
}
return cgram_read(addr);
if(addr & 1) data &= 0x7f;
return data;
}
void bPPU::cgram_mmio_write(uint16 addr, uint8 data) {
if(config::ppu.hack.cgram_address_invalidation == false || regs.display_disabled == true) {
return cgram_write(addr, data);
}
addr &= 0x01ff;
if(addr & 1) data &= 0x7f;
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v < (!overscan() ? 225 : 240) && h >= 72 && h < 1096) {
return cgram_write(0x01ff, data);
if(config::ppu.hack.cgram_address_invalidation == false || regs.display_disabled == true) {
memory::cgram[addr] = data;
} else {
uint16 v = cpu.vcounter();
uint16 h = cpu.hcounter();
if(v < (!overscan() ? 225 : 240) && h >= 72 && h < 1096) {
memory::cgram[0x01ff] = data & 0x7f;
} else {
memory::cgram[addr] = data;
}
}
cgram_write(addr, data);
}
//INIDISP

View File

@ -31,7 +31,7 @@ uint16 bPPU::bg_get_tile(uint8 bg, uint16 x, uint16 y) {
if(x & 0x20) pos += bg_info[bg].scx;
uint16 addr = regs.bg_scaddr[bg] + (pos << 1);
return (vram_read(addr + 0) << 0) | (vram_read(addr + 1) << 8);
return memory::vram[addr] + (memory::vram[addr + 1] << 8);
}
#define setpixel_main(x) \

View File

@ -34,8 +34,8 @@ uint8 *dest;
pos = tile_num * 16;
y = 8;
while(y--) {
d0 = vram[pos ];
d1 = vram[pos + 1];
d0 = memory::vram[pos ];
d1 = memory::vram[pos + 1];
render_bg_tile_line_2bpp(0x80);
render_bg_tile_line_2bpp(0x40);
render_bg_tile_line_2bpp(0x20);
@ -53,10 +53,10 @@ uint8 *dest;
pos = tile_num * 32;
y = 8;
while(y--) {
d0 = vram[pos ];
d1 = vram[pos + 1];
d2 = vram[pos + 16];
d3 = vram[pos + 17];
d0 = memory::vram[pos ];
d1 = memory::vram[pos + 1];
d2 = memory::vram[pos + 16];
d3 = memory::vram[pos + 17];
render_bg_tile_line_4bpp(0x80);
render_bg_tile_line_4bpp(0x40);
render_bg_tile_line_4bpp(0x20);
@ -74,14 +74,14 @@ uint8 *dest;
pos = tile_num * 64;
y = 8;
while(y--) {
d0 = vram[pos ];
d1 = vram[pos + 1];
d2 = vram[pos + 16];
d3 = vram[pos + 17];
d4 = vram[pos + 32];
d5 = vram[pos + 33];
d6 = vram[pos + 48];
d7 = vram[pos + 49];
d0 = memory::vram[pos ];
d1 = memory::vram[pos + 1];
d2 = memory::vram[pos + 16];
d3 = memory::vram[pos + 17];
d4 = memory::vram[pos + 32];
d5 = memory::vram[pos + 33];
d6 = memory::vram[pos + 48];
d7 = memory::vram[pos + 49];
render_bg_tile_line_8bpp(0x80);
render_bg_tile_line_8bpp(0x40);
render_bg_tile_line_8bpp(0x20);

View File

@ -1,7 +1,8 @@
#ifdef BPPU_CPP
inline uint16 bPPU::get_palette(uint8 index) {
return read16(cgram, index << 1);
unsigned addr = index << 1;
return memory::cgram[addr] + (memory::cgram[addr + 1] << 8);
}
inline uint16 bPPU::get_direct_color(uint8 p, uint8 t) {

View File

@ -76,8 +76,8 @@ void bPPU::render_line_mode7(uint8 bg, uint8 pri0_pos, uint8 pri1_pos) {
py &= 1023;
tx = ((px >> 3) & 127);
ty = ((py >> 3) & 127);
tile = vram[(ty * 128 + tx) << 1];
palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
tile = memory::vram[(ty * 128 + tx) << 1];
palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
} break;
case 2: { //palette color 0 outside of screen area
if(px < 0 || px > 1023 || py < 0 || py > 1023) {
@ -87,8 +87,8 @@ void bPPU::render_line_mode7(uint8 bg, uint8 pri0_pos, uint8 pri1_pos) {
py &= 1023;
tx = ((px >> 3) & 127);
ty = ((py >> 3) & 127);
tile = vram[(ty * 128 + tx) << 1];
palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
tile = memory::vram[(ty * 128 + tx) << 1];
palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
}
} break;
case 3: { //character 0 repetition outside of screen area
@ -99,9 +99,9 @@ void bPPU::render_line_mode7(uint8 bg, uint8 pri0_pos, uint8 pri1_pos) {
py &= 1023;
tx = ((px >> 3) & 127);
ty = ((py >> 3) & 127);
tile = vram[(ty * 128 + tx) << 1];
tile = memory::vram[(ty * 128 + tx) << 1];
}
palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
} break;
}

View File

@ -1,41 +1,41 @@
#ifdef BPPU_CPP
void bPPU::build_sprite_list() {
uint8 *tableA = oam, *tableB = oam + 512;
uint8 y_offset = (config::ppu.hack.obj_cache == true) ? 0 : 1;
uint8 *tableA = memory::oam.handle(), *tableB = memory::oam.handle() + 512;
uint8 y_offset = (config::ppu.hack.obj_cache == true) ? 0 : 1;
for(int i = 0; i < 128; i++) {
uint x = !!(*tableB & (1 << ((i & 3) << 1))); //0x01, 0x04, 0x10, 0x40
bool size = !!(*tableB & (2 << ((i & 3) << 1))); //0x02, 0x08, 0x20, 0x80
for(unsigned i = 0; i < 128; i++) {
unsigned x = !!(*tableB & (1 << ((i & 3) << 1))); //0x01, 0x04, 0x10, 0x40
bool size = !!(*tableB & (2 << ((i & 3) << 1))); //0x02, 0x08, 0x20, 0x80
switch(regs.oam_basesize) {
case 0: sprite_list[i].width = (!size) ? 8 : 16;
sprite_list[i].height = (!size) ? 8 : 16;
break;
case 1: sprite_list[i].width = (!size) ? 8 : 32;
sprite_list[i].height = (!size) ? 8 : 32;
break;
case 2: sprite_list[i].width = (!size) ? 8 : 64;
sprite_list[i].height = (!size) ? 8 : 64;
break;
case 3: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 16 : 32;
break;
case 4: sprite_list[i].width = (!size) ? 16 : 64;
sprite_list[i].height = (!size) ? 16 : 64;
break;
case 5: sprite_list[i].width = (!size) ? 32 : 64;
sprite_list[i].height = (!size) ? 32 : 64;
break;
case 6: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 32 : 64;
if(regs.oam_interlace && !size)sprite_list[i].height = 16;
//32x64 height is not affected by oam_interlace setting
break;
case 7: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 32 : 32;
if(regs.oam_interlace && !size)sprite_list[i].height = 16;
break;
case 0: sprite_list[i].width = (!size) ? 8 : 16;
sprite_list[i].height = (!size) ? 8 : 16;
break;
case 1: sprite_list[i].width = (!size) ? 8 : 32;
sprite_list[i].height = (!size) ? 8 : 32;
break;
case 2: sprite_list[i].width = (!size) ? 8 : 64;
sprite_list[i].height = (!size) ? 8 : 64;
break;
case 3: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 16 : 32;
break;
case 4: sprite_list[i].width = (!size) ? 16 : 64;
sprite_list[i].height = (!size) ? 16 : 64;
break;
case 5: sprite_list[i].width = (!size) ? 32 : 64;
sprite_list[i].height = (!size) ? 32 : 64;
break;
case 6: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 32 : 64;
if(regs.oam_interlace && !size)sprite_list[i].height = 16;
//32x64 height is not affected by oam_interlace setting
break;
case 7: sprite_list[i].width = (!size) ? 16 : 32;
sprite_list[i].height = (!size) ? 32 : 32;
if(regs.oam_interlace && !size)sprite_list[i].height = 16;
break;
}
sprite_list[i].x = (x << 8) + tableA[0];

View File

@ -21,15 +21,15 @@ void PPU::frame() {
prev = curr;
}
void PPU::power() {}
void PPU::power() {
}
void PPU::reset() {
memset(output, 0, 512 * 480 * sizeof(uint16));
}
PPU::PPU() {
output = (uint16*)malloc(512 * 480 * sizeof(uint16));
memset(output, 0, 512 * 480 * sizeof(uint16));
output = new(zeromemory) uint16[512 * 480];
status.render_output = true;
status.frames_updated = false;
@ -41,5 +41,5 @@ PPU::PPU() {
}
PPU::~PPU() {
free(output);
delete[] output;
}

View File

@ -28,22 +28,15 @@ public:
virtual bool overscan() = 0;
virtual bool hires() = 0;
virtual uint8 vram_read (uint16 addr) = 0;
virtual void vram_write (uint16 addr, uint8 value) = 0;
virtual uint8 oam_read (uint16 addr) = 0;
virtual void oam_write (uint16 addr, uint8 value) = 0;
virtual uint8 cgram_read (uint16 addr) = 0;
virtual void cgram_write(uint16 addr, uint8 value) = 0;
virtual void latch_counters() = 0;
virtual void latch_counters() = 0;
virtual void render_scanline() = 0;
virtual void scanline() = 0;
virtual void frame();
virtual void power();
virtual void reset();
virtual void enable_renderer(bool r);
virtual bool renderer_enabled();
virtual void render_scanline() = 0;
virtual void scanline() = 0;
virtual void frame();
virtual void power();
virtual void reset();
virtual void enable_renderer(bool r);
virtual bool renderer_enabled();
PPU();
virtual ~PPU();

View File

@ -2,27 +2,27 @@
alwaysinline
uint8 sSMP::ram_read(uint16 addr) {
if(addr < 0xffc0) return memory::apuram.read(addr);
if(status.iplrom_enabled == false) return memory::apuram.read(addr);
if(addr < 0xffc0) return memory::apuram[addr];
if(status.iplrom_enabled == false) return memory::apuram[addr];
return iplrom[addr & 0x3f];
}
alwaysinline
void sSMP::ram_write(uint16 addr, uint8 data) {
//writes to $ffc0-$ffff always go to spcram, even if the iplrom is enabled
memory::apuram.write(addr, data);
memory::apuram[addr] = data;
}
//
alwaysinline
uint8 sSMP::port_read(uint8 port) {
return memory::apuram.read(0xf4 + (port & 3));
return memory::apuram[0xf4 + (port & 3)];
}
alwaysinline
void sSMP::port_write(uint8 port, uint8 data) {
memory::apuram.write(0xf4 + (port & 3), data);
memory::apuram[0xf4 + (port & 3)] = data;
}
//

Some files were not shown because too many files have changed in this diff Show More