diff --git a/backend_qt4/qzint.cpp b/backend_qt4/qzint.cpp index f4fa90a5..e8a58543 100644 --- a/backend_qt4/qzint.cpp +++ b/backend_qt4/qzint.cpp @@ -16,6 +16,7 @@ #include "qzint.h" #include +#define SSET "0123456789ABCDEF" namespace Zint { @@ -661,6 +662,962 @@ void QZint::render(QPainter & painter, const QRectF & paintRect, AspectRatioMode painter.restore(); } +int QZint::ustrlen(unsigned char data[]) { + /* Local replacement for strlen() with unsigned char strings */ + int i; + for (i=0;data[i];i++); + + return i; +} + +void QZint::to_upper(unsigned char source[]) +{ /* Converts lower case characters to upper case in a string source[] */ + int i; + + for (i = 0; i < ustrlen(source); i++) { + if ((source[i] >= 'a') && (source[i] <= 'z')) { + source [i] = (source[i] - 'a') + 'A'; } + } +} + +int QZint::ctoi(char source) +{ /* Converts a character 0-9 to its equivalent integer value */ + if((source >= '0') && (source <= '9')) + return (source - '0'); + return(source - 'A' + 10); +} + +int QZint::is_stackable(int symbology) { + /* Indicates which symbologies can have row binding */ + if(symbology < BARCODE_PDF417) { return 1; } + if(symbology == BARCODE_CODE128B) { return 1; } + if(symbology == BARCODE_ISBNX) { return 1; } + if(symbology == BARCODE_EAN14) { return 1; } + if(symbology == BARCODE_NVE18) { return 1; } + if(symbology == BARCODE_KOREAPOST) { return 1; } + if(symbology == BARCODE_PLESSEY) { return 1; } + if(symbology == BARCODE_TELEPEN_NUM) { return 1; } + if(symbology == BARCODE_ITF14) { return 1; } + if(symbology == BARCODE_CODE32) { return 1; } + + return 0; +} + +int QZint::is_extendable(int symbology) { + /* Indicates which symbols can have addon */ + if(symbology == BARCODE_EANX) { return 1; } + if(symbology == BARCODE_UPCA) { return 1; } + if(symbology == BARCODE_UPCE) { return 1; } + if(symbology == BARCODE_ISBNX) { return 1; } + if(symbology == BARCODE_UPCA_CC) { return 1; } + if(symbology == BARCODE_UPCE_CC) { return 1; } + if(symbology == BARCODE_EANX_CC) { return 1; } + + return 0; +} + +int QZint::roundup(float input) +{ + float remainder; + int integer_part; + + integer_part = (int)input; + remainder = input - integer_part; + + if(remainder > 0.1) { + integer_part++; + } + + return integer_part; +} + +QString QZint::copy_to_clipboard() +{ + QString clipdata; + clipdata.clear(); + int i, block_width, latch, r, this_row; + float textpos, large_bar_height, preset_height, row_height, row_posn = 0.0; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper; + int textoffset, xoffset, yoffset, textdone, main_width; + char textpart[10], addon[6]; + int large_bar_count, comp_offset; + float addon_text_posn; + float scaler = m_zintSymbol->scale; + float default_text_posn; + + if (m_zintSymbol) + ZBarcode_Delete(m_zintSymbol); + + QString fg_colour_hash = m_fgColor.name(); + QString bg_colour_hash = m_bgColor.name(); + + m_lastError.clear(); + m_zintSymbol = ZBarcode_Create(); + m_zintSymbol->output_options=m_border; + m_zintSymbol->symbology=m_symbol; + m_zintSymbol->height=m_height; + m_zintSymbol->whitespace_width=m_whitespace; + m_zintSymbol->border_width=m_borderWidth; + m_zintSymbol->option_1=m_securityLevel; + m_zintSymbol->input_mode = m_input_mode; + m_zintSymbol->option_2=m_width; + m_zintSymbol->option_3=m_pdf417CodeWords; + m_zintSymbol->scale=m_scale; + QByteArray bstr=m_text.toAscii(); + QByteArray pstr=m_primaryMessage.left(99).toAscii(); + strcpy(m_zintSymbol->primary,pstr.data()); + QByteArray fgcol=fg_colour_hash.right(6).toAscii(); + QByteArray bgcol=bg_colour_hash.right(6).toAscii(); + strcpy(m_zintSymbol->fgcolour,fgcol.data()); + strcpy(m_zintSymbol->bgcolour,bgcol.data()); + int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*)bstr.data()); + if (error > WARN_INVALID_OPTION) { + m_lastError=m_zintSymbol->errtxt; + return clipdata; + } + + row_height=0; + textdone = 0; + main_width = m_zintSymbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + + /* sort out colour options */ + to_upper((unsigned char*)m_zintSymbol->fgcolour); + to_upper((unsigned char*)m_zintSymbol->bgcolour); + + fgred = (16 * ctoi(m_zintSymbol->fgcolour[0])) + ctoi(m_zintSymbol->fgcolour[1]); + fggrn = (16 * ctoi(m_zintSymbol->fgcolour[2])) + ctoi(m_zintSymbol->fgcolour[3]); + fgblu = (16 * ctoi(m_zintSymbol->fgcolour[4])) + ctoi(m_zintSymbol->fgcolour[5]); + bgred = (16 * ctoi(m_zintSymbol->bgcolour[0])) + ctoi(m_zintSymbol->bgcolour[1]); + bggrn = (16 * ctoi(m_zintSymbol->bgcolour[2])) + ctoi(m_zintSymbol->bgcolour[3]); + bgblu = (16 * ctoi(m_zintSymbol->bgcolour[4])) + ctoi(m_zintSymbol->bgcolour[5]); + red_ink = fgred / 256.0; + green_ink = fggrn / 256.0; + blue_ink = fgblu / 256.0; + red_paper = bgred / 256.0; + green_paper = bggrn / 256.0; + blue_paper = bgblu / 256.0; + + if (m_zintSymbol->height == 0) { + m_zintSymbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for(i = 0; i < m_zintSymbol->rows; i++) { + preset_height += m_zintSymbol->row_height[i]; + if(m_zintSymbol->row_height[i] == 0) { + large_bar_count++; + } + } + large_bar_height = (m_zintSymbol->height - preset_height) / large_bar_count; + + if (large_bar_count == 0) { + m_zintSymbol->height = preset_height; + } + + while(!(module_set(m_zintSymbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((m_zintSymbol->symbology == BARCODE_EANX) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) + || (m_zintSymbol->symbology == BARCODE_ISBNX)) { + switch(ustrlen(m_zintSymbol->text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if(m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((m_zintSymbol->symbology == BARCODE_UPCA) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { + if(m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((m_zintSymbol->symbology == BARCODE_UPCE) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { + if(m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if(is_extendable(m_zintSymbol->symbology)) { + for(i = 0; i < ustrlen(m_zintSymbol->text); i++) { + if (latch == 1) { + addon[r] = m_zintSymbol->text[i]; + r++; + } + if (m_zintSymbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if(ustrlen(m_zintSymbol->text) != 0) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = m_zintSymbol->border_width + m_zintSymbol->whitespace_width; + yoffset = m_zintSymbol->border_width; + + /* Start writing the header */ + clipdata += "\n"; + clipdata += "\n"; + if(m_zintSymbol->symbology != BARCODE_MAXICODE) { + clipdata += QString("width + xoffset + xoffset) * scaler)) + .arg(roundup((m_zintSymbol->height + textoffset + yoffset + yoffset) * scaler)); + } else { + clipdata += QString("\n"; + if(ustrlen(m_zintSymbol->text) != 0) { + clipdata += " "; + clipdata += QString((const char *)m_zintSymbol->text); + clipdata += "\n"; + } else { + clipdata += " Zint Generated Symbol\n"; + } + clipdata += " \n"; + clipdata += "\n fgcolour); + clipdata += "\">\n"; + + if(m_zintSymbol->symbology != BARCODE_MAXICODE) { + clipdata += QString(" width + xoffset + xoffset) * scaler)) + .arg(roundup((m_zintSymbol->height + textoffset + yoffset + yoffset) * scaler)); + clipdata += QString((const char *)m_zintSymbol->bgcolour); + clipdata += "\" />\n"; + } else { + clipdata += QString(" bgcolour); + clipdata += "\" />\n"; + } + + if(((m_zintSymbol->output_options & BARCODE_BOX) != 0) || ((m_zintSymbol->output_options & BARCODE_BIND) != 0)) { + default_text_posn = (m_zintSymbol->height + textoffset + m_zintSymbol->border_width + m_zintSymbol->border_width) * scaler; + } else { + default_text_posn = (m_zintSymbol->height + textoffset + m_zintSymbol->border_width) * scaler; + } + + if(m_zintSymbol->symbology == BARCODE_MAXICODE) { + /* Maxicode uses hexagons */ + float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; + + + textoffset = 0.0; + if (((m_zintSymbol->output_options & BARCODE_BOX) != 0) || ((m_zintSymbol->output_options & BARCODE_BIND) != 0)) { + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg((74.0 + xoffset + xoffset) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg((72.0 + m_zintSymbol->border_width) * scaler, 0, 'f', 2) + .arg((74.0 + xoffset + xoffset) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + } + if((m_zintSymbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2) + .arg((72.0 + (2 * m_zintSymbol->border_width)) * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((74.0 + xoffset + xoffset - m_zintSymbol->border_width) * scaler, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2) + .arg((72.0 + (2 * m_zintSymbol->border_width)) * scaler, 0, 'f', 2); + } + clipdata += QString(" fgcolour); + clipdata += "\" />\n"; + clipdata += QString(" bgcolour); + clipdata += "\" />\n"; + clipdata += QString(" fgcolour); + clipdata += "\" />\n"; + clipdata += QString(" bgcolour); + clipdata += "\" />\n"; + clipdata += QString(" fgcolour); + clipdata += "\" />\n"; + clipdata += QString(" bgcolour); + clipdata += "\" />\n"; + for(r = 0; r < m_zintSymbol->rows; r++) { + for(i = 0; i < m_zintSymbol->width; i++) { + if(module_set(r, i)) { + /* Dump a hexagon */ + my = r * 2.135 + 1.43; + ay = my + 1.0 + yoffset; + by = my + 0.5 + yoffset; + cy = my - 0.5 + yoffset; + dy = my - 1.0 + yoffset; + ey = my - 0.5 + yoffset; + fy = my + 0.5 + yoffset; + if(r % 2 == 1) { + mx = (2.46 * i) + 1.23 + 1.23; + } else { + mx = (2.46 * i) + 1.23; + } + ax = mx + xoffset; + bx = mx + 0.86 + xoffset; + cx = mx + 0.86 + xoffset; + dx = mx + xoffset; + ex = mx - 0.86 + xoffset; + fx = mx - 0.86 + xoffset; + clipdata += QString(" \n") + .arg(ax * scaler, 0, 'f', 2) + .arg(ay * scaler, 0, 'f', 2) + .arg(bx * scaler, 0, 'f', 2) + .arg(by * scaler, 0, 'f', 2) + .arg(cx * scaler, 0, 'f', 2) + .arg(cy * scaler, 0, 'f', 2) + .arg(dx * scaler, 0, 'f', 2) + .arg(dy * scaler, 0, 'f', 2) + .arg(ex * scaler, 0, 'f', 2) + .arg(ey * scaler, 0, 'f', 2) + .arg(fx * scaler, 0, 'f', 2) + .arg(fy * scaler, 0, 'f', 2); + } + } + } + } + + if(m_zintSymbol->symbology != BARCODE_MAXICODE) { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + int addon_latch = 0; + + for(r = 0; r < m_zintSymbol->rows; r++) { + this_row = r; + if(m_zintSymbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = m_zintSymbol->row_height[this_row]; + } + row_posn = 0; + for(i = 0; i < r; i++) { + if(m_zintSymbol->row_height[i] == 0) { + row_posn += large_bar_height; + } else { + row_posn += m_zintSymbol->row_height[i]; + } + } + row_posn += yoffset; + + i = 0; + if(module_set(this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_set(this_row, i + block_width) == module_set(this_row, i)); + if((addon_latch == 0) && (r == 0) && (i > main_width)) { + addon_text_posn = 9.0 + m_zintSymbol->border_width; + addon_latch = 1; + } + if(latch == 1) { + /* a bar */ + if(addon_latch == 0) { + clipdata += QString(" \n") + .arg((i + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn * scaler, 0, 'f', 2) + .arg(block_width * scaler, 0, 'f', 2) + .arg(row_height * scaler, 0, 'f', 2); + } else { + clipdata += QString(" \n") + .arg((i + xoffset) * scaler, 0, 'f', 2) + .arg((row_posn + 10.0) * scaler, 0, 'f', 2) + .arg(block_width * scaler, 0, 'f', 2) + .arg((row_height - 5.0) * scaler, 0, 'f', 2); + } + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < m_zintSymbol->width); + } + } + /* That's done the actual data area, everything else is human-friendly */ + + xoffset += comp_offset; + row_posn = (row_posn + large_bar_height) * scaler; + + if ((((m_zintSymbol->symbology == BARCODE_EANX) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) || + (m_zintSymbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch(ustrlen(m_zintSymbol->text)) { + case 8: /* EAN-8 */ + case 11: + case 14: + clipdata += QString(" \n") + .arg((0 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((2 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((32 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((34 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((64 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((66 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + for(i = 0; i < 4; i++) { + textpart[i] = m_zintSymbol->text[i]; + } + textpart[4] = '\0'; + textpos = 17; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 4; i++) { + textpart[i] = m_zintSymbol->text[i + 4]; + } + textpart[4] = '\0'; + textpos = 50; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = m_zintSymbol->width + xoffset - 10; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + case 5: + textpos = m_zintSymbol->width + xoffset - 23; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + clipdata += QString(" \n") + .arg((0 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((2 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((46 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((48 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((92 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((94 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + textpart[0] = m_zintSymbol->text[0]; + textpart[1] = '\0'; + textpos = -7; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 6; i++) { + textpart[i] = m_zintSymbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 6; i++) { + textpart[i] = m_zintSymbol->text[i + 7]; + } + textpart[6] = '\0'; + textpos = 71; + clipdata += QString(" \n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = m_zintSymbol->width + xoffset - 10; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + case 5: + textpos = m_zintSymbol->width + xoffset - 23; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + } + break; + + } + } + + if (((m_zintSymbol->symbology == BARCODE_UPCA) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_set(m_zintSymbol->rows - 1, i + block_width) == module_set(m_zintSymbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + clipdata += QString(" \n") + .arg((i + xoffset - comp_offset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(block_width * scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + clipdata += QString(" \n") + .arg((46 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((48 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_set(m_zintSymbol->rows - 1, i + block_width) == module_set(m_zintSymbol->rows - 1, i)); + if(latch == 1) { + /* a bar */ + clipdata += QString(" \n") + .arg((i + xoffset - comp_offset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(block_width * scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = m_zintSymbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 5; i++) { + textpart[i] = m_zintSymbol->text[i + 1]; + } + textpart[5] = '\0'; + textpos = 27; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 5; i++) { + textpart[i] = m_zintSymbol->text[i + 6]; + } + textpart[6] = '\0'; + textpos = 68; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textpart[0] = m_zintSymbol->text[11]; + textpart[1] = '\0'; + textpos = 100; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = m_zintSymbol->width + xoffset - 10; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + case 5: + textpos = m_zintSymbol->width + xoffset - 23; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + } + + } + + if (((m_zintSymbol->symbology == BARCODE_UPCE) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + clipdata += QString(" \n") + .arg((0 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((2 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((46 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((48 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((50 + xoffset) * scaler, 0, 'f', 2) + .arg(row_posn, 0, 'f', 2) + .arg(scaler, 0, 'f', 2) + .arg(5.0 * scaler, 0, 'f', 2); + textpart[0] = m_zintSymbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + for(i = 0; i < 6; i++) { + textpart[i] = m_zintSymbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textpart[0] = m_zintSymbol->text[7]; + textpart[1] = '\0'; + textpos = 55; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)textpart); + clipdata += "\n \n"; + textdone = 1; + switch(strlen(addon)) { + case 2: + textpos = m_zintSymbol->width + xoffset - 10; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + case 5: + textpos = m_zintSymbol->width + xoffset - 23; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)addon); + clipdata += "\n \n"; + break; + } + + } + + xoffset -= comp_offset; + + switch(m_zintSymbol->symbology) { + case BARCODE_CODABLOCKF: + case BARCODE_HIBC_BLOCKF: + clipdata += QString(" \n") + .arg(xoffset * scaler, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg(m_zintSymbol->width * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg(xoffset * scaler, 0, 'f', 2) + .arg((m_zintSymbol->height + m_zintSymbol->border_width) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->width * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + if(m_zintSymbol->rows > 1) { + /* row binding */ + for(r = 1; r < m_zintSymbol->rows; r++) { + clipdata += QString(" \n") + .arg((xoffset + 11) * scaler, 0, 'f', 2) + .arg(((r * row_height) + yoffset - 1) * scaler, 0, 'f', 2) + .arg((m_zintSymbol->width - 24) * scaler, 0, 'f', 2) + .arg(2.0 * scaler, 0, 'f', 2); + } + } + break; + case BARCODE_MAXICODE: + /* Do nothing! (It's already been done) */ + break; + default: + if((m_zintSymbol->output_options & BARCODE_BIND) != 0) { + if((m_zintSymbol->rows > 1) && (is_stackable(m_zintSymbol->symbology) == 1)) { + /* row binding */ + for(r = 1; r < m_zintSymbol->rows; r++) { + clipdata += QString(" \n") + .arg(xoffset * scaler, 0, 'f', 2) + .arg(((r * row_height) + yoffset - 1) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->width * scaler, 0, 'f', 2) + .arg(2.0 * scaler, 0, 'f', 2); + } + } + } + if (((m_zintSymbol->output_options & BARCODE_BOX) != 0) || ((m_zintSymbol->output_options & BARCODE_BIND) != 0)) { + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg((m_zintSymbol->width + xoffset + xoffset) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg((m_zintSymbol->height + m_zintSymbol->border_width) * scaler, 0, 'f', 2) + .arg((m_zintSymbol->width + xoffset + xoffset) * scaler, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2); + } + if((m_zintSymbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + clipdata += QString(" \n") + .arg(0.0, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2) + .arg((m_zintSymbol->height + (2 * m_zintSymbol->border_width)) * scaler, 0, 'f', 2); + clipdata += QString(" \n") + .arg((m_zintSymbol->width + xoffset + xoffset - m_zintSymbol->border_width) * scaler, 0, 'f', 2) + .arg(0.0, 0, 'f', 2) + .arg(m_zintSymbol->border_width * scaler, 0, 'f', 2) + .arg((m_zintSymbol->height + (2 * m_zintSymbol->border_width)) * scaler, 0, 'f', 2); + } + break; + } + + /* Put the human readable text at the bottom */ + if((textdone == 0) && (ustrlen(m_zintSymbol->text) != 0)) { + textpos = m_zintSymbol->width / 2.0; + clipdata += QString(" fgcolour); + clipdata += "\" >\n "; + clipdata += QString((const char *)m_zintSymbol->text); + clipdata += "\n \n"; + } + clipdata += " \n"; + clipdata += "\n"; + + return clipdata; +} + const QString & QZint::lastError() { return m_lastError; diff --git a/backend_qt4/qzint.h b/backend_qt4/qzint.h index 2eeb7046..724c4ba9 100644 --- a/backend_qt4/qzint.h +++ b/backend_qt4/qzint.h @@ -87,9 +87,16 @@ public: bool hasErrors(); bool save_to_file(QString filename); + QString copy_to_clipboard(); private: void encode(); - int module_set(int y_coords, int x_coords); + int module_set(int y_coord, int x_coord); + void to_upper(unsigned char source[]); + int ustrlen(unsigned char data[]); + int ctoi(char source); + int is_stackable(int symbology); + int is_extendable(int symbology); + int roundup(float input); private: int m_symbol; diff --git a/frontend_qt4/mainWindow.ui b/frontend_qt4/mainWindow.ui index a7628100..b3800c13 100644 --- a/frontend_qt4/mainWindow.ui +++ b/frontend_qt4/mainWindow.ui @@ -6,7 +6,7 @@ 0 0 749 - 741 + 744 @@ -179,7 +179,7 @@ 0 0 727 - 248 + 243 @@ -335,8 +335,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans';"><span style=" font-family:'Sans Serif';">Your Data Here!</span></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:9pt;"><span style=" font-family:'Sans Serif';">Your Data Here!</span></p></body></html> false @@ -568,7 +568,7 @@ p, li { white-space: pre-wrap; } - false + true Copy diff --git a/frontend_qt4/mainwindow.cpp b/frontend_qt4/mainwindow.cpp index d8aacb9a..1ca3ec17 100644 --- a/frontend_qt4/mainwindow.cpp +++ b/frontend_qt4/mainwindow.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "mainwindow.h" #include @@ -125,6 +126,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags fl) connect(btnSave, SIGNAL(clicked( bool )), SLOT(save())); connect(spnScale, SIGNAL(valueChanged( double )), SLOT(change_print_scale())); connect(btnExit, SIGNAL(clicked( bool )), SLOT(quit_now())); + connect(btnCopy, SIGNAL(clicked( bool )), SLOT(copy_to_clipboard())); } MainWindow::~MainWindow() @@ -137,27 +139,6 @@ void MainWindow::scaleRotate() view->scale((double)scaleSlider->value()/100,(double)scaleSlider->value()/100); } -/* -void MainWindow::createActions() -{ - saveAct = new QAction(tr("&Save"), this); - saveAct->setShortcut(tr("Ctrl+S")); - saveAct->setStatusTip(tr("Save the document to disk")); - connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); - aboutQtAct = new QAction(tr("About &Qt"), this); - aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); - connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); -} - - void MainWindow::createMenus() -{ - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(saveAct); - fileMenu->addAction(exitAction); - helpMenu = menuBar()->addMenu(tr("&Help")); - helpMenu->addAction(aboutQtAct); -} */ - bool MainWindow::save() { bool status; @@ -177,6 +158,18 @@ bool MainWindow::save() return status; } +void MainWindow::copy_to_clipboard() +{ + QClipboard *clipboard = QApplication::clipboard(); + QString clip_data_str = m_bc.bc.copy_to_clipboard(); + QByteArray clip_data_ba = clip_data_str.toUtf8(); + QMimeData *clip_data_mime = new QMimeData; + clip_data_mime->setData("image/svg+xml", clip_data_ba); + clipboard->setMimeData(clip_data_mime, QClipboard::Clipboard); + + return; +} + void MainWindow::about() { QMessageBox::about(this, tr("About Zint"), diff --git a/frontend_qt4/mainwindow.h b/frontend_qt4/mainwindow.h index fd7f1177..fe332eaa 100644 --- a/frontend_qt4/mainwindow.h +++ b/frontend_qt4/mainwindow.h @@ -122,7 +122,7 @@ private slots: bool save(); void about(); void quit_now(); - + void copy_to_clipboard(); private: /* void createActions();