| /* |
| * Copyright 2026 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkBitmap.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkRect.h" |
| #include "include/private/SkLog.h" |
| #include "include/utils/SkLogHandler.h" |
| |
| #include <iostream> |
| #include <mutex> |
| #include <string> |
| #include <vector> |
| |
| class LogAccumulator : public SkLogHandler { |
| public: |
| struct LogEntry { |
| SkLogPriority priority; |
| std::string message; |
| }; |
| |
| void onLog(SkLogPriority priority, const char format[], va_list args) override { |
| char buffer[1024]; |
| int written = vsnprintf(buffer, sizeof(buffer), format, args); |
| if (written < 0) { |
| return; |
| } |
| std::lock_guard<std::mutex> lock(fMutex); |
| fLogs.push_back({priority, buffer}); |
| fCounter++; |
| } |
| |
| int getCount() const { |
| return fCounter; |
| } |
| |
| std::string getLatest() const { |
| if (fLogs.empty()) { |
| return ""; |
| } |
| return fLogs.back().message; |
| } |
| |
| std::string dumpLogs(SkLogPriority minimumLevel = SkLogPriority::kDebug) const { |
| std::string output; |
| for (const auto& entry : fLogs) { |
| // Lower integer value means higher priority (kError=0, kDebug=3) |
| if (entry.priority <= minimumLevel) { |
| output += entry.message; |
| if (output.empty() || output.back() != '\n') { |
| output += '\n'; |
| } |
| } |
| } |
| return output; |
| } |
| |
| private: |
| mutable std::mutex fMutex; |
| std::vector<LogEntry> fLogs; |
| int fCounter = 0; |
| }; |
| |
| int main() { |
| // Setup the log accumulator |
| auto accumulator = sk_make_sp<LogAccumulator>(); |
| SkLogHandler::SetInstance(accumulator); |
| |
| std::cout << "--- Starting Skia Operations ---\n"; |
| |
| // Trigger some logs manually using the macros, but this should only be called from Skia. |
| SKIA_LOG_I("Log tester started."); |
| SKIA_LOG_W("This is a warning log."); |
| SKIA_LOG_D("This is a debug log."); |
| |
| // Perform some Skia operations |
| SkBitmap bitmap; |
| bitmap.allocN32Pixels(100, 100); |
| SkCanvas canvas(bitmap); |
| |
| SkPaint paint; |
| paint.setColor(SK_ColorRED); |
| canvas.drawRect(SkRect::MakeWH(50, 50), paint); |
| |
| std::cout << "\n--- Latest Log ---\n"; |
| std::cout << accumulator->getLatest() << std::endl; |
| |
| std::cout << "\n--- All Logs (Level Warning and above) ---\n"; |
| std::cout << accumulator->dumpLogs(SkLogPriority::kWarning); |
| |
| std::cout << "\n--- All Logs (Level Debug and above) ---\n"; |
| std::cout << accumulator->dumpLogs(SkLogPriority::kDebug); |
| |
| return 0; |
| } |