static int pcxdrv_write_file_header_memmap(int x_size, int y_size) { BYTE header[128]; memset(header, 0, sizeof(header)); header[0] = 0xa; header[1] = 5; header[2] = 1; header[3] = 8; util_word_to_le_buf(&header[8], (WORD)(x_size - 1)); util_word_to_le_buf(&header[10], (WORD)(y_size - 1)); util_word_to_le_buf(&header[12], (WORD)(0)); util_word_to_le_buf(&header[14], (WORD)(0)); header[65] = 1; util_word_to_le_buf(&header[66], (WORD)(x_size)); if (fwrite(header, sizeof(header), 1, pcxdrv_memmap_fd) < 1) { return -1; } return 0; }
static int pcxdrv_write_file_header(screenshot_t *screenshot) { BYTE header[128]; memset(header, 0, sizeof(header)); header[0] = 0xa; header[1] = 5; header[2] = 1; header[3] = 8; util_word_to_le_buf(&header[8], (WORD)(screenshot->width - 1)); util_word_to_le_buf(&header[10], (WORD)(screenshot->height - 1)); util_word_to_le_buf(&header[12], (WORD)(screenshot->dpi_x)); util_word_to_le_buf(&header[14], (WORD)(screenshot->dpi_x)); header[65] = 1; util_word_to_le_buf(&header[66], (WORD)(screenshot->width)); if (fwrite(header, sizeof(header), 1, screenshot->gfxoutputdrv_data->fd) < 1) { return -1; } return 0; }
int fsimage_gcr_write_half_track(disk_image_t *image, unsigned int half_track, const disk_track_t *raw) { int gap, extend = 0, res; WORD max_track_length; BYTE buf[4]; long offset; fsimage_t *fsimage; BYTE num_half_tracks; fsimage = image->media.fsimage; offset = fsimage_gcr_seek_half_track(fsimage, half_track, &max_track_length, &num_half_tracks); if (offset < 0) { return -1; } if (image->read_only != 0) { log_error(fsimage_gcr_log, "Attempt to write to read-only disk image."); return -1; } if (raw->size > max_track_length) { log_error(fsimage_gcr_log, "Track too long for image."); return -1; } if (offset == 0) { offset = fseek(fsimage->fd, 0, SEEK_END); if (offset == 0) { offset = ftell(fsimage->fd); } if (offset < 0) { log_error(fsimage_gcr_log, "Could not extend GCR disk image."); return -1; } extend = 1; } if (raw->data != NULL) { util_word_to_le_buf(buf, (WORD)raw->size); if (util_fpwrite(fsimage->fd, buf, 2, offset) < 0) { log_error(fsimage_gcr_log, "Could not write GCR disk image."); return -1; } /* Clear gap between the end of the actual track and the start of the next track. */ if (fwrite(raw->data, raw->size, 1, fsimage->fd) < 1) { log_error(fsimage_gcr_log, "Could not write GCR disk image."); return -1; } gap = max_track_length - raw->size; if (gap > 0) { BYTE *padding = lib_calloc(1, gap); res = fwrite(padding, gap, 1, fsimage->fd); lib_free(padding); if (res < 1) { log_error(fsimage_gcr_log, "Could not write GCR disk image."); return -1; } } if (extend) { util_dword_to_le_buf(buf, offset); if (util_fpwrite(fsimage->fd, buf, 4, 12 + (half_track - 2) * 4) < 0) { log_error(fsimage_gcr_log, "Could not write GCR disk image."); return -1; } util_dword_to_le_buf(buf, disk_image_speed_map(image->type, half_track / 2)); if (util_fpwrite(fsimage->fd, buf, 4, 12 + (half_track - 2 + num_half_tracks) * 4) < 0) { log_error(fsimage_gcr_log, "Could not write GCR disk image."); return -1; } } } /* Make sure the stream is visible to other readers. */ fflush(fsimage->fd); return 0; }