static NSVGimage * GetCachedSVG( Tcl_Interp *interp, ClientData dataOrChan, Tcl_Obj *formatObj, RastOpts *ropts) { int length; const char *data; NSVGcache *cachePtr = GetCachePtr(interp); NSVGimage *nsvgImage = NULL; if ((cachePtr != NULL) && (cachePtr->nsvgImage != NULL) && (cachePtr->dataOrChan == dataOrChan)) { if (formatObj != NULL) { data = Tcl_GetStringFromObj(formatObj, &length); if (strcmp(data, Tcl_DStringValue(&cachePtr->formatString)) == 0) { nsvgImage = cachePtr->nsvgImage; *ropts = cachePtr->ropts; cachePtr->nsvgImage = NULL; } } else if (Tcl_DStringLength(&cachePtr->formatString) == 0) { nsvgImage = cachePtr->nsvgImage; *ropts = cachePtr->ropts; cachePtr->nsvgImage = NULL; } } CleanCache(interp); return nsvgImage; }
static void CleanCache(Tcl_Interp *interp) { NSVGcache *cachePtr = GetCachePtr(interp); if (cachePtr != NULL) { cachePtr->dataOrChan = NULL; Tcl_DStringSetLength(&cachePtr->formatString, 0); if (cachePtr->nsvgImage != NULL) { nsvgDelete(cachePtr->nsvgImage); cachePtr->nsvgImage = NULL; } } }
// GetPointer must always return an address in the bottom 32 bits of address space, so that 64-bit // programs don't have problems directly addressing any part of memory. // TODO re-think with respect to other BAT setups... u8 *GetPointer(const u32 _Address) { switch (_Address >> 28) { case 0x0: case 0x8: if ((_Address & 0xfffffff) < REALRAM_SIZE) return m_pPhysicalRAM + (_Address & RAM_MASK); case 0xc: switch (_Address >> 24) { case 0xcc: case 0xcd: _dbg_assert_msg_(MEMMAP, 0, "GetPointer from IO Bridge doesnt work"); case 0xc8: // EFB. We don't want to return a pointer here since we have no memory mapped for it. break; default: if ((_Address & 0xfffffff) < REALRAM_SIZE) return m_pPhysicalRAM + (_Address & RAM_MASK); } case 0x1: case 0x9: case 0xd: if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) { if ((_Address & 0xfffffff) < EXRAM_SIZE) return m_pPhysicalEXRAM + (_Address & EXRAM_MASK); } else break; case 0xe: if (_Address < (0xE0000000 + L1_CACHE_SIZE)) return GetCachePtr() + (_Address & L1_CACHE_MASK); else break; default: if (bFakeVMEM) return m_pVirtualFakeVMEM + (_Address & FAKEVMEM_MASK); } ERROR_LOG(MEMMAP, "Unknown Pointer %#8x PC %#8x LR %#8x", _Address, PC, LR); return NULL; }
void DMA_MemoryToLC(const u32 _CacheAddr, const u32 _MemAddr, const u32 _iNumBlocks) { const u8 *src = GetPointer(_MemAddr); u8 *dst = GetCachePtr() + (_CacheAddr & 0x3FFFF); if ((dst != NULL) && (src != NULL) && (_MemAddr & 3) == 0 && (_CacheAddr & 3) == 0) { memcpy(dst, src, 32 * _iNumBlocks); } else { for (u32 i = 0; i < 32 * _iNumBlocks; i++) { u8 Temp = Read_U8(_MemAddr + i); Write_U8(Temp, _CacheAddr + i); } } }
static int CacheSVG( Tcl_Interp *interp, ClientData dataOrChan, Tcl_Obj *formatObj, NSVGimage *nsvgImage, RastOpts *ropts) { int length; const char *data; NSVGcache *cachePtr = GetCachePtr(interp); if (cachePtr != NULL) { cachePtr->dataOrChan = dataOrChan; if (formatObj != NULL) { data = Tcl_GetStringFromObj(formatObj, &length); Tcl_DStringAppend(&cachePtr->formatString, data, length); } cachePtr->nsvgImage = nsvgImage; cachePtr->ropts = *ropts; return 1; } return 0; }