port: GrpImageInstance/GrpExpandedImageInstance verbatim; fix SCREEN blend factor

Both units are the 40250 bodies; only the PDT-stream draw becomes
UIRenderAddImage (with the rendering mode). SCREEN/COLOR_DODGE were packed as
0x28 (INVDESTALPHA+ONE); 40250 uses INVDESTCOLOR+ONE (0x2A). OnIsType calls the
base OnIsType instead of 40250's recursing IsType. port.grp_resource covers the
quads, UVs, colour and blend mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-30 14:21:13 +09:00
co-authored by Claude Opus 5.5
parent 010e99f070
commit 65777331f7
8 changed files with 819 additions and 231 deletions
+2
View File
@@ -631,3 +631,5 @@
{"date": "2026-09-30", "unit": "EterLib/GrpImageTexture.cpp", "action": "port", "evidence": "40250 flow: pack reload in CreateDeviceObjects, CDXTCImage header check + CreateDDSTexture size/mip bias, CreateFromDiskFile; handles stay platform textures; port.grp_resource"}
{"date": "2026-09-30", "unit": "EterLib/GrpIndexBuffer.cpp", "action": "port", "evidence": "CPU buffers, bodies otherwise 40250; port.grp_resource"}
{"date": "2026-09-30", "unit": "EterLib/GrpVertexBuffer.cpp", "action": "port", "evidence": "CPU buffers, bodies otherwise 40250; port.grp_resource"}
{"date": "2026-09-30", "unit": "EterLib/GrpImageInstance.cpp", "action": "port", "evidence": "verbatim; draw via UIRenderAddImage; port.grp_resource quad/uv/colour"}
{"date": "2026-09-30", "unit": "EterLib/GrpExpandedImageInstance.cpp", "action": "port", "evidence": "verbatim; draw + blend mode via UIRenderAddImage, SCREEN/COLOR_DODGE blend fixed to INVDESTCOLOR (0x2A); OnIsType recursion avoided; port.grp_resource"}
@@ -0,0 +1,172 @@
{
"reference": "EterLib/GrpExpandedImageInstance.cpp",
"reference_sha256": "1e3eb000f12b2ab0658da06ff55843874a2fa70619d249d9246c545746396a78",
"priority": "P4",
"contracts": [],
"functions": {
"CGraphicExpandedImageInstance::CreateSystem": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::CreateSystem"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::DestroySystem": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::DestroySystem"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::New": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::New"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::Delete": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::Delete"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::OnRender": {
"status": "ADAPTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::OnRender"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
],
"note": "40250: CULLMODE CCW for a mirrored scale, Save/RestoreRenderState SRCBLEND/DESTBLEND per RENDERING_MODE, PDT-stream fill-rect draw. Port: the verbatim vertices plus m_iRenderingMode go to UIRenderAddImage; the Vulkan UI pipeline (cull none) maps SCREEN/COLOR_DODGE to INVDESTCOLOR+ONE and MODULATE to ZERO+SRCCOLOR (ui_batches.cpp). Invariant: same corners, UVs and blend factors."
},
"CGraphicExpandedImageInstance::SetDepth": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetDepth"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::SetOrigin": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetOrigin"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::SetRotation": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetRotation"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::SetScale": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetScale"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::SetRenderingRect": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetRenderingRect"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::SetRenderingMode": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::SetRenderingMode"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::Type": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::Type"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::OnSetImagePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::OnSetImagePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::OnIsType": {
"status": "ADAPTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::OnIsType"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
],
"note": "40250: falls back to CGraphicImageInstance::IsType, which re-dispatches to this override and recurses until stack overflow for a foreign type. Port: calls the base OnIsType. Invariant: TRUE for its own and CGraphicImageInstance type, FALSE otherwise."
},
"CGraphicExpandedImageInstance::Initialize": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::Initialize"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::Destroy": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::Destroy"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::CGraphicExpandedImageInstance": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::CGraphicExpandedImageInstance"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicExpandedImageInstance::~CGraphicExpandedImageInstance": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpExpandedImageInstance.cpp:CGraphicExpandedImageInstance::~CGraphicExpandedImageInstance"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
}
}
}
@@ -0,0 +1,53 @@
{
"reference": "EterLib/GrpFontTexture.cpp",
"reference_sha256": "d50b85e6e494b2e2a10289f40a5ebc518be03e1e73d60cd7463fd2dc5032ba00",
"priority": "P4",
"contracts": [],
"functions": {
"CGraphicFontTexture::CGraphicFontTexture": {
"status": "TODO"
},
"CGraphicFontTexture::~CGraphicFontTexture": {
"status": "TODO"
},
"CGraphicFontTexture::Initialize": {
"status": "TODO"
},
"CGraphicFontTexture::IsEmpty": {
"status": "TODO"
},
"CGraphicFontTexture::Destroy": {
"status": "TODO"
},
"CGraphicFontTexture::CreateDeviceObjects": {
"status": "TODO"
},
"CGraphicFontTexture::DestroyDeviceObjects": {
"status": "TODO"
},
"CGraphicFontTexture::Create": {
"status": "TODO"
},
"CGraphicFontTexture::GetFont": {
"status": "TODO"
},
"CGraphicFontTexture::AppendTexture": {
"status": "TODO"
},
"CGraphicFontTexture::UpdateTexture": {
"status": "TODO"
},
"CGraphicFontTexture::GetCharacterInfomation": {
"status": "TODO"
},
"CGraphicFontTexture::UpdateCharacterInfomation": {
"status": "TODO"
},
"CGraphicFontTexture::CheckTextureIndex": {
"status": "TODO"
},
"CGraphicFontTexture::SelectTexture": {
"status": "TODO"
}
}
}
@@ -0,0 +1,225 @@
{
"reference": "EterLib/GrpImageInstance.cpp",
"reference_sha256": "59c2dd35bca5a7ad3cf517070a6188ee37ac41cb1fd53ef3ee65437b737b622c",
"priority": "P4",
"contracts": [],
"functions": {
"CGraphicImageInstance::CreateSystem": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::CreateSystem"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::DestroySystem": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::DestroySystem"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::New": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::New"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::Delete": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::Delete"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::Render": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::Render"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::OnRender": {
"status": "ADAPTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::OnRender"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
],
"note": "40250: SetPDTStream + DEFAULT_IB_FILL_RECT + stage-0 texture, DrawIndexedPrimitive. Port: the same four TPDTVertex corners/UVs/diffuse go to UIRenderAddImage. Invariant: quad = image rect at m_v2Position-0.5, UVs = rect/texture size."
},
"CGraphicImageInstance::GetTextureReference": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::GetTextureReference"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::GetTexturePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::GetTexturePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::GetGraphicImagePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::GetGraphicImagePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::GetWidth": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::GetWidth"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::GetHeight": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::GetHeight"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::SetDiffuseColor": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::SetDiffuseColor"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::SetPosition": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::SetPosition"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::SetImagePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::SetImagePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::ReloadImagePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::ReloadImagePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::IsEmpty": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::IsEmpty"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::Type": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::Type"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::IsType": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::IsType"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::OnIsType": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::OnIsType"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::OnSetImagePointer": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::OnSetImagePointer"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::Initialize": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::Initialize"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::Destroy": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::Destroy"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::CGraphicImageInstance": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::CGraphicImageInstance"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
},
"CGraphicImageInstance::~CGraphicImageInstance": {
"status": "PORTED",
"impl": [
"src/platform/EterLib/GrpImageInstance.cpp:CGraphicImageInstance::~CGraphicImageInstance"
],
"test": [
"tests/port/port_grp_resource_test.cpp"
]
}
}
}