Add WASM feature tests: font enum, text decor, bitmap mask, regions
New test apps and E2E tests: - fontenum: Font enumeration via Local Font Access API (180 fonts) - textdecor: Text underline/strikethrough decorations - bitmask: wxMask bitmap transparency with color keys - regions: Non-rectangular region clipping (union, subtract, complex shapes) Updates: - playwright.config.ts: Add local-fonts permission - WHATWORKS.md: Document implemented features, update test counts - Makefile.wasm: Add build targets for new test apps 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
7448d3cd74
commit
756feb35da
16 changed files with 984 additions and 19 deletions
250
tests/wasm-app/standalone/fontenum/fontenum_test.cpp
Normal file
250
tests/wasm-app/standalone/fontenum/fontenum_test.cpp
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
// wxFontEnumerator Test - Tests Local Font Access API integration
|
||||
// Tests: wxFontEnumerator::EnumerateFacenames(), font listing, sample rendering
|
||||
|
||||
#include "wx/wx.h"
|
||||
#include "wx/fontenum.h"
|
||||
#include "wx/listbox.h"
|
||||
|
||||
// Custom font enumerator that collects font names
|
||||
class FontCollector : public wxFontEnumerator
|
||||
{
|
||||
public:
|
||||
wxArrayString& GetFonts() { return m_fonts; }
|
||||
|
||||
protected:
|
||||
virtual bool OnFacename(const wxString& facename) override
|
||||
{
|
||||
m_fonts.Add(facename);
|
||||
return true; // Continue enumeration
|
||||
}
|
||||
|
||||
private:
|
||||
wxArrayString m_fonts;
|
||||
};
|
||||
|
||||
class FontEnumFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
FontEnumFrame() : wxFrame(nullptr, wxID_ANY, "wxFontEnumerator Test",
|
||||
wxDefaultPosition, wxSize(800, 600))
|
||||
{
|
||||
wxPanel* mainPanel = new wxPanel(this);
|
||||
wxBoxSizer* mainSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
// Left panel - font list
|
||||
wxBoxSizer* leftSizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
wxStaticText* listLabel = new wxStaticText(mainPanel, wxID_ANY,
|
||||
"System Fonts (via Local Font Access API):");
|
||||
leftSizer->Add(listLabel, 0, wxALL, 5);
|
||||
|
||||
m_fontList = new wxListBox(mainPanel, wxID_ANY, wxDefaultPosition,
|
||||
wxSize(300, -1));
|
||||
m_fontList->Bind(wxEVT_LISTBOX, &FontEnumFrame::OnFontSelected, this);
|
||||
leftSizer->Add(m_fontList, 1, wxEXPAND | wxALL, 5);
|
||||
|
||||
m_enumButton = new wxButton(mainPanel, wxID_ANY, "Enumerate Fonts");
|
||||
m_enumButton->Bind(wxEVT_BUTTON, &FontEnumFrame::OnEnumerateFonts, this);
|
||||
leftSizer->Add(m_enumButton, 0, wxALL, 5);
|
||||
|
||||
m_statusText = new wxStaticText(mainPanel, wxID_ANY, "Click 'Enumerate Fonts' to start");
|
||||
leftSizer->Add(m_statusText, 0, wxALL, 5);
|
||||
|
||||
mainSizer->Add(leftSizer, 0, wxEXPAND | wxALL, 5);
|
||||
|
||||
// Right panel - font preview
|
||||
wxBoxSizer* rightSizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
wxStaticText* previewLabel = new wxStaticText(mainPanel, wxID_ANY, "Font Preview:");
|
||||
rightSizer->Add(previewLabel, 0, wxALL, 5);
|
||||
|
||||
m_previewPanel = new wxPanel(mainPanel, wxID_ANY, wxDefaultPosition,
|
||||
wxSize(-1, 200));
|
||||
m_previewPanel->SetBackgroundColour(*wxWHITE);
|
||||
m_previewPanel->Bind(wxEVT_PAINT, &FontEnumFrame::OnPaintPreview, this);
|
||||
rightSizer->Add(m_previewPanel, 0, wxEXPAND | wxALL, 5);
|
||||
|
||||
// Sample text sizes
|
||||
wxStaticText* sizesLabel = new wxStaticText(mainPanel, wxID_ANY, "Sample Text at Different Sizes:");
|
||||
rightSizer->Add(sizesLabel, 0, wxALL, 5);
|
||||
|
||||
m_samplesPanel = new wxPanel(mainPanel, wxID_ANY, wxDefaultPosition,
|
||||
wxSize(-1, 250));
|
||||
m_samplesPanel->SetBackgroundColour(*wxWHITE);
|
||||
m_samplesPanel->Bind(wxEVT_PAINT, &FontEnumFrame::OnPaintSamples, this);
|
||||
rightSizer->Add(m_samplesPanel, 1, wxEXPAND | wxALL, 5);
|
||||
|
||||
mainSizer->Add(rightSizer, 1, wxEXPAND | wxALL, 5);
|
||||
|
||||
mainPanel->SetSizer(mainSizer);
|
||||
|
||||
// Event log
|
||||
m_log = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 100),
|
||||
wxTE_MULTILINE | wxTE_READONLY);
|
||||
|
||||
wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL);
|
||||
frameSizer->Add(mainPanel, 1, wxEXPAND);
|
||||
frameSizer->Add(m_log, 0, wxEXPAND | wxALL, 5);
|
||||
SetSizer(frameSizer);
|
||||
|
||||
CreateStatusBar();
|
||||
SetStatusText("Font Enumeration Test - Uses Local Font Access API");
|
||||
Log("Font enumeration test app started");
|
||||
Log("Note: Requires Chrome/Edge 103+ and user permission");
|
||||
|
||||
// Auto-enumerate fonts on startup for testing
|
||||
CallAfter([this]() {
|
||||
wxCommandEvent evt;
|
||||
OnEnumerateFonts(evt);
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
void OnEnumerateFonts(wxCommandEvent& event)
|
||||
{
|
||||
m_fontList->Clear();
|
||||
m_selectedFont.Clear();
|
||||
m_previewPanel->Refresh();
|
||||
m_samplesPanel->Refresh();
|
||||
|
||||
Log("Starting font enumeration...");
|
||||
m_statusText->SetLabel("Enumerating fonts...");
|
||||
|
||||
FontCollector collector;
|
||||
bool success = collector.EnumerateFacenames();
|
||||
|
||||
if (success)
|
||||
{
|
||||
wxArrayString& fonts = collector.GetFonts();
|
||||
int count = fonts.GetCount();
|
||||
|
||||
Log(wxString::Format("Found %d font families", count));
|
||||
m_statusText->SetLabel(wxString::Format("Found %d fonts", count));
|
||||
|
||||
for (size_t i = 0; i < fonts.GetCount(); i++)
|
||||
{
|
||||
m_fontList->Append(fonts[i]);
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
m_fontList->SetSelection(0);
|
||||
m_selectedFont = fonts[0];
|
||||
m_previewPanel->Refresh();
|
||||
m_samplesPanel->Refresh();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("Font enumeration failed or permission denied");
|
||||
m_statusText->SetLabel("Enumeration failed - check console");
|
||||
|
||||
// Add a note about the API requirement
|
||||
m_fontList->Append("(Font enumeration unavailable)");
|
||||
m_fontList->Append("Requires:");
|
||||
m_fontList->Append("- Chrome/Edge 103+");
|
||||
m_fontList->Append("- User permission");
|
||||
}
|
||||
}
|
||||
|
||||
void OnFontSelected(wxCommandEvent& event)
|
||||
{
|
||||
int sel = m_fontList->GetSelection();
|
||||
if (sel != wxNOT_FOUND)
|
||||
{
|
||||
m_selectedFont = m_fontList->GetString(sel);
|
||||
Log(wxString::Format("Selected font: %s", m_selectedFont));
|
||||
m_previewPanel->Refresh();
|
||||
m_samplesPanel->Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
void OnPaintPreview(wxPaintEvent& event)
|
||||
{
|
||||
wxPaintDC dc(m_previewPanel);
|
||||
dc.SetBackground(*wxWHITE_BRUSH);
|
||||
dc.Clear();
|
||||
|
||||
if (m_selectedFont.IsEmpty())
|
||||
{
|
||||
dc.SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL));
|
||||
dc.SetTextForeground(wxColour(128, 128, 128));
|
||||
dc.DrawText("Select a font to preview", 10, 10);
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw font name and sample text
|
||||
wxFont font(24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL,
|
||||
false, m_selectedFont);
|
||||
dc.SetFont(font);
|
||||
dc.SetTextForeground(*wxBLACK);
|
||||
|
||||
int y = 10;
|
||||
dc.DrawText(m_selectedFont, 10, y);
|
||||
y += 40;
|
||||
|
||||
dc.DrawText("The quick brown fox jumps over the lazy dog", 10, y);
|
||||
y += 40;
|
||||
|
||||
dc.DrawText("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10, y);
|
||||
y += 40;
|
||||
|
||||
dc.DrawText("abcdefghijklmnopqrstuvwxyz", 10, y);
|
||||
y += 40;
|
||||
|
||||
dc.DrawText("0123456789 !@#$%^&*()", 10, y);
|
||||
}
|
||||
|
||||
void OnPaintSamples(wxPaintEvent& event)
|
||||
{
|
||||
wxPaintDC dc(m_samplesPanel);
|
||||
dc.SetBackground(*wxWHITE_BRUSH);
|
||||
dc.Clear();
|
||||
|
||||
if (m_selectedFont.IsEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int sizes[] = {8, 10, 12, 14, 16, 18, 24, 32};
|
||||
int y = 10;
|
||||
|
||||
for (int size : sizes)
|
||||
{
|
||||
wxFont font(size, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL,
|
||||
false, m_selectedFont);
|
||||
dc.SetFont(font);
|
||||
dc.SetTextForeground(*wxBLACK);
|
||||
|
||||
wxString sample = wxString::Format("%dpt: Sample Text AaBbCc 123", size);
|
||||
dc.DrawText(sample, 10, y);
|
||||
y += size + 8;
|
||||
}
|
||||
}
|
||||
|
||||
void Log(const wxString& msg)
|
||||
{
|
||||
m_log->AppendText(msg + "\n");
|
||||
}
|
||||
|
||||
wxListBox* m_fontList;
|
||||
wxButton* m_enumButton;
|
||||
wxStaticText* m_statusText;
|
||||
wxPanel* m_previewPanel;
|
||||
wxPanel* m_samplesPanel;
|
||||
wxTextCtrl* m_log;
|
||||
wxString m_selectedFont;
|
||||
};
|
||||
|
||||
class FontEnumApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit() override
|
||||
{
|
||||
FontEnumFrame* frame = new FontEnumFrame();
|
||||
frame->Show();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
wxIMPLEMENT_APP(FontEnumApp);
|
||||
Loading…
Reference in a new issue