Class: Retrograph::VDU

Inherits:
Object
  • Object
show all
Defined in:
ext/retrograph/retrograph.c

Instance Method Summary collapse

Instance Method Details

#initialize_copy(from) ⇒ Object



150
151
152
153
154
155
156
157
158
159
160
161
# File 'ext/retrograph/retrograph.c', line 150

static VALUE vdu_initialize_copy(VALUE self, VALUE from) {
    vdu_wrapper_t *vdu;
    vdu_wrapper_t *from_vdu;
    if (CLASS_OF(self) != CLASS_OF(from)) {
        rb_raise(rb_eTypeError, "Mismatched class for copy");
    }
    Data_Get_Struct(self, vdu_wrapper_t, vdu);
    Data_Get_Struct(from, vdu_wrapper_t, from_vdu);
    retrograph_clone(vdu->vdu, from_vdu->vdu);
    check_errors(vdu->vdu);
    return Qnil;
}

#wait_scanlines(n_scanlines_r) ⇒ Object



187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'ext/retrograph/retrograph.c', line 187

static VALUE vdu_render_scanlines(VALUE self, VALUE n_scanlines_r) {
    vdu_wrapper_t *vdu;
    surface_header_t *surface;
    uint8_t *current_line;
    int max_scanline;

    Data_Get_Struct(self, vdu_wrapper_t, vdu);

    if (vdu->scanline == NOT_IN_FRAME) {
        return Qnil;
    }

    surface = get_rubysdl_surface(vdu->surface);

    max_scanline = (int)NUM2UINT(n_scanlines_r) + vdu->scanline;
    if (max_scanline > RETROGRAPH_DISPLAY_HEIGHT) {
        max_scanline = RETROGRAPH_DISPLAY_HEIGHT;
    }

    current_line = (uint8_t *)surface->pixels +
                   vdu->scanline * surface->pitch * 2;
    for (; vdu->scanline < max_scanline; vdu->scanline++) {
        uint8_t *output;
        uint8_t const *input;
        retrograph_render_scanline_2x(vdu->vdu, current_line,
                                      RETROGRAPH_DISPLAY_WIDTH *
                                      RETROGRAPH_BYTES_PER_PIXEL * 2);
        check_errors(vdu->vdu);
        memcpy(current_line + surface->pitch, current_line,
               RETROGRAPH_DISPLAY_WIDTH * RETROGRAPH_BYTES_PER_PIXEL * 2);
        current_line += surface->pitch * 2;
    }

    return Qnil;
}

#write(start_address_r, data_r) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
# File 'ext/retrograph/retrograph.c', line 163

static VALUE vdu_write(VALUE self, VALUE start_address_r, VALUE data_r) {
    vdu_wrapper_t *vdu;
    retrograph_addr_t start_address;
    Check_Type(data_r, T_STRING);
    Data_Get_Struct(self, vdu_wrapper_t, vdu);
    start_address = (retrograph_addr_t)NUM2INT(start_address_r);
    retrograph_write(vdu->vdu, start_address, RSTRING_PTR(data_r),
                     (size_t)RSTRING_LEN(data_r));
    check_errors(vdu->vdu);
    return Qnil;
}

#write_byte(start_address_r, byte_r) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
# File 'ext/retrograph/retrograph.c', line 175

static VALUE vdu_write_byte(VALUE self, VALUE start_address_r, VALUE byte_r) {
    vdu_wrapper_t *vdu;
    uint8_t byte;
    retrograph_addr_t start_address;
    Data_Get_Struct(self, vdu_wrapper_t, vdu);
    start_address = (retrograph_addr_t)NUM2INT(start_address_r);
    byte = (uint8_t)NUM2INT(byte_r);
    retrograph_write(vdu->vdu, start_address, &byte, 1);
    check_errors(vdu->vdu);
    return Qnil;
}