From 4c8781c762552fb2af97998f3e122060e1de8bfa Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 9 Sep 2018 17:17:38 -0400 Subject: [PATCH 1/4] Increases documentation slightly. --- Outputs/CRT/Internals/Shaders/IntermediateShader.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp b/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp index b191bdcf2..ab886f269 100644 --- a/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp +++ b/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp @@ -240,10 +240,14 @@ std::unique_ptr IntermediateShader::make_chroma_luma_separat "texture(texID, inputPositionsVarying[5]).r," "texture(texID, inputPositionsVarying[6]).r" ");" + // calculate luminance as either the straight average of the samples, if a colour subcarrier + // was present, or else a weighted sample around the third sample if not. "float luminance = mix(dot(samples, vec4(0.25)), dot(samples, vec4(0.0, 0.16, 0.66, 0.16)), step(phaseAndAmplitudeVarying.z, 0.0));" // define chroma to be whatever was here, minus luma "float chrominance = 0.5 * (samples.z - luminance) * phaseAndAmplitudeVarying.z;" + + // scale luminance up to the range [0, 1) "luminance /= (1.0 - abs(phaseAndAmplitudeVarying.y));" // split choma colours here, as the most direct place, writing out From c73445199c2612b4ace018e7fa306c20fdd367d5 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 9 Sep 2018 20:29:58 -0400 Subject: [PATCH 2/4] Eliminates a couple of instances of manual memory management. --- Outputs/CRT/Internals/Shaders/Shader.cpp | 11 +++++------ Storage/FileHolder.cpp | 6 ++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Outputs/CRT/Internals/Shaders/Shader.cpp b/Outputs/CRT/Internals/Shaders/Shader.cpp index ec53172e8..a82b7705d 100644 --- a/Outputs/CRT/Internals/Shaders/Shader.cpp +++ b/Outputs/CRT/Internals/Shaders/Shader.cpp @@ -239,17 +239,16 @@ void Shader::set_uniform_matrix(const std::string &name, GLint size, bool transp void Shader::set_uniform_matrix(const std::string &name, GLint size, GLsizei count, bool transpose, const GLfloat *values) { std::size_t number_of_values = static_cast(count) * static_cast(size) * static_cast(size); - GLfloat *values_copy = new GLfloat[number_of_values]; - std::memcpy(values_copy, values, sizeof(*values) * number_of_values); + std::vector values_copy(number_of_values); + std::memcpy(values_copy.data(), values, sizeof(*values) * number_of_values); enqueue_function([name, size, count, transpose, values_copy, this] { GLboolean glTranspose = transpose ? GL_TRUE : GL_FALSE; switch(size) { - case 2: glUniformMatrix2fv(location(), count, glTranspose, values_copy); break; - case 3: glUniformMatrix3fv(location(), count, glTranspose, values_copy); break; - case 4: glUniformMatrix4fv(location(), count, glTranspose, values_copy); break; + case 2: glUniformMatrix2fv(location(), count, glTranspose, values_copy.data()); break; + case 3: glUniformMatrix3fv(location(), count, glTranspose, values_copy.data()); break; + case 4: glUniformMatrix4fv(location(), count, glTranspose, values_copy.data()); break; } - delete[] values_copy; }); } diff --git a/Storage/FileHolder.cpp b/Storage/FileHolder.cpp index 38b47243e..dbba21d97 100644 --- a/Storage/FileHolder.cpp +++ b/Storage/FileHolder.cpp @@ -173,10 +173,8 @@ void FileHolder::ensure_is_at_least_length(long length) { std::fseek(file_, 0, SEEK_END); long bytes_to_write = length - ftell(file_); if(bytes_to_write > 0) { - uint8_t *empty = new uint8_t[static_cast(bytes_to_write)]; - std::memset(empty, 0, static_cast(bytes_to_write)); - std::fwrite(empty, sizeof(uint8_t), static_cast(bytes_to_write), file_); - delete[] empty; + std::vector empty(static_cast(bytes_to_write), 0); + std::fwrite(empty.data(), sizeof(uint8_t), static_cast(bytes_to_write), file_); } } From 6e9cd5cb214e320c79367d70992de6d959fbb6da Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 9 Sep 2018 20:30:43 -0400 Subject: [PATCH 3/4] Resolves over-brightness created by over-composition. --- Machines/AppleII/Video.cpp | 2 +- Outputs/CRT/Internals/Shaders/OutputShader.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Machines/AppleII/Video.cpp b/Machines/AppleII/Video.cpp index f1cd5f4b1..11051188d 100644 --- a/Machines/AppleII/Video.cpp +++ b/Machines/AppleII/Video.cpp @@ -20,7 +20,7 @@ VideoBase::VideoBase(bool is_iie, std::function &&target) : crt_->set_composite_sampling_function( "float composite_sample(usampler2D sampler, vec2 coordinate, vec2 icoordinate, float phase, float amplitude)" "{" - "return clamp(texture(sampler, coordinate).r, 0.0, 0.7);" + "return clamp(texture(sampler, coordinate).r, 0.0, 1.0);" "}"); // Show only the centre 75% of the TV frame. diff --git a/Outputs/CRT/Internals/Shaders/OutputShader.cpp b/Outputs/CRT/Internals/Shaders/OutputShader.cpp index 8f3687fab..bad5bc1d5 100644 --- a/Outputs/CRT/Internals/Shaders/OutputShader.cpp +++ b/Outputs/CRT/Internals/Shaders/OutputShader.cpp @@ -83,7 +83,7 @@ std::unique_ptr OutputShader::make_shader(const char *fragment_met "void main(void)" "{" - "fragColour = vec4(pow(" << colour_expression << ", vec3(gamma)), 0.8);"//*cos(lateralVarying) + "fragColour = vec4(pow(" << colour_expression << ", vec3(gamma)), 0.64);"//*cos(lateralVarying) "}"; return std::unique_ptr(new OutputShader(vertex_shader.str(), fragment_shader.str(), { From fc84ae611e05c6f8b277ba235c8bfed9dd9c4803 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 9 Sep 2018 20:33:56 -0400 Subject: [PATCH 4/4] Resolves various instances of spaces in place of tabs. --- .../6502InterruptTests.swift | 8 +- OSBindings/SDL/main.cpp | 14 ++-- Storage/Disk/DiskImage/Formats/NIB.cpp | 4 +- Storage/FileHolder.cpp | 78 +++++++++---------- 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/OSBindings/Mac/Clock SignalTests/6502InterruptTests.swift b/OSBindings/Mac/Clock SignalTests/6502InterruptTests.swift index a6c0def50..691ef4613 100644 --- a/OSBindings/Mac/Clock SignalTests/6502InterruptTests.swift +++ b/OSBindings/Mac/Clock SignalTests/6502InterruptTests.swift @@ -31,7 +31,7 @@ class MOS6502InterruptTests: XCTestCase { machine.setValue(0x4000, for: CSTestMachine6502Register.programCounter) } - func testIRQLine() { + func testIRQLine() { // run for six cycles; check that no interrupt has occurred machine.runForNumber(ofCycles: 6) XCTAssert(machine.value(for: .programCounter) == 0x4003, "No interrupt should have occurred with line low") @@ -46,9 +46,9 @@ class MOS6502InterruptTests: XCTestCase { XCTAssert(machine.value(for: .programCounter) != 0x1234, "Interrupt routine should not yet have begun") machine.runForNumber(ofCycles: 1) XCTAssert(machine.value(for: .programCounter) == 0x1234, "Interrupt routine should just have begun") - } + } - func testIFlagSet() { + func testIFlagSet() { // enable the interrupt line, run for eleven cycles to get past the CLIP and the following NOP and into the interrupt routine machine.irqLine = true machine.runForNumber(ofCycles: 11) @@ -57,7 +57,7 @@ class MOS6502InterruptTests: XCTestCase { XCTAssert(machine.value(for: .flags) & 0x04 == 0x04, "Interrupt status flag should be set") } - func testCLISEIFlagClear() { + func testCLISEIFlagClear() { // set up an SEI as the second instruction, enable the IRQ line machine.setValue(0x78, forAddress: 0x4001) machine.irqLine = true diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index e1a608e97..ea5b21a4c 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -287,16 +287,16 @@ std::string final_path_component(const std::string &path) { Executes @c command and returns its STDOUT. */ std::string system_get(const char *command) { - std::unique_ptr pipe(popen(command, "r"), pclose); - if(!pipe) return ""; + std::unique_ptr pipe(popen(command, "r"), pclose); + if(!pipe) return ""; std::string result; - while(!feof(pipe.get())) { + while(!feof(pipe.get())) { std::array buffer; - if (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) - result += buffer.data(); - } - return result; + if(fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) + result += buffer.data(); + } + return result; } } diff --git a/Storage/Disk/DiskImage/Formats/NIB.cpp b/Storage/Disk/DiskImage/Formats/NIB.cpp index da6e883d1..f0c7d2480 100644 --- a/Storage/Disk/DiskImage/Formats/NIB.cpp +++ b/Storage/Disk/DiskImage/Formats/NIB.cpp @@ -179,7 +179,7 @@ void NIB::set_tracks(const std::map> &tra // Lock the file and spool out. std::lock_guard lock_guard(file_.get_file_access_mutex()); for(const auto &track: tracks_by_address) { - file_.seek(file_offset(track.first), SEEK_SET); - file_.write(track.second); + file_.seek(file_offset(track.first), SEEK_SET); + file_.write(track.second); } } diff --git a/Storage/FileHolder.cpp b/Storage/FileHolder.cpp index dbba21d97..7a2f6f614 100644 --- a/Storage/FileHolder.cpp +++ b/Storage/FileHolder.cpp @@ -42,55 +42,55 @@ FileHolder::FileHolder(const std::string &file_name, FileMode ideal_mode) } uint32_t FileHolder::get32le() { - uint32_t result = static_cast(std::fgetc(file_)); - result |= static_cast(std::fgetc(file_)) << 8; - result |= static_cast(std::fgetc(file_)) << 16; - result |= static_cast(std::fgetc(file_)) << 24; + uint32_t result = static_cast(std::fgetc(file_)); + result |= static_cast(std::fgetc(file_)) << 8; + result |= static_cast(std::fgetc(file_)) << 16; + result |= static_cast(std::fgetc(file_)) << 24; - return result; + return result; } uint32_t FileHolder::get32be() { - uint32_t result = static_cast(std::fgetc(file_)) << 24; - result |= static_cast(std::fgetc(file_)) << 16; - result |= static_cast(std::fgetc(file_)) << 8; - result |= static_cast(std::fgetc(file_)); + uint32_t result = static_cast(std::fgetc(file_)) << 24; + result |= static_cast(std::fgetc(file_)) << 16; + result |= static_cast(std::fgetc(file_)) << 8; + result |= static_cast(std::fgetc(file_)); - return result; + return result; } uint32_t FileHolder::get24le() { - uint32_t result = static_cast(std::fgetc(file_)); - result |= static_cast(std::fgetc(file_)) << 8; - result |= static_cast(std::fgetc(file_)) << 16; + uint32_t result = static_cast(std::fgetc(file_)); + result |= static_cast(std::fgetc(file_)) << 8; + result |= static_cast(std::fgetc(file_)) << 16; - return result; + return result; } uint32_t FileHolder::get24be() { - uint32_t result = static_cast(std::fgetc(file_)) << 16; - result |= static_cast(std::fgetc(file_)) << 8; - result |= static_cast(std::fgetc(file_)); + uint32_t result = static_cast(std::fgetc(file_)) << 16; + result |= static_cast(std::fgetc(file_)) << 8; + result |= static_cast(std::fgetc(file_)); - return result; + return result; } uint16_t FileHolder::get16le() { - uint16_t result = static_cast(std::fgetc(file_)); - result |= static_cast(static_cast(std::fgetc(file_)) << 8); + uint16_t result = static_cast(std::fgetc(file_)); + result |= static_cast(static_cast(std::fgetc(file_)) << 8); - return result; + return result; } uint16_t FileHolder::get16be() { - uint16_t result = static_cast(static_cast(std::fgetc(file_)) << 8); - result |= static_cast(std::fgetc(file_)); + uint16_t result = static_cast(static_cast(std::fgetc(file_)) << 8); + result |= static_cast(std::fgetc(file_)); - return result; + return result; } uint8_t FileHolder::get8() { - return static_cast(std::fgetc(file_)); + return static_cast(std::fgetc(file_)); } void FileHolder::put16be(uint16_t value) { @@ -118,7 +118,7 @@ std::vector FileHolder::read(std::size_t size) { } std::size_t FileHolder::read(uint8_t *buffer, std::size_t size) { - return std::fread(buffer, 1, size, file_); + return std::fread(buffer, 1, size, file_); } std::size_t FileHolder::write(const std::vector &buffer) { @@ -126,7 +126,7 @@ std::size_t FileHolder::write(const std::vector &buffer) { } std::size_t FileHolder::write(const uint8_t *buffer, std::size_t size) { - return std::fwrite(buffer, 1, size, file_); + return std::fwrite(buffer, 1, size, file_); } void FileHolder::seek(long offset, int whence) { @@ -160,22 +160,22 @@ bool FileHolder::check_signature(const char *signature, std::size_t length) { } std::string FileHolder::extension() { - std::size_t pointer = name_.size() - 1; - while(pointer > 0 && name_[pointer] != '.') pointer--; - if(name_[pointer] == '.') pointer++; + std::size_t pointer = name_.size() - 1; + while(pointer > 0 && name_[pointer] != '.') pointer--; + if(name_[pointer] == '.') pointer++; - std::string extension = name_.substr(pointer); - std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); - return extension; + std::string extension = name_.substr(pointer); + std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); + return extension; } void FileHolder::ensure_is_at_least_length(long length) { - std::fseek(file_, 0, SEEK_END); - long bytes_to_write = length - ftell(file_); - if(bytes_to_write > 0) { - std::vector empty(static_cast(bytes_to_write), 0); - std::fwrite(empty.data(), sizeof(uint8_t), static_cast(bytes_to_write), file_); - } + std::fseek(file_, 0, SEEK_END); + long bytes_to_write = length - ftell(file_); + if(bytes_to_write > 0) { + std::vector empty(static_cast(bytes_to_write), 0); + std::fwrite(empty.data(), sizeof(uint8_t), static_cast(bytes_to_write), file_); + } } bool FileHolder::get_is_known_read_only() {