예제 #1
0
gfx_pixmap_t *GfxResManager::getCursor(int num) {
	IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_CURSOR];
	gfx_resource_t *res = NULL;
	int hash = getOptionsHash(GFX_RESOURCE_TYPE_CURSOR);

	res = resMap.contains(num) ? resMap[num] : NULL;

	if (!res || res->mode != hash) {
		Resource *cursorRes = _resManager->findResource(ResourceId(kResourceTypeCursor, num), 0);
		if (!cursorRes || !cursorRes->data)
			return NULL;

		if (_version >= SCI_VERSION_1_1) {
			warning("[GFX] Attempt to retrieve cursor in SCI1.1 or later");
			return NULL;
		}

		gfx_pixmap_t *cursor = gfxr_draw_cursor(GFXR_RES_ID(GFX_RESOURCE_TYPE_CURSOR, num),
										cursorRes->data, cursorRes->size, _version != SCI_VERSION_0);

		if (!cursor)
			return NULL;

		if (!res) {
			res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
			res->scaled_data.pointer = NULL;
			res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_CURSOR, num);
			res->lock_sequence_nr = _tagLockCounter;
			res->mode = hash;
			resMap[num] = res;
		} else {
			gfx_free_pixmap(res->unscaled_data.pointer);
		}
#ifdef CUSTOM_GRAPHICS_OPTIONS
		gfx_get_res_config(_options, cursor);
		gfx_xlate_pixmap(cursor, _driver->getMode(), _options->cursor_xlate_filter);
#else
		gfx_xlate_pixmap(cursor, _driver->getMode(), GFX_XLATE_FILTER_NONE);
#endif

		res->unscaled_data.pointer = cursor;

		return cursor;
	} else {
		res->lock_sequence_nr = _tagLockCounter; // Update lock counter
		return res->unscaled_data.pointer;
	}
}
예제 #2
0
static void
gfx_box_text(gfx_driver_t *gfx_driver, rect_t box, gfx_bitmap_font_t* font, gfx_pixmap_color_t fgc, gfx_pixmap_color_t bgc, const char* text, int center)
{
	int width;
	int height;
	gfx_pixmap_t* pixmap;
	text_fragment_t *textsplits;
	int meas_width;
	int meas_height;
	int meas_line;
	int margin_x = 0;
	int margin_y = 0;
	int line_height;
	int last_offset;

	if (center != 0)
	{
		textsplits = gfxr_font_calculate_size(font, box.xl, text, &meas_width, &meas_height, &meas_line, &line_height, &last_offset, GFXR_FONT_FLAG_NO_NEWLINES | GFXR_FONT_FLAG_COUNT_WHITESPACE);
		if (textsplits != NULL)
		{
			free(textsplits);
		}

		margin_x = (box.xl - meas_width) / 2;
		margin_y = (box.yl - meas_height) / 2;
	}

	box.x *= gfx_driver->mode->xfact;
	box.y *= gfx_driver->mode->yfact;
	box.xl *= gfx_driver->mode->xfact;
	box.yl *= gfx_driver->mode->yfact;
	margin_x *= gfx_driver->mode->xfact;
	margin_y *= gfx_driver->mode->yfact;

	pixmap = gfxr_draw_font(font, text, strlen(text), &fgc, &fgc, NULL);
	if (pixmap != NULL)
	{
		pixmap->xoffset = 0;
		pixmap->yoffset = 0;

		gfx_xlate_pixmap(gfx_pixmap_alloc_data(pixmap, gfx_driver->mode), gfx_driver->mode, GFX_XLATE_FILTER_NONE);

		width = pixmap->index_xl * gfx_driver->mode->xfact;
		height = pixmap->index_yl * gfx_driver->mode->yfact;

		if (width > box.xl)
			width = box.xl;

		if (gfx_driver->draw_pixmap(gfx_driver, pixmap, GFX_NO_PRIORITY, gfx_rect(0, 0, width, height), gfx_rect(box.x + margin_x, box.y + margin_y, width, height), GFX_BUFFER_BACK) != GFX_OK)
		{
			GFXERROR("Error occured while drawing pixmap.\n");
		}

		gfx_free_pixmap(gfx_driver, pixmap);
	}
}
예제 #3
0
gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
	IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_VIEW];
	gfx_resource_t *res = NULL;
	int hash = palette;
	gfxr_view_t *view = NULL;
	gfxr_loop_t *loop_data = NULL;
	gfx_pixmap_t *cel_data = NULL;

	res = resMap.contains(nr) ? resMap[nr] : NULL;

	if (!res || res->mode != hash) {
		Resource *viewRes = _resManager->findResource(ResourceId(kResourceTypeView, nr), 0);
		if (!viewRes || !viewRes->data)
			return NULL;

		int resid = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr);
		
		if (!_resManager->isVGA()) {
			int pal = (_version == SCI_VERSION_0) ? -1 : palette;
			view = getEGAView(resid, viewRes->data, viewRes->size, pal);
		} else {
			if (_version < SCI_VERSION_1_1)
				view = getVGAView(resid, viewRes->data, viewRes->size, _staticPalette, false);
			else
				view = getVGAView(resid, viewRes->data, viewRes->size, 0, true);

			if (!view->palette) {
				view->palette = new Palette(_staticPalette->size());
				view->palette->name = "interpreter_get_view";
			}

			// Palettize view
			for (unsigned i = 0; i < MIN(view->palette->size(), _staticPalette->size()); i++) {
				const PaletteEntry& vc = view->palette->getColor(i);
				if (vc.r == 0 && vc.g == 0 && vc.b == 0) {
					const PaletteEntry& sc = _staticPalette->getColor(i);
					view->palette->setColor(i, sc.r, sc.g, sc.b);
				}
			}
		}

		if (!res) {
			res = (gfx_resource_t *)malloc(sizeof(gfx_resource_t));
			res->scaled_data.view = NULL;
			res->ID = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr);
			res->lock_sequence_nr = _tagLockCounter;
			res->mode = hash;
			resMap[nr] = res;
		} else {
			gfxr_free_view(res->unscaled_data.view);
		}

		res->mode = hash;
		res->unscaled_data.view = view;

	} else {
		res->lock_sequence_nr = _tagLockCounter; // Update lock counter
		view = res->unscaled_data.view;
	}

	*loop = CLIP<int>(*loop, 0, view->loops_nr - 1);

	if (*loop < 0) {
		warning("[GFX] View %d has no loops", nr);
		return NULL;
	}

	loop_data = view->loops + (*loop);
	if (loop_data == NULL) {
		warning("[GFX] Trying to load invalid loop %d of view %d", *loop, nr);
		return NULL;
	}

	*cel = CLIP<int>(*cel, 0, loop_data->cels_nr - 1);

	if (*cel < 0) {
		warning("[GFX] View %d loop %d has no cels", nr, *loop);
		return NULL;
	}

	cel_data = loop_data->cels[*cel];
	if (loop_data == NULL) {
		warning("[GFX] Trying to load invalid view/loop/cel %d/%d/%d", nr, *loop, *cel);
		return NULL;
	}

	if (!cel_data->data) {
		if (!cel_data->palette)
			cel_data->palette = view->palette->getref();
#ifdef CUSTOM_GRAPHICS_OPTIONS
		gfx_get_res_config(_options, cel_data);
		gfx_xlate_pixmap(cel_data, _driver->getMode(), _options->view_xlate_filter);
#else
		gfx_xlate_pixmap(cel_data, _driver->getMode(), GFX_XLATE_FILTER_NONE);
#endif
	}

	return view;
}