203 lines
7.8 KiB
C++
203 lines
7.8 KiB
C++
/**
|
|
@file JSTextMemoryCanvas.cpp
|
|
@brief
|
|
@author James
|
|
@version 1.0
|
|
@date 2016.3.22
|
|
*/
|
|
#include <algorithm>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <list>
|
|
#include <math.h>
|
|
#include "JSTextMemoryCanvas.h"
|
|
#include "../../JCScriptRuntime.h"
|
|
#include <util/Log.h>
|
|
#include "JSTextBitmapInfo.h"
|
|
#ifdef __APPLE__
|
|
#include "../../IOSFreetype/JCIOSFreeType.h"
|
|
#endif
|
|
#ifdef ANDROID
|
|
#include "../../JCSystemConfig.h"
|
|
#include "../../CToJavaBridge.h"
|
|
#endif
|
|
|
|
namespace laya
|
|
{
|
|
JSTextMemoryCanvas* JSTextMemoryCanvas::ms_pTextMemoryCanvas = NULL;
|
|
ADDJSCLSINFO(JSTextMemoryCanvas, JSObjNode);
|
|
JSTextMemoryCanvas* JSTextMemoryCanvas::getInstance()
|
|
{
|
|
if (!ms_pTextMemoryCanvas)
|
|
{
|
|
ms_pTextMemoryCanvas = new JSTextMemoryCanvas();
|
|
}
|
|
return ms_pTextMemoryCanvas;
|
|
}
|
|
JSTextMemoryCanvas::JSTextMemoryCanvas()
|
|
{
|
|
AdjustAmountOfExternalAllocatedMemory(2048);
|
|
m_pCurrentFontInfo = NULL;
|
|
m_pFontManager = new JCFontManager();
|
|
m_pFreeTypeRender = new JCFreeTypeFontRender();
|
|
#ifdef __APPLE__
|
|
m_pIOSFreeType = new JCIOSFreeType();
|
|
m_pFreeTypeRender->setIOSFTInterface(m_pIOSFreeType);
|
|
#endif
|
|
//bitmapData
|
|
m_kBitmapData.m_nBpp = 32;
|
|
m_kBitmapData.m_nWidth = MAX_LINE_WIDTH;
|
|
m_kBitmapData.m_nHeight = MAX_CHAR_HEIGHT;
|
|
m_kBitmapData.m_nImageType = ImgType_unknow;
|
|
m_kBitmapData.m_nImageID = -1;
|
|
m_kBitmapData.m_pImageData = &(JCFreeTypeFontRender::m_pWordBuff[0]);
|
|
m_fScaleX = 1.0f;
|
|
m_fScaleY = 1.0f;
|
|
}
|
|
JSTextMemoryCanvas::~JSTextMemoryCanvas()
|
|
{
|
|
clearAllData();
|
|
#ifdef __APPLE__
|
|
if (m_pIOSFreeType)
|
|
{
|
|
delete m_pIOSFreeType;
|
|
m_pIOSFreeType = nullptr;
|
|
}
|
|
#endif
|
|
if (m_pFontManager)
|
|
{
|
|
delete m_pFontManager;
|
|
m_pFontManager = NULL;
|
|
}
|
|
if (m_pFreeTypeRender)
|
|
{
|
|
delete m_pFreeTypeRender;
|
|
m_pFreeTypeRender = NULL;
|
|
}
|
|
ms_pTextMemoryCanvas = NULL;
|
|
}
|
|
void JSTextMemoryCanvas::clearAllData()
|
|
{
|
|
m_pFontManager->clearAllData();
|
|
m_pFreeTypeRender->clearCustomFont();
|
|
}
|
|
bool JSTextMemoryCanvas::initFreeTypeDefaultFontFromFile(const char* sDefaultTTFs)
|
|
{
|
|
return m_pFreeTypeRender->initDefaultFont(sDefaultTTFs);
|
|
}
|
|
bool JSTextMemoryCanvas::initFreeTypeDefaultFontFromBuffer(JSValueAsParam pArrayBufferArgs)
|
|
{
|
|
char* pArrayBuffer = NULL;
|
|
int nArrayBufferSize = 0;
|
|
bool bIsArrayBuffer = extractJSAB(pArrayBufferArgs, pArrayBuffer, nArrayBufferSize);
|
|
if (bIsArrayBuffer)
|
|
{
|
|
return m_pFreeTypeRender->initDefaultFont(pArrayBuffer, nArrayBufferSize);
|
|
}
|
|
return false;
|
|
}
|
|
bool JSTextMemoryCanvas::setFontFaceFromUrl(const char* sFontFamily, const char* sTTFFileName)
|
|
{
|
|
return m_pFreeTypeRender->setFontFaceFromUrl(sFontFamily, sTTFFileName);
|
|
}
|
|
bool JSTextMemoryCanvas::setFontFaceFromBuffer(const char* sFontFamily, JSValueAsParam pArrayBufferArgs)
|
|
{
|
|
char* pArrayBuffer = NULL;
|
|
int nArrayBufferSize = 0;
|
|
bool bIsArrayBuffer = extractJSAB(pArrayBufferArgs, pArrayBuffer, nArrayBufferSize);
|
|
if (bIsArrayBuffer)
|
|
{
|
|
return m_pFreeTypeRender->setFontFaceFromBuffer(sFontFamily, pArrayBuffer, nArrayBufferSize);
|
|
}
|
|
return false;
|
|
}
|
|
bool JSTextMemoryCanvas::removeFont(const char* sFontFamily)
|
|
{
|
|
return m_pFreeTypeRender->removeFont(sFontFamily);
|
|
}
|
|
void JSTextMemoryCanvas::setFontInfo(const char* sFontInfo)
|
|
{
|
|
m_sFont = sFontInfo;
|
|
m_pCurrentFontInfo = m_pFontManager->getFontInfoFromText(sFontInfo);
|
|
}
|
|
const char* JSTextMemoryCanvas::getFontInfo()
|
|
{
|
|
return m_sFont.c_str();
|
|
}
|
|
JsValue JSTextMemoryCanvas::getTextBitmapData(const char* sText, int nColor, int nBorderSize, int nBorderColor)
|
|
{
|
|
if (m_pCurrentFontInfo)
|
|
{
|
|
//m_pMeasureTextmanager->measureText(m_pCurrentFontInfo, const_cast<char*>(sText), m_kBitmapData.m_nWidth, m_kBitmapData.m_nHeight);
|
|
m_pFreeTypeRender->getTextLineBitmapData(const_cast<char*>(sText), &m_kBitmapData, nColor, m_pCurrentFontInfo, nBorderSize, nBorderColor, m_fScaleX, m_fScaleY);
|
|
}
|
|
else
|
|
{
|
|
m_kBitmapData.m_nWidth = 1;
|
|
m_kBitmapData.m_nHeight = 1;
|
|
memset(m_kBitmapData.m_pImageData, 0, m_kBitmapData.m_nWidth * m_kBitmapData.m_nHeight * sizeof(int));
|
|
}
|
|
JSTextBitmapInfo* pBitmapInfo = new JSTextBitmapInfo();
|
|
pBitmapInfo->setInfo(m_kBitmapData.m_nWidth, m_kBitmapData.m_nHeight, m_kBitmapData.m_pImageData);
|
|
return JSP_TO_JS(JSTextBitmapInfo, pBitmapInfo);
|
|
}
|
|
JsValue JSTextMemoryCanvas::measureChar(int unicode)
|
|
{
|
|
int width = 0;
|
|
int height = 0;
|
|
#ifdef __APPLE__
|
|
|
|
JSContextRef ctx = laya::__TlsData::GetInstance()->GetCurContext();
|
|
JSObjectRef obj = JSObjectMake(ctx, nullptr, nullptr);
|
|
if (m_pCurrentFontInfo == NULL)
|
|
{
|
|
LOGW("JSMemoryCanvas::measureText 没有设置FontInfo");
|
|
JSObjectSetProperty(ctx, obj, JSStringCreateWithUTF8CString("width"), JSValueMakeNumber(ctx, width), kJSPropertyAttributeNone, nullptr);
|
|
//JSObjectSetProperty(ctx, obj, JSStringCreateWithUTF8CString("height"), JSValueMakeNumber(ctx, height), kJSPropertyAttributeNone, nullptr);
|
|
return obj;
|
|
}
|
|
m_pFreeTypeRender->measureChar(unicode, m_pCurrentFontInfo, width, height);
|
|
JSObjectSetProperty(ctx, obj, JSStringCreateWithUTF8CString("width"), JSValueMakeNumber(ctx, width), kJSPropertyAttributeNone, nullptr);
|
|
//JSObjectSetProperty(ctx, obj, JSStringCreateWithUTF8CString("height"), JSValueMakeNumber(ctx, height), kJSPropertyAttributeNone, nullptr);
|
|
#else
|
|
Isolate* iso = Isolate::GetCurrent();
|
|
Local<Context> context = iso->GetCurrentContext();
|
|
Local<Object> obj = Local<Object>::New(iso, Object::New(iso));
|
|
|
|
if (m_pCurrentFontInfo == NULL)
|
|
{
|
|
LOGW("JSMemoryCanvas::measureText 没有设置FontInfo");
|
|
obj->Set(context, String::NewFromUtf8(iso, "width"), Number::New(iso, 0));
|
|
//obj->Set(context, String::NewFromUtf8(iso, "height"), Number::New(iso, 0));
|
|
return obj;
|
|
}
|
|
m_pFreeTypeRender->measureChar(unicode, m_pCurrentFontInfo, width, height);
|
|
obj->Set(context, String::NewFromUtf8(iso, "width"), Number::New(iso, width));
|
|
//obj->Set(context, String::NewFromUtf8(iso, "height"), Number::New(iso, height));
|
|
#endif
|
|
return obj;
|
|
}
|
|
void JSTextMemoryCanvas::scale(double x, double y)
|
|
{
|
|
m_fScaleX = x;
|
|
m_fScaleY = y;
|
|
}
|
|
void JSTextMemoryCanvas::exportJS()
|
|
{
|
|
JSP_GLOBAL_CLASS("_conchTextCanvas", JSTextMemoryCanvas);
|
|
JSP_ADD_PROPERTY(font, JSTextMemoryCanvas, getFontInfo, setFontInfo);
|
|
JSP_ADD_METHOD("setFontInfo", JSTextMemoryCanvas::setFontInfo);
|
|
//JSP_ADD_METHOD("measureText", JSTextMemoryCanvas::measureText);
|
|
JSP_ADD_METHOD("measureChar", JSTextMemoryCanvas::measureChar);
|
|
JSP_ADD_METHOD("initFreeTypeDefaultFontFromFile", JSTextMemoryCanvas::initFreeTypeDefaultFontFromFile);
|
|
JSP_ADD_METHOD("initFreeTypeDefaultFontFromBuffer", JSTextMemoryCanvas::initFreeTypeDefaultFontFromBuffer);
|
|
JSP_ADD_METHOD("setFontFaceFromUrl", JSTextMemoryCanvas::setFontFaceFromUrl);
|
|
JSP_ADD_METHOD("setFontFaceFromBuffer", JSTextMemoryCanvas::setFontFaceFromBuffer);
|
|
JSP_ADD_METHOD("removeFont", JSTextMemoryCanvas::removeFont);
|
|
JSP_ADD_METHOD("_getTextBitmapData", JSTextMemoryCanvas::getTextBitmapData);
|
|
JSP_ADD_METHOD("scale", JSTextMemoryCanvas::scale);
|
|
JSP_INSTALL_GLOBAL_CLASS("_conchTextCanvas", JSTextMemoryCanvas, this);
|
|
}
|
|
}
|