diff --git a/core/include/fxcrt/fx_system.h b/core/include/fxcrt/fx_system.h
index 0021c14..9f43360 100644
--- a/core/include/fxcrt/fx_system.h
+++ b/core/include/fxcrt/fx_system.h
@@ -39,7 +39,7 @@
 #define _FX_W32_		1
 #define _FX_W64_		2
 #ifndef _FX_WORDSIZE_
-#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64
+#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64 || defined(__LP64__)
 #define _FX_WORDSIZE_	_FX_W64_
 #else
 #define _FX_WORDSIZE_	_FX_W32_
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index cafca26..8cd9f2b 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -1036,8 +1036,8 @@
                     for (i = 0; i < m_nStreams; i ++) {
                         FX_DWORD size = m_pStreamArray[i]->GetSize();
                         if (m_Size + size + 1 <= m_Size) {
-							m_Status = Done;
-							return;
+                            m_Status = Done;
+                            return;
                         }
                         m_Size += size + 1;
                     }
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 35b9726..c705ea7 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -2401,7 +2401,7 @@
 {
     CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length"));
     FX_DWORD len = 0;
-    if (pLenObj && (pLenObj->GetType() != PDFOBJ_REFERENCE ||
+    if (pLenObj && ((pLenObj->GetType() != PDFOBJ_REFERENCE) ||
                     ((((CPDF_Reference*)pLenObj)->GetObjList() != NULL) &&
                      ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) {
         FX_FILESIZE pos = m_Pos;
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index 1962432..611804b 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -508,7 +508,7 @@
     }
     CPDF_RenderStatus status;
     status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,
-                      this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, TRUE);
+                      this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, FALSE);
     status.m_curBlend = m_curBlend;
     m_pDevice->SaveState();
     status.RenderObjectList(pFormObj->m_pForm, &matrix);
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index e67b46c..91a3725 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -911,37 +911,33 @@
         }
     }
 }
-
 FX_DWORD CPDF_DIBSource::GetValidBpp() const
 {
     FX_DWORD bpc = m_bpc;
     CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
-    if(pFilter)
-    {
-        if(pFilter->GetType() == PDFOBJ_NAME)
-        {
+    if (pFilter) {
+        if (pFilter->GetType() == PDFOBJ_NAME) {
             CFX_ByteString filter = pFilter->GetString();
-            if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") )
+            if (filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode")) {
                 bpc = 1;
-            if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") )
+            }
+            if (filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode")) {
                 bpc = 8;
+            }
+        } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
+            CPDF_Array *pArray = (CPDF_Array *)pFilter;
+            if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("CCITTFacDecode") ||
+                    pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JBIG2Decode")) {
+                bpc = 1;
+            }
+            if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("RunLengthDecode") ||
+                    pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("DCTDecode")) {
+                bpc = 8;
+            }
         }
-        else if (pFilter->GetType() == PDFOBJ_ARRAY)
-        {
-             CPDF_Array *pArray = (CPDF_Array *) pFilter;
-             if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") ||
-                 pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") )
-                 bpc = 1;
-
-              if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") ||
-                 pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") )
-                 bpc = 8;
-         }
-     }
-
+    }
     return bpc;
 }
-
 #define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);
 void CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const
 {
@@ -969,9 +965,7 @@
             } else {
                 int src_bit_pos = 0;
                 int dest_byte_pos = 0;
-
                 FX_DWORD bpc = GetValidBpp();
-
                 for (int column = 0; column < m_Width; column ++) {
                     int R = _GetBits8(src_scan, src_bit_pos, bpc);
                     src_bit_pos += bpc;
@@ -990,9 +984,9 @@
             }
             return;
         } else if (m_bpc == 8) {
-			if (m_nComponents == m_pColorSpace->CountComponents())
-				m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,
-                                              m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+            if (m_nComponents == m_pColorSpace->CountComponents())
+                m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,
+                                                  m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
             return;
         }
     }
@@ -1027,9 +1021,7 @@
     } else {
         int src_bit_pos = 0;
         int dest_byte_pos = 0;
-        
         FX_DWORD bpc = GetValidBpp();
-
         for (int column = 0; column < m_Width; column ++) {
             for (FX_DWORD color = 0; color < m_nComponents; color ++) {
                 int data = _GetBits8(src_scan, src_bit_pos, bpc);
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index 9bde4be..e8e8ea4 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -419,8 +419,7 @@
     void				LoadPalette();
     FX_BOOL				CreateDecoder();
     void				TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
-	FX_DWORD            GetValidBpp() const;
-
+    FX_DWORD            GetValidBpp() const;
     CPDF_Document*		m_pDocument;
     const CPDF_Stream*	m_pStream;
     CPDF_StreamAcc*		m_pStreamAcc;
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index 0e0d52e..6baf6ad 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -939,12 +939,12 @@
     if (!nHorizontalMask.SetSize(nPageWidth)) {
         return -1;
     }
-	FX_BYTE* pDataH = nHorizontalMask.GetData();
+    FX_BYTE* pDataH = nHorizontalMask.GetData();
     CFX_ByteArray nVerticalMask;
     if (!nVerticalMask.SetSize(nPageHeight)) {
         return -1;
     }
-	FX_BYTE* pDataV = nVerticalMask.GetData();
+    FX_BYTE* pDataV = nVerticalMask.GetData();
     FX_INT32 index = 0;
     FX_FLOAT fLineHeight = 0.0f;
     CPDF_PageObject* pPageObj = NULL;
@@ -961,22 +961,19 @@
         if(PDFPAGE_TEXT != pPageObj->m_Type) {
             continue;
         }
-		FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;
-		FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;
-		FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;
-		FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;
-		if (minH >= maxH || minV >= maxV){
-			continue;
-		}
-
-		FXSYS_memset8(pDataH + minH, 1, maxH - minH);
-		FXSYS_memset8(pDataV + minV, 1, maxV - minV);
-
-		if (fLineHeight <= 0.0f) {
-			fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
-		}
-
-		pPageObj = NULL;
+        FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;
+        FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;
+        FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;
+        FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;
+        if (minH >= maxH || minV >= maxV) {
+            continue;
+        }
+        FXSYS_memset8(pDataH + minH, 1, maxH - minH);
+        FXSYS_memset8(pDataV + minV, 1, maxV - minV);
+        if (fLineHeight <= 0.0f) {
+            fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
+        }
+        pPageObj = NULL;
     }
     FX_INT32 nStartH = 0;
     FX_INT32 nEndH = 0;
diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
index 32cb100..8e77cda 100644
--- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -729,7 +729,9 @@
                     pScanline = pChannel + row * pitch;
                     for (col = 0; col < wid; col++) {
                         pPixel = pScanline + col * image->numcomps;
-						if (!image->comps[channel].data) continue;
+                        if (!image->comps[channel].data) {
+                            continue;
+                        }
                         src = image->comps[channel].data[row * wid + col];
                         src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
                         if (adjust_comps[channel] - 1 < 0) {
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
index 0a64938..c4341ec 100644
--- a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
@@ -190,7 +190,7 @@
 		}
 		n &= 7;
 	} else {
-		for(i = 0; i < n; ++i) {
+		for (i = 0; i < n; ++i) {
 			OPJ_FLOAT32 y = c0[i];
 			OPJ_FLOAT32 u = c1[i];
 			OPJ_FLOAT32 v = c2[i];
@@ -202,7 +202,6 @@
 			c2[i] = b;
 		}
 	}
-	
 #endif
 	for(i = 0; i < n; ++i) {
 		OPJ_FLOAT32 y = c0[i];
diff --git a/core/src/fxcrt/fx_basic_coords.cpp b/core/src/fxcrt/fx_basic_coords.cpp
index f55c267..6206170 100644
--- a/core/src/fxcrt/fx_basic_coords.cpp
+++ b/core/src/fxcrt/fx_basic_coords.cpp
@@ -260,7 +260,12 @@
 }
 void CFX_Matrix::Set(const FX_FLOAT n[6])
 {
-    FXSYS_memcpy32((void*)this, &n, sizeof(CFX_Matrix));
+    this->a = n[0];
+    this->b = n[1];
+    this->c = n[2];
+    this->d = n[3];
+    this->e = n[4];
+    this->f = n[5];
 }
 void CFX_Matrix::SetReverse(const CFX_Matrix &m)
 {
diff --git a/core/src/fxge/android/fpf_skiafontmgr.cpp b/core/src/fxge/android/fpf_skiafontmgr.cpp
index cf93e5b..4380732 100644
--- a/core/src/fxge/android/fpf_skiafontmgr.cpp
+++ b/core/src/fxge/android/fpf_skiafontmgr.cpp
@@ -283,7 +283,7 @@
 {
     FX_DWORD dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset);
     IFPF_Font *pFont = NULL;
-    if (m_FamilyFonts.Lookup((void*)dwHash, (void*&)pFont)) {
+    if (m_FamilyFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) {
         if (pFont) {
             return pFont->Retain();
         }
@@ -355,7 +355,7 @@
         CFPF_SkiaFont *pFont = FX_NEW CFPF_SkiaFont;
         if (pFont) {
             if (pFont->InitFont(this, pFontDes, bsFamilyname, dwStyle, uCharset)) {
-                m_FamilyFonts.SetAt((void*)dwHash, (void*)pFont);
+                m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont);
                 return pFont->Retain();
             }
             pFont->Release();
diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
index 1bbe077..da555de 100644
--- a/core/src/fxge/dib/fx_dib_composite.cpp
+++ b/core/src/fxge/dib/fx_dib_composite.cpp
@@ -3805,7 +3805,6 @@
 {
     int src_Bpp = (m_SrcFormat & 0xff) >> 3;
     int dest_Bpp = (m_DestFormat & 0xff) >> 3;
-    int dest_Size = width * dest_Bpp + 4;
     if (m_bRgbByteOrder) {
         switch (m_Transparency) {
             case 0:
@@ -3886,6 +3885,7 @@
             }
         }
     } else {
+        int dest_Size = width * dest_Bpp + 4;
         if (dest_Size > m_CacheSize) {
             m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
             if (!m_pCacheScanline) {
diff --git a/core/src/fxge/dib/fx_dib_convert.cpp b/core/src/fxge/dib/fx_dib_convert.cpp
index 0120721..2a74452 100644
--- a/core/src/fxge/dib/fx_dib_convert.cpp
+++ b/core/src/fxge/dib/fx_dib_convert.cpp
@@ -452,7 +452,7 @@
                     src_scan += 4;
                 }
             }
-        } else
+        } else {
             for (int row = 0; row < height; row ++) {
                 FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
                 FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
@@ -461,6 +461,7 @@
                     src_scan += Bpp;
                 }
             }
+        }
     }
     return TRUE;
 }
diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
index 9b27a13..7644e39 100644
--- a/core/src/fxge/dib/fx_dib_main.cpp
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -1326,7 +1326,7 @@
                 *scanline ++ = bk + (fk - bk) * gray / 255;
             }
         }
-    } else
+    } else {
         for (int row = 0; row < m_Height; row ++) {
             FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
             int gap = m_bpp / 8 - 2;
@@ -1338,6 +1338,7 @@
                 scanline += gap;
             }
         }
+    }
     return TRUE;
 }
 FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)
diff --git a/core/src/fxge/dib/fx_dib_transform.cpp b/core/src/fxge/dib/fx_dib_transform.cpp
index 80475cb..16d791b 100644
--- a/core/src/fxge/dib/fx_dib_transform.cpp
+++ b/core/src/fxge/dib/fx_dib_transform.cpp
@@ -420,13 +420,13 @@
             }
         } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
             CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
-            int pos_pixel[8];
             for (int row = 0; row < m_ResultHeight; row ++) {
                 FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
                 for (int col = 0; col < m_ResultWidth; col ++) {
                     int src_col_l, src_row_l, res_x, res_y;
                     result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
                     if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+                        int pos_pixel[8];
                         int u_w[4], v_w[4];
                         if (src_col_l == stretch_width) {
                             src_col_l--;
@@ -493,13 +493,13 @@
             }
         } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
             CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
-            int pos_pixel[8];
             for (int row = 0; row < m_ResultHeight; row ++) {
                 FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
                 for (int col = 0; col < m_ResultWidth; col ++) {
                     int src_col_l, src_row_l, res_x, res_y;
                     result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
                     if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+                        int pos_pixel[8];
                         int u_w[4], v_w[4];
                         if (src_col_l == stretch_width) {
                             src_col_l--;
@@ -593,13 +593,13 @@
                 }
             } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
                 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
-                int pos_pixel[8];
                 for (int row = 0; row < m_ResultHeight; row ++) {
                     FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
                     for (int col = 0; col < m_ResultWidth; col ++) {
                         int src_col_l, src_row_l, res_x, res_y;
                         result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
                         if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+                            int pos_pixel[8];
                             int u_w[4], v_w[4];
                             if (src_col_l == stretch_width) {
                                 src_col_l--;
@@ -706,13 +706,13 @@
                 }
             } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
                 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
-                int pos_pixel[8];
                 for (int row = 0; row < m_ResultHeight; row ++) {
                     FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
                     for (int col = 0; col < m_ResultWidth; col ++) {
                         int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
                         result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
                         if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+                            int pos_pixel[8];
                             int u_w[4], v_w[4];
                             if (src_col_l == stretch_width) {
                                 src_col_l--;
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
index c1eeec2..479d912 100644
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
@@ -328,7 +328,6 @@
     FT_Error  lastError = FT_Err_Ok;
 
     FT_Vector  translation;
-	int refCount = 0;
 
 #if 0
     FT_Vector  advancePoint;
@@ -355,7 +354,7 @@
     /* winding order only affects darkening */
     needWinding = font->darkened;
 
-    while ( refCount++ < 1024)
+    while ( 1 )
     {
       /* reset output buffer */
       cf2_outline_reset( &font->outline );
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
index 4311d10..7f82b24 100644
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
@@ -143,6 +143,7 @@
     /* downcast the object pointer */
     CF2_Outline   outline = (CF2_Outline)callbacks;
     CFF_Builder*  builder;
+	FT_Error	  error;
 
 
     FT_ASSERT( outline && outline->decoder );
@@ -154,15 +155,18 @@
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      cff_builder_start_point( builder,
+		error = cff_builder_start_point(builder,
                                params->pt0.x,
                                params->pt0.y );
+		if (callbacks && callbacks->error) *callbacks->error = error;
+		if (error) return;
     }
 
     /* `cff_builder_add_point1' includes a check_points call for one point */
-    cff_builder_add_point1( builder,
+	error = cff_builder_add_point1(builder,
                             params->pt1.x,
                             params->pt1.y );
+	if (callbacks && callbacks->error) *callbacks->error = error;
   }
 
 
@@ -173,6 +177,7 @@
     /* downcast the object pointer */
     CF2_Outline   outline = (CF2_Outline)callbacks;
     CFF_Builder*  builder;
+	FT_Error	  error;
 
 
     FT_ASSERT( outline && outline->decoder );
@@ -184,13 +189,17 @@
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      cff_builder_start_point( builder,
+      error = cff_builder_start_point( builder,
                                params->pt0.x,
                                params->pt0.y );
+	  if (callbacks && callbacks->error) *callbacks->error = error;
+	  if (error) return;
     }
 
     /* prepare room for 3 points: 2 off-curve, 1 on-curve */
-    cff_check_points( builder, 3 );
+    error = cff_check_points( builder, 3 );
+	if (callbacks && callbacks->error) *callbacks->error = error;
+	if (error) return;
 
     cff_builder_add_point( builder,
                            params->pt1.x,
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
index e0755b4..7092629 100644
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
@@ -1585,6 +1585,7 @@
     {
       /* emit offset 1st point as MoveTo */
       cf2_glyphpath_pushMove( glyphpath, P0 );
+	  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;
 
       glyphpath->moveIsPending = FALSE;  /* adjust state machine */
       glyphpath->pathIsOpen    = TRUE;
@@ -1601,6 +1602,7 @@
                                   &P0,
                                   P1,
                                   FALSE );
+	  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;
     }
 
     /* queue the current element with offset points */
@@ -1671,6 +1673,7 @@
     {
       /* emit offset 1st point as MoveTo */
       cf2_glyphpath_pushMove( glyphpath, P0 );
+	  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;
 
       glyphpath->moveIsPending = FALSE;
       glyphpath->pathIsOpen    = TRUE;
@@ -1687,6 +1690,7 @@
                                   &P0,
                                   P1,
                                   FALSE );
+	  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;
     }
 
     /* queue the current element with offset points */
@@ -1723,6 +1727,7 @@
       cf2_glyphpath_lineTo( glyphpath,
                             glyphpath->start.x,
                             glyphpath->start.y );
+	  if (glyphpath->callbacks && glyphpath->callbacks->error && *glyphpath->callbacks->error) return;
 
       /* Draw previous element (the explicit LineTo we just created,      */
       /* above) and connect it to the start point, but with the offset we */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
index 12f5dd7..fc11100 100644
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
@@ -464,9 +464,6 @@
     CF2_HintMaskRec   hintMask;
     CF2_GlyphPathRec  glyphPath;
 
-	int refCount = 0;
-
-
     /* initialize the remaining objects */
     cf2_arrstack_init( &subrStack,
                        memory,
@@ -551,7 +548,7 @@
       goto exit;
 
     /* main interpreter loop */
-    while ( refCount++ < 10240 )
+    while ( 1 )
     {
       if ( cf2_buf_isEnd( charstring ) )
       {
@@ -646,6 +643,7 @@
         curY += cf2_stack_popFixed( opStack );
 
         cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+		if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
         break;
 
@@ -663,6 +661,7 @@
             curY += cf2_stack_getReal( opStack, index + 1 );
 
             cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
           }
 
           cf2_stack_clear( opStack );
@@ -693,6 +692,7 @@
             isX = !isX;
 
             cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
           }
 
           cf2_stack_clear( opStack );
@@ -720,6 +720,7 @@
 
 
             cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
             curX   = x3;
             curY   = y3;
@@ -732,6 +733,7 @@
             curY += cf2_stack_getReal( opStack, index + 1 );
 
             cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
           }
 
           cf2_stack_clear( opStack );
@@ -1225,6 +1227,7 @@
         curX += cf2_stack_popFixed( opStack );
 
         cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+		if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
         break;
 
@@ -1243,6 +1246,7 @@
         curX += cf2_stack_popFixed( opStack );
 
         cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+		if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
         break;
 
@@ -1260,6 +1264,7 @@
             curY += cf2_stack_getReal( opStack, index + 1 );
 
             cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
             index += 2;
           }
 
@@ -1274,6 +1279,7 @@
 
 
             cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
             curX   = x3;
             curY   = y3;
@@ -1313,6 +1319,7 @@
             y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
 
             cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
             curX   = x3;
             curY   = y3;
@@ -1352,6 +1359,7 @@
             y3 = y2;
 
             cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
             curX   = x3;
             curY   = y3;
@@ -1418,6 +1426,7 @@
             }
 
             cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+			if (glyphPath.callbacks && glyphPath.callbacks->error && *glyphPath.callbacks->error) goto exit;
 
             curX   = x3;
             curY   = y3;
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
index 5928862..2e2ea9a 100644
--- a/core/src/fxge/win32/fx_win32_device.cpp
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -1156,6 +1156,11 @@
     } else {
         device_class = FXDC_DISPLAY;
     }
+#ifndef _FPDFAPI_MINI_
+    if (device_class == FXDC_PRINTER) {
+        return FX_NEW CGdiPrinterDriver(hDC);
+    }
+#endif
     return FX_NEW CGdiDisplayDriver(hDC);
 }
 CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
