Skip to content

Commit

Permalink
Merge branch 'release/1.1.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin Bojko committed Oct 10, 2017
2 parents 331e9e2 + 56178d5 commit 50f9eed
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 112 deletions.
134 changes: 71 additions & 63 deletions src/bluecadet/text/StyledTextLayout.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/*
Based on Cinder's original TextLayout. Modified and exented by Bluecadet.
*/

/*
Copyright (c) 2010, The Barbarian Group
All rights reserved.
Expand Down Expand Up @@ -68,21 +72,22 @@ typedef std::wstring StringType;
typedef wchar_t CharType;

//==================================================
// TextManager Helper
// DeviceContextManager Helper
//
class TextManager : private ci::Noncopyable {

class DeviceContextManager : private ci::Noncopyable {
public:
TextManager() :
DeviceContextManager() :
mDummyDC(::CreateCompatibleDC(0)),
mGraphics(mDummyDC)
{
}
~TextManager() {
~DeviceContextManager() {
::DeleteDC(mDummyDC);
}
static TextManager* instance() {
static TextManager* instance = nullptr;
if (!instance) instance = new TextManager();
static DeviceContextManager * instance() {
static DeviceContextManager* instance = nullptr;
if (!instance) instance = new DeviceContextManager();
return instance;
}
const HDC& getDc() { return mDummyDC; }
Expand All @@ -93,6 +98,7 @@ class TextManager : private ci::Noncopyable {
Gdiplus::Graphics mGraphics;
};


//==================================================
// Run Helper
//
Expand All @@ -102,7 +108,7 @@ typedef shared_ptr<class Run> RunRef;

class Run {
public:
Run(const ci::Font& aFont, const ci::ColorA& aColor) :
Run(const ci::Font & aFont, const ci::ColorA & aColor) :
mFont(aFont),
mColor(aColor),
mHasInvalidExtents(true),
Expand All @@ -120,18 +126,18 @@ class Run {
}
~Run() {};

const ci::vec2& getSize() { calcExtents(); return mSize; };
const StringType& getText() const { return mWideText; }
const ci::ColorA& getColor() const { return mColor; }
const ci::Font& getFont() const { return mFont; }
const Gdiplus::StringFormat& getFormat() const { return mFormat; }
const ci::vec2 & getSize() { calcExtents(); return mSize; };
const StringType & getText() const { return mWideText; }
const ci::ColorA & getColor() const { return mColor; }
const ci::Font & getFont() const { return mFont; }
const Gdiplus::StringFormat & getFormat() const { return mFormat; }

void append(const StringType& text) {
void append(const StringType & text) {
mWideText.append(text);
mHasInvalidExtents = true;
}

void setText(const StringType& text) {
void setText(const StringType & text) {
mWideText = text;
mHasInvalidExtents = true;
}
Expand All @@ -147,7 +153,7 @@ class Run {
mFormat.SetMeasurableCharacterRanges(1, &range);

Gdiplus::RectF sizeRect;
TextManager::instance()->getGraphics().MeasureString(mWideText.c_str(), -1, mFont.getGdiplusFont(), Gdiplus::PointF(0, 0), &mFormat, &sizeRect);
DeviceContextManager::instance()->getGraphics().MeasureString(mWideText.c_str(), -1, mFont.getGdiplusFont(), Gdiplus::PointF(0, 0), &mFormat, &sizeRect);
mSize.x = sizeRect.Width;
mSize.y = sizeRect.Height;
mHasInvalidExtents = false;
Expand All @@ -162,6 +168,7 @@ class Run {
ci::vec2 mSize;
};


//==================================================
// Line Helper
//
Expand All @@ -180,8 +187,8 @@ class Line {
~Line() {}

const ci::vec2& getSize() { calcExtents(); return mSize; }
const vector<RunRef>& getRuns() const { return mRuns; }
const TextAlign getTextAlign() const { return mTextAlign; }
const vector<RunRef> & getRuns() const { return mRuns; }
const TextAlign getTextAlign() const { return mTextAlign; }
float getLeadingOffset() const { return mLeadingOffset; };
bool getLeadingDisabled() const { return mLeadingDisabled; }
float getDescent() { calcExtents(); return mDescent; };
Expand Down Expand Up @@ -249,26 +256,27 @@ class Line {
};



//==================================================
// StyledTextLayout
//

StyledTextLayout::StyledTextLayout() :
mPaddingTop(0.0f),
mPaddingRight(0.0f),
mPaddingBottom(0.0f),
mPaddingLeft(0.0f),
mLayoutMode(WordWrap),
mClipMode(Clip),
mMaxSize(0),
mMaxSize(-1.0f, -1.0f),
mLeadingDisabled(true),
mHasInvalidSize(false),
mHasInvalidLayout(false),
mSizeTrimmingEnabled(false),
mTextSize(0, 0)
{
// force any globals we need to be initialized, particularly GDI+ on Windows
TextManager::instance();
// forces any globals we need to be initialized, particularly GDI+ on Windows
DeviceContextManager::instance();

mCurrentStyle = StyleManager::getInstance()->getDefaultStyle();
mParseOptions = StyledTextParser::getInstance()->getDefaultOptions();
}
Expand All @@ -293,57 +301,57 @@ void StyledTextLayout::clearText() {
}


void StyledTextLayout::setText(const wstring& text) { clearText(); appendText(text); }
void StyledTextLayout::setText(const wstring& text, const string styleName) { clearText(); appendText(text, styleName, true); }
void StyledTextLayout::setText(const wstring& text, const Style& style) { clearText(); appendText(text, style, true); }
void StyledTextLayout::setText(const wstring & text) { clearText(); appendText(text); }
void StyledTextLayout::setText(const wstring & text, const string styleName) { clearText(); appendText(text, styleName, true); }
void StyledTextLayout::setText(const wstring & text, const Style& style) { clearText(); appendText(text, style, true); }

void StyledTextLayout::appendText(const wstring& text) {
void StyledTextLayout::appendText(const wstring & text) {
appendSegments(StyledTextParser::getInstance()->parse(text, mCurrentStyle, mParseOptions));
}
void StyledTextLayout::appendText(const wstring& text, const string& styleName, bool saveAsCurrentStyle) {
void StyledTextLayout::appendText(const wstring & text, const string & styleName, bool saveAsCurrentStyle) {
Style style = StyleManager::getInstance()->getStyle(styleName);
if (saveAsCurrentStyle) setCurrentStyle(style);
appendSegments(StyledTextParser::getInstance()->parse(text, style, mParseOptions));
}
void StyledTextLayout::appendText(const wstring& text, const Style& style, bool saveAsCurrentStyle) {
void StyledTextLayout::appendText(const wstring & text, const Style& style, bool saveAsCurrentStyle) {
if (saveAsCurrentStyle) setCurrentStyle(style);
appendSegments(StyledTextParser::getInstance()->parse(text, style, mParseOptions));
}

void StyledTextLayout::setPlainText(const wstring& text) { clearText(); appendPlainText(text); }
void StyledTextLayout::setPlainText(const wstring& text, const string styleName) { clearText(); appendPlainText(text, styleName); }
void StyledTextLayout::setPlainText(const wstring& text, const Style& style) { clearText(); appendPlainText(text, style); }
void StyledTextLayout::setPlainText(const wstring & text) { clearText(); appendPlainText(text); }
void StyledTextLayout::setPlainText(const wstring & text, const string styleName) { clearText(); appendPlainText(text, styleName); }
void StyledTextLayout::setPlainText(const wstring & text, const Style& style) { clearText(); appendPlainText(text, style); }

void StyledTextLayout::appendPlainText(const wstring& text) {
void StyledTextLayout::appendPlainText(const wstring & text) {
appendSegment(StyledText(mCurrentStyle, text));
}
void StyledTextLayout::appendPlainText(const wstring& text, const string& styleName, bool saveAsCurrentStyle) {
void StyledTextLayout::appendPlainText(const wstring & text, const string & styleName, bool saveAsCurrentStyle) {
Style style = StyleManager::getInstance()->getStyle(styleName);
if (saveAsCurrentStyle) setCurrentStyle(style);
appendSegment(StyledText(style, text));
}
void StyledTextLayout::appendPlainText(const wstring& text, const Style& style, bool saveAsCurrentStyle) {
void StyledTextLayout::appendPlainText(const wstring & text, const Style& style, bool saveAsCurrentStyle) {
if (saveAsCurrentStyle) setCurrentStyle(style);
appendSegment(StyledText(style, text));
}


// std::string helpers to convert to widestring
void StyledTextLayout::setText(const string& text) { setText(wideString(text)); }
void StyledTextLayout::setText(const string& text, const string styleName) { setText(wideString(text), styleName); }
void StyledTextLayout::setText(const string& text, const Style& style) { setText(wideString(text), style); }
void StyledTextLayout::setText(const string & text) { setText(wideString(text)); }
void StyledTextLayout::setText(const string & text, const string styleName) { setText(wideString(text), styleName); }
void StyledTextLayout::setText(const string & text, const Style& style) { setText(wideString(text), style); }

void StyledTextLayout::appendText(const string& text) { appendText(wideString(text)); }
void StyledTextLayout::appendText(const string& text, const string& styleName, bool saveAsCurrentStyle) { appendText(wideString(text), styleName, saveAsCurrentStyle); }
void StyledTextLayout::appendText(const string& text, const Style& style, bool saveAsCurrentStyle) { appendText(wideString(text), style, saveAsCurrentStyle); }
void StyledTextLayout::appendText(const string & text) { appendText(wideString(text)); }
void StyledTextLayout::appendText(const string & text, const string & styleName, bool saveAsCurrentStyle) { appendText(wideString(text), styleName, saveAsCurrentStyle); }
void StyledTextLayout::appendText(const string & text, const Style& style, bool saveAsCurrentStyle) { appendText(wideString(text), style, saveAsCurrentStyle); }

void StyledTextLayout::setPlainText(const string& text) { setPlainText(wideString(text)); }
void StyledTextLayout::setPlainText(const string& text, const string styleName) { setPlainText(wideString(text), styleName); }
void StyledTextLayout::setPlainText(const string& text, const Style& style) { setPlainText(wideString(text), style); }
void StyledTextLayout::setPlainText(const string & text) { setPlainText(wideString(text)); }
void StyledTextLayout::setPlainText(const string & text, const string styleName) { setPlainText(wideString(text), styleName); }
void StyledTextLayout::setPlainText(const string & text, const Style& style) { setPlainText(wideString(text), style); }

void StyledTextLayout::appendPlainText(const string& text) { appendPlainText(wideString(text)); }
void StyledTextLayout::appendPlainText(const string& text, const string& styleName, bool saveAsCurrentStyle) { appendPlainText(wideString(text), styleName, saveAsCurrentStyle); }
void StyledTextLayout::appendPlainText(const string& text, const Style& style, bool saveAsCurrentStyle) { appendPlainText(wideString(text), style, saveAsCurrentStyle); }
void StyledTextLayout::appendPlainText(const string & text) { appendPlainText(wideString(text)); }
void StyledTextLayout::appendPlainText(const string & text, const string & styleName, bool saveAsCurrentStyle) { appendPlainText(wideString(text), styleName, saveAsCurrentStyle); }
void StyledTextLayout::appendPlainText(const string & text, const Style& style, bool saveAsCurrentStyle) { appendPlainText(wideString(text), style, saveAsCurrentStyle); }


//==================================================
Expand All @@ -357,16 +365,16 @@ StyledTextLayout::ClipMode StyledTextLayout::getClipMode() const { return mClipM
void StyledTextLayout::setClipMode(const ClipMode value) { mClipMode = value; invalidate(); }

void StyledTextLayout::setCurrentStyle(Style style) { mCurrentStyle = style; }
void StyledTextLayout::setCurrentStyle(const std::string& styleName) { mCurrentStyle = StyleManager::getInstance()->getStyle(styleName); }
void StyledTextLayout::setCurrentStyle(const std::string & styleName) { mCurrentStyle = StyleManager::getInstance()->getStyle(styleName); }
Style StyledTextLayout::getCurrentStyle() const { return mCurrentStyle; }

void StyledTextLayout::setFontFamily(const string& family, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mFontFamily = family; }); }
void StyledTextLayout::setFontFamily(const string & family, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mFontFamily = family; }); }
void StyledTextLayout::setFontSize(const float fontSize, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mFontSize = fontSize; }); }
void StyledTextLayout::setFontStyle(const FontStyle fontStyle, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mFontStyle = fontStyle; }); }
void StyledTextLayout::setFontWeight(const FontWeight fontWeight, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mFontWeight = fontWeight; }); }

void StyledTextLayout::setTextColor(const ci::Color &color, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mColor = color; }); }
void StyledTextLayout::setTextColor(const ci::ColorA &color, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mColor = color; }); }
void StyledTextLayout::setTextColor(const ci::Color & color, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mColor = color; }); }
void StyledTextLayout::setTextColor(const ci::ColorA & color, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mColor = color; }); }

void StyledTextLayout::setTextAlign(const TextAlign value, bool updateExistingText) { modifyStyles(updateExistingText, [&](Style& s) { s.mTextAlign = value; }); invalidate(); }

Expand All @@ -378,13 +386,13 @@ bool StyledTextLayout::getLeadingDisabled() const { return mLeadingDisabled; }
void StyledTextLayout::setLeadingDisabled(const bool value, bool updateExistingText) { mLeadingDisabled = value; invalidate(); }

const ci::vec2 & StyledTextLayout::getMaxSize() const { return mMaxSize; }
void StyledTextLayout::setMaxSize(const ci::vec2& value) { if (value != mMaxSize) { mMaxSize = value; invalidate(); } }
void StyledTextLayout::setMaxSize(const ci::vec2 & value) { mMaxSize = value; invalidate(); }

float StyledTextLayout::getMaxWidth() const { return mMaxSize.x; }
void StyledTextLayout::setMaxWidth(const float value) { if (value != mMaxSize.x) { mMaxSize.x = value; invalidate(); } }
void StyledTextLayout::setMaxWidth(const float value) { mMaxSize.x = value; invalidate(); }

float StyledTextLayout::getMaxHeight() const { return mMaxSize.y; }
void StyledTextLayout::setMaxHeight(const float value) { if (value != mMaxSize.y) { mMaxSize.y = value; invalidate(); } }
void StyledTextLayout::setMaxHeight(const float value) { mMaxSize.y = value; invalidate(); }

void StyledTextLayout::setPadding(const float vertical, const float horizontal) { mPaddingTop = mPaddingBottom = vertical; mPaddingRight = mPaddingLeft = horizontal; invalidate(); }
void StyledTextLayout::setPadding(const float padding) { mPaddingTop = mPaddingRight = mPaddingBottom = mPaddingLeft = padding; invalidate(); }
Expand All @@ -411,17 +419,17 @@ void StyledTextLayout::setSizeTrimmingEnabled(const bool value) { mSizeTrimmingE
//
const std::vector<StyledText>& StyledTextLayout::getSegments() const { return mSegments; }

void StyledTextLayout::setSegment(const StyledText& segment) { clearText(); appendSegment(segment); }
void StyledTextLayout::setSegments(const std::vector<StyledText>& segments) { clearText(); appendSegments(segments); }
void StyledTextLayout::setSegment(const StyledText & segment) { clearText(); appendSegment(segment); }
void StyledTextLayout::setSegments(const std::vector<StyledText> & segments) { clearText(); appendSegments(segments); }

void StyledTextLayout::appendSegments(const std::vector<StyledText>& segments) {
void StyledTextLayout::appendSegments(const std::vector<StyledText> & segments) {
const auto baseStyle = mCurrentStyle;
for (auto& segment : segments) {
appendSegment(segment);
}
setCurrentStyle(baseStyle); // re-apply base style
}
void StyledTextLayout::appendSegment(const StyledText& segment) {
void StyledTextLayout::appendSegment(const StyledText & segment) {
//setCurrentStyle(segment.mStyle);
mSegments.push_back(segment);

Expand Down Expand Up @@ -521,7 +529,7 @@ void StyledTextLayout::appendSegment(const StyledText& segment) {
mHasInvalidLayout = false; // mark layout as valid
}

shared_ptr<Line> StyledTextLayout::addLine(const Style& style) {
shared_ptr<Line> StyledTextLayout::addLine(const Style & style) {
invalidate(false, true);
shared_ptr<Line> line(new Line(style.mTextAlign, style.mLeadingOffset, mLeadingDisabled));
mLines.push_back(line);
Expand All @@ -546,7 +554,7 @@ ci::Surface StyledTextLayout::renderToSurface(bool useAlpha, bool premultiplied)
ci::ivec2 bitmapSize = getTextSize();

// Odd failure - return a NULL Surface
if (bitmapSize.x <= 0 || bitmapSize.y <= 0) {
if (bitmapSize.x < 0 || bitmapSize.y < 0) {
return result;
}

Expand Down Expand Up @@ -605,10 +613,10 @@ void StyledTextLayout::validateSize() {
return;
}

mTextSize = ci::ivec2(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom);
mTextSize = ci::ivec2(0, 0);

// Make sure padding doesn't exceed max width
if (mMaxSize.x >= 0 && mPaddingLeft + mPaddingRight <= mMaxSize.x) {
if (mMaxSize.x < 0.0f || mPaddingLeft + mPaddingRight <= mMaxSize.x) {

// Determine the extents for all the lines and the result surface
float totalHeight = mPaddingTop + mPaddingBottom;
Expand All @@ -619,7 +627,7 @@ void StyledTextLayout::validateSize() {
totalHeight = max(totalHeight, totalHeight + line->getSize().y + line->getLeadingOffset());
}

if (mMaxSize.x > 0) {
if (mMaxSize.x >= 0.0f) {
if (!mSizeTrimmingEnabled && mClipMode != NoClip) {
totalWidth = mMaxSize.x;
} else if (mClipMode == Clip) {
Expand All @@ -640,7 +648,7 @@ void StyledTextLayout::validateSize() {
mTextSize = ci::ivec2(pixelWidth, pixelHeight);
}

if (mMaxSize.y > 0) {
if (mMaxSize.y >= 0 || mPaddingTop + mPaddingBottom <= mMaxSize.y) {
if (!mSizeTrimmingEnabled && mClipMode != NoClip) {
mTextSize.y = (int)ci::math<float>::ceil(mMaxSize.y);
} else if (mClipMode == Clip) {
Expand Down
Loading

0 comments on commit 50f9eed

Please sign in to comment.