Files
LayaNative2.0/Conch/source/conch/JSWrapper/LayaWrap/JSTextMemoryCanvas.cpp
T
2020-11-11 16:17:13 +08:00

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);
}
}