Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1077)

Unified Diff: runtime/embedders/openglui/common/image_cache.cc

Issue 13042015: Various OpenGLUI changes: (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/embedders/openglui/common/image_cache.cc
===================================================================
--- runtime/embedders/openglui/common/image_cache.cc (revision 0)
+++ runtime/embedders/openglui/common/image_cache.cc (revision 0)
@@ -0,0 +1,99 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "embedders/openglui/common/image_cache.h"
+
+#include <ctype.h>
+#include <string.h>
+#include "core/SkStream.h"
+#include "embedders/openglui/common/canvas_context.h"
+
+ImageCache* ImageCache::instance_ = NULL;
+
+extern CanvasContext* Context2D(int handle);
+
+ImageCache::ImageCache(const char* resource_path)
+ : images(), resource_path_(resource_path) {
+}
+
+const SkBitmap* ImageCache::GetImage_(const char* src_url) {
+fprintf(stderr, "ImageCache::GetImage(%s)\n", src_url);
+ if (strncmp(src_url, "context2d://", 12) == 0) {
+ int handle = atoi(src_url + 12);
+ CanvasContext* otherContext = Context2D(handle);
+ return otherContext->GetBitmap();
+ } else if (images.find(src_url) == images.end()) {
+ SkBitmap* bm = Load(src_url);
+ if (bm != NULL) {
+ images[src_url] = bm;
+ }
+ return bm;
+ } else {
+ return images[src_url];
+ }
+}
+
+int ImageCache::GetWidth_(const char* src_url) {
+fprintf(stderr, "ImageCache::GetWidth(%s)\n", src_url);
+ const SkBitmap* image = GetImage(src_url);
+ if (image == NULL) return 0;
+ return image->width();
+}
+
+int ImageCache::GetHeight_(const char* src_url) {
+fprintf(stderr, "ImageCache::GetHeight(%s)\n", src_url);
+ const SkBitmap* image = GetImage(src_url);
+ if (image == NULL) return 0;
+ return image->height();
+}
+
+SkBitmap* ImageCache::Load(const char* src_url) {
+fprintf(stderr, "ImageCache::Load(%s)\n", src_url);
+ SkBitmap *bm = NULL;
+ const char* filepath;
+ if (strncmp(src_url, "file://", 7) == 0) {
+ filepath = src_url + 7;
+ } else {
+ // TODO(gram): We need a way to remap URLs to local file names.
+ // For now I am just using the characters after the last '/'.
+ // Note also that if we want to support URLs and network fetches,
+ // then we introduce more complexity; this can't just be an URL.
+ int pos = strlen(src_url);
+ while (--pos >= 0 && src_url[pos] != '/');
+ filepath = src_url + pos + 1;
+ }
+ char* path;
+ if (filepath[0] == '/') {
+ path = const_cast<char*>(filepath);
+ } else {
+ size_t len1 = strlen(resource_path_);
+ size_t len2 = strlen(filepath);
+ path = new char[len1 + 1 + len2 + 1];
+ strncpy(path, resource_path_, len1+1);
+ strncat(path, "/", 1);
+ strncat(path, filepath, len2);
+ }
+
+ SkFILEStream stream(path);
+ if (stream.isValid()) {
+ // We could use DecodeFile and pass the path, but by creating the
+ // SkStream here we can produce better error log messages.
+ bm = new SkBitmap();
+ if (!SkImageDecoder::DecodeStream(&stream, bm)) {
+ LOGI("Image decode of %s failed", path);
+ return NULL;
+ } else {
+ LOGI("Decode image %s: width=%d,height=%d",
+ path, bm->width(), bm->height());
+ }
+ } else {
+ LOGI("Path %s is invalid", path);
+ }
+
+ if (path != filepath) {
+ delete[] path;
+ }
+ return bm;
+}
+

Powered by Google App Engine
This is Rietveld 408576698