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; } }
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); } }
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; }