Browse Source

Fixed issue where Text would reference internal members of Font, and try to release them.
Release Font in SpriteSample.
Converted tabs to spaces in SpriteSample.

Rcmaniac25 11 years ago
parent
commit
67bd504bd8
3 changed files with 74 additions and 66 deletions
  1. 12 6
      gameplay/src/Text.cpp
  2. 1 0
      gameplay/src/Text.h
  3. 61 60
      samples/browser/src/SpriteSample.cpp

+ 12 - 6
gameplay/src/Text.cpp

@@ -7,7 +7,7 @@ namespace gameplay
 {
   
 Text::Text() :
-    _font(NULL), _text(""), _size(0), _width(0), _height(0), _wrap(true), _rightToLeft(false),
+    _font(NULL), _drawFont(NULL), _text(""), _size(0), _width(0), _height(0), _wrap(true), _rightToLeft(false),
     _align(Font::ALIGN_TOP_LEFT), _clip(Rectangle(0, 0, 0, 0)),
     _opacity(1.0f), _color(Vector4::one())
 {
@@ -15,7 +15,9 @@ Text::Text() :
 
 Text::~Text()
 {
+    // _drawFont is a child of _font, so it should never be released
     SAFE_RELEASE(_font);
+    _drawFont = NULL;
 }
     
 Text& Text::operator=(const Text& text)
@@ -29,21 +31,24 @@ Text* Text::create(const char* fontPath, const char* str, const Vector4& color,
     GP_ASSERT(str);
 
     Font* font = Font::create(fontPath);
+    Font* drawFont;
     
     if (size == 0)
     {
         size = font->_size;
+        drawFont = font;
     }
     else
     {
         // Delegate to closest sized font
-        font = font->findClosestSize(size);
-        size = font->_size;
+        drawFont = font->findClosestSize(size);
+        size = drawFont->_size;
     }
     unsigned int widthOut, heightOut;
     font->measureText(str, size, &widthOut, &heightOut);
     Text* text = new Text();
     text->_font = font;
+    text->_drawFont = drawFont;
     text->_text = str;
     text->_size = size;
     text->_width = (float)widthOut + 1;
@@ -210,6 +215,7 @@ Drawable* Text::clone(NodeCloneContext& context)
     Text* textClone = new Text();
     textClone->_font = _font;
     _font->addRef();
+    textClone->_drawFont = _drawFont;
     textClone->_text = _text;
     textClone->_size = _size;
     textClone->_width = _width;
@@ -258,11 +264,11 @@ unsigned int Text::draw(bool wireframe)
             clipViewport.y += position.y;
         }
     }
-    _font->start();
-    _font->drawText(_text.c_str(), Rectangle(position.x, position.y, _width, _height),
+    _drawFont->start();
+    _drawFont->drawText(_text.c_str(), Rectangle(position.x, position.y, _width, _height),
                     Vector4(_color.x, _color.y, _color.z, _color.w * _opacity), _size,
                     _align, _wrap, _rightToLeft, clipViewport);
-    _font->finish();
+    _drawFont->finish();
     return 1;
 }
     

+ 1 - 0
gameplay/src/Text.h

@@ -254,6 +254,7 @@ protected:
 private:
 
     Font* _font;
+    Font* _drawFont;
     std::string _text;
     unsigned int _size;
     float _width;

+ 61 - 60
samples/browser/src/SpriteSample.cpp

@@ -16,70 +16,71 @@ void SpriteSample::initialize()
     // Create the font for drawing the framerate.
     _font = Font::create("res/ui/arial.gpb");
 
-	// Load sprite scene
-	_scene = Scene::load("res/common/sprites/sprite.scene");
-	_cameraNode = _scene->findNode("camera");
-
-	// Setup the player
-	_playerNode = _scene->findNode("player");
-	_playerSprite = dynamic_cast<Sprite*>(_playerNode->getDrawable());
-
-	// Idle [0] - Set at load time
-	// Walk [1 - 11]
-	_playerSprite->setFrameSource(1, Rectangle( 0, 0, 72, 92));
-	_playerSprite->setFrameSource(2, Rectangle(73, 0, 72, 97));
-	_playerSprite->setFrameSource(3, Rectangle(146, 0, 72, 97));
-	_playerSprite->setFrameSource(4, Rectangle(0, 98, 72, 97));
-	_playerSprite->setFrameSource(5, Rectangle(73, 98, 72, 97));
-	_playerSprite->setFrameSource(6, Rectangle(146, 98, 72, 97));
-	_playerSprite->setFrameSource(7, Rectangle(219, 0, 72, 97));
-	_playerSprite->setFrameSource(8, Rectangle(292, 0, 72, 97));
-	_playerSprite->setFrameSource(9, Rectangle(219, 98, 72, 97));
-	_playerSprite->setFrameSource(10, Rectangle(365, 0, 72, 97));
-	_playerSprite->setFrameSource(11, Rectangle(292, 98, 72, 97));
-	// Jump[12]
-	_playerSprite->setFrameSource(12, Rectangle(438, 93, 67, 94));
-
-	// The player animation clips
-	unsigned int keyTimes[4] = {0, 1, 11, 12};
-	float keyValues[4] =  { 0, 1, 11, 12 };
-	_playerAnimation = _playerSprite->createAnimation("player-animations", Sprite::ANIMATE_KEYFRAME, 4, keyTimes, keyValues, Curve::LINEAR);
-	_playerAnimation->createClip("idle", 0, 0);
-	_playerAnimation->createClip("walk", 1, 11)->setRepeatCount(AnimationClip::REPEAT_INDEFINITE);
-	// Set the speed to 24 FPS
-	_playerAnimation->getClip("walk")->setSpeed(24.0f/1000.0f);
-	_playerAnimation->play("idle");
-
-	// Setup player text
-	Node* playerTextNode = _scene->findNode("text");
-	playerTextNode->addRef();
-	_scene->removeNode(playerTextNode); //XXX This is because SceneLoader doesn't support loading child nodes for other nodes
-	_playerNode->addChild(playerTextNode);
-
-	playerTextNode->translateY(_playerSprite->getHeight());
-	Text* playerText = dynamic_cast<Text*>(playerTextNode->getDrawable());
-	playerText->setJustify(Font::ALIGN_TOP_HCENTER);
-	playerText->setWidth(_playerSprite->getWidth());
-	SAFE_RELEASE(playerTextNode);
-
-	// Custom Effect in sprite
-	Effect* waterEffect = Effect::createFromFile("res/shaders/sprite.vert", "res/common/sprites/water2d.frag");
-	Sprite* waterSprite = Sprite::create("res/common/sprites/water2d.png", getWidth() * 5, getHeight() / 3, waterEffect);
-	SAFE_RELEASE(waterEffect);
-	waterSprite->setAnchor(Vector2::zero());
-	waterSprite->setOpacity(0.5f);
-	_scene->findNode("water")->setDrawable(waterSprite);
-	Material* waterMaterial = waterSprite->getMaterial();
-	SAFE_RELEASE(waterSprite);
-	Texture::Sampler* noiseSampler = Texture::Sampler::create("res/common/sprites/water2d-noise.png");
-	waterMaterial->getParameter("u_texture_noise")->setValue(noiseSampler);
-	SAFE_RELEASE(noiseSampler);
-	waterMaterial->getParameter("u_time")->bindValue(this, &SpriteSample::getTime);
+    // Load sprite scene
+    _scene = Scene::load("res/common/sprites/sprite.scene");
+    _cameraNode = _scene->findNode("camera");
+
+    // Setup the player
+    _playerNode = _scene->findNode("player");
+    _playerSprite = dynamic_cast<Sprite*>(_playerNode->getDrawable());
+
+    // Idle [0] - Set at load time
+    // Walk [1 - 11]
+    _playerSprite->setFrameSource(1, Rectangle( 0, 0, 72, 92));
+    _playerSprite->setFrameSource(2, Rectangle(73, 0, 72, 97));
+    _playerSprite->setFrameSource(3, Rectangle(146, 0, 72, 97));
+    _playerSprite->setFrameSource(4, Rectangle(0, 98, 72, 97));
+    _playerSprite->setFrameSource(5, Rectangle(73, 98, 72, 97));
+    _playerSprite->setFrameSource(6, Rectangle(146, 98, 72, 97));
+    _playerSprite->setFrameSource(7, Rectangle(219, 0, 72, 97));
+    _playerSprite->setFrameSource(8, Rectangle(292, 0, 72, 97));
+    _playerSprite->setFrameSource(9, Rectangle(219, 98, 72, 97));
+    _playerSprite->setFrameSource(10, Rectangle(365, 0, 72, 97));
+    _playerSprite->setFrameSource(11, Rectangle(292, 98, 72, 97));
+    // Jump[12]
+    _playerSprite->setFrameSource(12, Rectangle(438, 93, 67, 94));
+
+    // The player animation clips
+    unsigned int keyTimes[4] = {0, 1, 11, 12};
+    float keyValues[4] =  { 0, 1, 11, 12 };
+    _playerAnimation = _playerSprite->createAnimation("player-animations", Sprite::ANIMATE_KEYFRAME, 4, keyTimes, keyValues, Curve::LINEAR);
+    _playerAnimation->createClip("idle", 0, 0);
+    _playerAnimation->createClip("walk", 1, 11)->setRepeatCount(AnimationClip::REPEAT_INDEFINITE);
+    // Set the speed to 24 FPS
+    _playerAnimation->getClip("walk")->setSpeed(24.0f/1000.0f);
+    _playerAnimation->play("idle");
+
+    // Setup player text
+    Node* playerTextNode = _scene->findNode("text");
+    playerTextNode->addRef();
+    _scene->removeNode(playerTextNode); //XXX This is because SceneLoader doesn't support loading child nodes for other nodes
+    _playerNode->addChild(playerTextNode);
+
+    playerTextNode->translateY(_playerSprite->getHeight());
+    Text* playerText = dynamic_cast<Text*>(playerTextNode->getDrawable());
+    playerText->setJustify(Font::ALIGN_TOP_HCENTER);
+    playerText->setWidth(_playerSprite->getWidth());
+    SAFE_RELEASE(playerTextNode);
+
+    // Custom Effect in sprite
+    Effect* waterEffect = Effect::createFromFile("res/shaders/sprite.vert", "res/common/sprites/water2d.frag");
+    Sprite* waterSprite = Sprite::create("res/common/sprites/water2d.png", getWidth() * 5, getHeight() / 3, waterEffect);
+    SAFE_RELEASE(waterEffect);
+    waterSprite->setAnchor(Vector2::zero());
+    waterSprite->setOpacity(0.5f);
+    _scene->findNode("water")->setDrawable(waterSprite);
+    Material* waterMaterial = waterSprite->getMaterial();
+    SAFE_RELEASE(waterSprite);
+    Texture::Sampler* noiseSampler = Texture::Sampler::create("res/common/sprites/water2d-noise.png");
+    waterMaterial->getParameter("u_texture_noise")->setValue(noiseSampler);
+    SAFE_RELEASE(noiseSampler);
+    waterMaterial->getParameter("u_time")->bindValue(this, &SpriteSample::getTime);
 }
 
 void SpriteSample::finalize()
 {
-	SAFE_RELEASE(_scene);
+    SAFE_RELEASE(_scene);
+    SAFE_RELEASE(_font);
 }
 
 void SpriteSample::update(float elapsedTime)