Browse Source

Merge pull request #1708 from rcmaniac25/text_font_fix

Fixed Font reference usage in Text
Sean Taylor 11 years ago
parent
commit
ea059b2180
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() :
 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)),
     _align(Font::ALIGN_TOP_LEFT), _clip(Rectangle(0, 0, 0, 0)),
     _opacity(1.0f), _color(Vector4::one())
     _opacity(1.0f), _color(Vector4::one())
 {
 {
@@ -15,7 +15,9 @@ Text::Text() :
 
 
 Text::~Text()
 Text::~Text()
 {
 {
+    // _drawFont is a child of _font, so it should never be released
     SAFE_RELEASE(_font);
     SAFE_RELEASE(_font);
+    _drawFont = NULL;
 }
 }
     
     
 Text& Text::operator=(const Text& text)
 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);
     GP_ASSERT(str);
 
 
     Font* font = Font::create(fontPath);
     Font* font = Font::create(fontPath);
+    Font* drawFont;
     
     
     if (size == 0)
     if (size == 0)
     {
     {
         size = font->_size;
         size = font->_size;
+        drawFont = font;
     }
     }
     else
     else
     {
     {
         // Delegate to closest sized font
         // Delegate to closest sized font
-        font = font->findClosestSize(size);
-        size = font->_size;
+        drawFont = font->findClosestSize(size);
+        size = drawFont->_size;
     }
     }
     unsigned int widthOut, heightOut;
     unsigned int widthOut, heightOut;
     font->measureText(str, size, &widthOut, &heightOut);
     font->measureText(str, size, &widthOut, &heightOut);
     Text* text = new Text();
     Text* text = new Text();
     text->_font = font;
     text->_font = font;
+    text->_drawFont = drawFont;
     text->_text = str;
     text->_text = str;
     text->_size = size;
     text->_size = size;
     text->_width = (float)widthOut + 1;
     text->_width = (float)widthOut + 1;
@@ -210,6 +215,7 @@ Drawable* Text::clone(NodeCloneContext& context)
     Text* textClone = new Text();
     Text* textClone = new Text();
     textClone->_font = _font;
     textClone->_font = _font;
     _font->addRef();
     _font->addRef();
+    textClone->_drawFont = _drawFont;
     textClone->_text = _text;
     textClone->_text = _text;
     textClone->_size = _size;
     textClone->_size = _size;
     textClone->_width = _width;
     textClone->_width = _width;
@@ -258,11 +264,11 @@ unsigned int Text::draw(bool wireframe)
             clipViewport.y += position.y;
             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,
                     Vector4(_color.x, _color.y, _color.z, _color.w * _opacity), _size,
                     _align, _wrap, _rightToLeft, clipViewport);
                     _align, _wrap, _rightToLeft, clipViewport);
-    _font->finish();
+    _drawFont->finish();
     return 1;
     return 1;
 }
 }
     
     

+ 1 - 0
gameplay/src/Text.h

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

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

@@ -16,70 +16,71 @@ void SpriteSample::initialize()
     // Create the font for drawing the framerate.
     // Create the font for drawing the framerate.
     _font = Font::create("res/ui/arial.gpb");
     _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()
 void SpriteSample::finalize()
 {
 {
-	SAFE_RELEASE(_scene);
+    SAFE_RELEASE(_scene);
+    SAFE_RELEASE(_font);
 }
 }
 
 
 void SpriteSample::update(float elapsedTime)
 void SpriteSample::update(float elapsedTime)